bash zwischen Kann ich nur die ersten n Zeilen einer Datei grepen?




sed zeile ersetzen (9)

Ich habe sehr lange Log-Dateien, ist es möglich, Grep nur die ersten 10 Zeilen zu suchen?


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

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

Die Datei FNR..nextfile die Verarbeitung einer Datei, sobald 10 Zeilen FNR..nextfile wurden. Der //..{} den Dateinamen aus und bewegt sich weiter, wenn die erste Übereinstimmung in einer bestimmten Datei angezeigt wird. Um die Dateinamen für andere Programme zu zitieren, verwenden Sie

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

grep "pattern" <(head -n 10 filename)

Sie können die folgende Zeile verwenden:

head -n 10 /path/to/file | grep [...]

Sie haben ein paar Optionen mit Programmen zusammen mit grep . Die einfachste ist meiner Meinung nach, head zu benutzen:

head -n10 filename | grep ...

head gibt die ersten 10 Zeilen aus (mit der Option -n ), und dann können Sie diese Ausgabe nach grep .


grep -A 10 <Muster>

Dies ist, um das Muster und die nächsten 10 Zeilen nach dem Muster zu greifen. Dies funktioniert nur gut für ein bekanntes Muster, wenn Sie kein bekanntes Muster verwenden, verwenden Sie die "Kopf" Vorschläge.


Eine Erweiterung zu Joachim Isakssons Antwort: Oft brauche ich etwas aus der Mitte einer langen Datei, zB Zeilen 5001 bis 5020, in welchem ​​Fall head mit tail kombiniert werden kann:

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

Dies bekommt die ersten 5020 Zeilen, zeigt dann nur die letzten 20 davon an, dann pumpt alles zu grep.

(Bearbeitet: fencepost Fehler in meinen Beispielzahlen, hinzugefügtes Rohr zu grep)


Oder verwende awk für einen einzelnen Prozess ohne | :

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

Wenn in jeder Zeile your_regexp übereinstimmt und die Anzahl der Datensätze (Zeilen) kleiner als 11 ist, wird die Standardaktion ausgeführt (die die Eingabezeile druckt).

Oder benutze sed :

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

Überprüft Ihre Regexp und druckt die Zeile aus ( -n bedeutet, dass die Eingabe nicht gedruckt wird, die ansonsten die Standardeinstellung ist) und gleich nach der zehnten Zeile beendet wird.


Die Ausgabe der head -10 file kann an grep werden, um dies zu erreichen:

head -10 file | grep …

Perl verwenden:

perl -ne 'last if $. > 10; print if /pattern/' file

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 stimmt in meinem Fall immer mit der ersten Zeile überein.





grep