Ich habe sehr lange Protokolldateien. Kann man grep bitten, nur die ersten 10 Zeilen zu durchsuchen?
Ich habe sehr lange Protokolldateien. Kann man grep bitten, nur die ersten 10 Zeilen zu durchsuchen?
Antworten:
Die Magie der Pfeifen;
head -10 log.txt | grep <whatever>
head log.txt | grep <whatever>
-l
Option von grep verwenden ? Ich möchte alle Dateien auflisten, deren erste 5 Zeichen sind RIFFD
.
Für Leute, die dies 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
Der FNR..nextfile
Vorgang 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
FNR=1
wird nur 1. Zeile suchen. Vielen Dank!
find ./path -type -f -exec awk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' '{}' +
-type f
Oder verwenden Sie awk
fü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 ( -n
bedeutet, dass die Eingabe nicht gedruckt wird, was ansonsten die Standardeinstellung ist) und wird direkt nach der 10. Zeile beendet.
awk '{ if ( NR <= 10 ) { if(index($0,"ab") > 0) { print $0; } } else { exit; } }' textfile
-- schneller.
awk '{ if ( NR <= 10 ) { if( $0 ~ "YOUR_REGEXP") { print } } else { exit; } }' textfile
tut.
awkish
. 2xifs
und 1xelse
in einem Befehl, der keine Aktionsanweisung benötigt, würde aho machen. weinberger und kernighan weinen ...
Sie haben einige Optionen mit Programmen zusammen mit grep
. Das einfachste ist meiner Meinung nach zu verwenden head
:
head -n10 filename | grep ...
head
gibt die ersten 10 Zeilen aus (mit der -n
Option), und dann können Sie diese Ausgabe an weiterleiten grep
.
head
verwendet haben -n 10
(mich eingeschlossen ) nicht , dass die Realisierung head
von Standard - Displays nur 10 Zeilen . :)
grep "pattern" <(head -n 10 filename)
Sie können die folgende Zeile verwenden:
head -n 10 /path/to/file | grep [...]
Die Ausgabe von head -10 file
kann weitergeleitet werden, grep
um dies zu erreichen:
head -10 file | grep …
Verwenden von Perl:
perl -ne 'last if $. > 10; print if /pattern/' file
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.
-C 2
werde ich das Gleiche tun wie-A 2 -B 2
grep -m6 "string" cov.txt
Dies durchsucht nur die ersten 6 Zeilen nach string
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 head
mit 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)
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.
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.
head
folgendesomeCmd | head -10