Kann ich nur die ersten n Zeilen einer Datei erfassen?

126

Ich habe sehr lange Protokolldateien. Kann man grep bitten, nur die ersten 10 Zeilen zu durchsuchen?

David LeBauer
quelle

Antworten:

175

Die Magie der Pfeifen;

head -10 log.txt | grep <whatever>
Joachim Isaksson
quelle
13
Sie können auch einen beliebigen Stream an headfolgende someCmd | head -10
Stuart Nelson
1
Head druckt standardmäßig die ersten 10 Zeilen auf die Standardausgabe, daher gilt dies für 10 Zeilenhead log.txt | grep <whatever>
Zlemini
5
Gibt es eine Möglichkeit, dies zu tun, wenn Sie die -lOption von grep verwenden ? Ich möchte alle Dateien auflisten, deren erste 5 Zeichen sind RIFFD.
James M. Lay
49

Für Leute, die dies bei Google finden, musste ich die ersten nZeilen mehrerer Dateien durchsuchen , aber nur die passenden Dateinamen drucken. ich benutzte

 gawk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' filenames

Der FNR..nextfileVorgang beendet die Verarbeitung einer Datei, sobald 10 Zeilen angezeigt wurden. Der //..{}druckt den Dateinamen und fährt fort, wenn die erste Übereinstimmung in einer bestimmten Datei angezeigt wird. Verwenden Sie, um die Dateinamen zugunsten anderer Programme zu zitieren

 gawk 'FNR>10 {nextfile} /pattern/ { print "\"" FILENAME "\"" ; nextfile }' filenames
cxw
quelle
9
Ich war einer von denen, die das bei Google gefunden haben. Vielen Dank!
Floris
Für mich druckte dieser Code den vollständigen Pfad der Datei aus. Welches ist genau das, was ich brauchte. Auch FNR=1wird nur 1. Zeile suchen. Vielen Dank!
Brian W
2
Um dies rekursiv über ein Verzeichnis zu tun:find ./path -type -f -exec awk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' '{}' +
OrangeDog
1
Danke @OrangeDog. Eine leichte Korrektur: sollte sein-type f
David Siegal
26

Oder verwenden Sie awkfür einen einzelnen Prozess ohne |:

awk '/your_regexp/ && NR < 11' INPUTFILE

Wenn in jeder Zeile your_regexpÜbereinstimmungen vorliegen und die Anzahl der Datensätze (Zeilen) weniger als 11 beträgt, wird die Standardaktion ausgeführt (die die Eingabezeile druckt).

Oder verwenden Sie sed:

sed -n '/your_regexp/p;10q' INPUTFILE 

Überprüft Ihren regulären Ausdruck und druckt die Zeile ( -nbedeutet, dass die Eingabe nicht gedruckt wird, was ansonsten die Standardeinstellung ist) und wird direkt nach der 10. Zeile beendet.

Zsolt Botykai
quelle
1
Warum nicht am 10. aufhören? (siehe sed Lösung)
Potong
awk '{ if ( NR <= 10 ) { if(index($0,"ab") > 0) { print $0; } } else { exit; } }' textfile-- schneller.
1
@potong du hast recht, korrigiert. @srikanthradix, obwohl es schneller sein kann, sucht Ihre Lösung nicht nach regulären Ausdrücken, sondern nur nach festen Zeichenfolgen. awk '{ if ( NR <= 10 ) { if( $0 ~ "YOUR_REGEXP") { print } } else { exit; } }' textfiletut.
Zsolt Botykai
4
Plus der Stil ist nicht awkish. 2xifsund 1xelsein einem Befehl, der keine Aktionsanweisung benötigt, würde aho machen. weinberger und kernighan weinen ...
jaypal singh
1
Ich denke, anstelle von NR wäre es besser, FNR zu verwenden, denn wenn Sie awk mit mehreren Dateien verwenden, beginnt FNR für jede Datei bei 0.
Vladyslav Savchenko
9

Sie haben einige Optionen mit Programmen zusammen mit grep. Das einfachste ist meiner Meinung nach zu verwenden head:

head -n10 filename | grep ...

headgibt die ersten 10 Zeilen aus (mit der -nOption), und dann können Sie diese Ausgabe an weiterleiten grep.

Dan Fego
quelle
6
Ich war gar nicht bewusst, alle Lösungen hier mit headverwendet haben -n 10 (mich eingeschlossen ) nicht , dass die Realisierung headvon Standard - Displays nur 10 Zeilen . :)
Jaypal Singh
4
grep "pattern" <(head -n 10 filename)
jaypal singh
quelle
3

Sie können die folgende Zeile verwenden:

head -n 10 /path/to/file | grep [...]
Gustavo Straube
quelle
3

Die Ausgabe von head -10 filekann weitergeleitet werden, grepum dies zu erreichen:

head -10 file | grep 

Verwenden von Perl:

perl -ne 'last if $. > 10; print if /pattern/' file
Alan Haggai Alavi
quelle
3
head -10 log.txt | grep -A 2 -B 2 pattern_to_search

-A 2: Drucken Sie zwei Zeilen vor dem Muster.

-B 2: Drucken Sie zwei Zeilen nach dem Muster.

head -10 log.txt # read the first 10 lines of the file.
Vins
quelle
1
Wenn ich mich erinnere, -C 2werde ich das Gleiche tun wie-A 2 -B 2
David LeBauer
3
grep -m6 "string" cov.txt

Dies durchsucht nur die ersten 6 Zeilen nach string

Dileepa Chandima
quelle
3
Nein, dies gibt Ihnen die ersten 6 Vorkommen von "Zeichenfolge" in der gesamten cov.txt-Datei
Franzisk
2

Eine Erweiterung auf Joachim Isaksson Antwort: Oft muss ich etwas aus der Mitte einer langen Datei, zB Linien 5001-5020, in diesem Fall können Sie kombinieren headmit tail:

head -5020 file.txt | tail -20 | grep x

Dies erhält die ersten 5020 Zeilen, zeigt dann nur die letzten 20 davon an und leitet dann alles an grep weiter.

(Bearbeitet: Zaunpfostenfehler in meinen Beispielnummern, Pipe zu Grep hinzugefügt)

RoG
quelle
1

grep -A 10 <Muster>

Dies dient dazu, das Muster und die nächsten 10 Zeilen nach dem Muster zu erfassen. Dies würde nur für ein bekanntes Muster gut funktionieren, wenn Sie kein bekanntes Muster haben, verwenden Sie die "Kopf" -Vorschläge.

Schneedecke
quelle
1
Obwohl es richtig sein könnte. Fügen Sie eine weitere Beschreibung der Frage hinzu, um die Antwort umfassender zu gestalten.
Pramod S. Nikam
3
Dies beantwortet eine völlig andere Frage und ist in diesem Zusammenhang nicht sinnvoll.
Pre101
-1

Ich hatte ein ähnliches Problem und alle oben genannten Probleme lösen es nicht vollständig. Ich bin auch daran interessiert, den Dateinamen mit den passenden Zeilen zu erhalten. Meine Lösung:

ls |parallel --gnu 'cat <(echo {}) <(head {})|grep -B1 -m1 -P "^>.*F3$"'

NB: Das Muster in meinem Fall stimmt immer mit der ersten Zeile überein.

Shokrof
quelle