Ho file di log molto lunghi, è possibile chiedere a grep di cercare solo le prime 10 righe?
Ho file di log molto lunghi, è possibile chiedere a grep di cercare solo le prime 10 righe?
Risposte:
La magia delle pipe;
head -10 log.txt | grep <whatever>
head log.txt | grep <whatever>
-l
opzione di grep ? Vorrei elencare tutti i file che sono i primi 5 caratteri RIFFD
.
Per le persone che lo trovano su Google, avevo bisogno di cercare le prime n
righe di più file, ma per stampare solo i nomi di file corrispondenti. ero solito
gawk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' filenames
L' FNR..nextfile
interrompe l'elaborazione di un file una volta che sono state visualizzate 10 righe. Il //..{}
stampa il nome del file e va avanti ogni volta che viene visualizzata la prima corrispondenza in un dato file. Per citare i nomi dei file a vantaggio di altri programmi, utilizzare
gawk 'FNR>10 {nextfile} /pattern/ { print "\"" FILENAME "\"" ; nextfile }' filenames
FNR=1
cercherà solo la prima riga. Grazie!
find ./path -type -f -exec awk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' '{}' +
-type f
Oppure utilizzare awk
per un singolo processo senza |
:
awk '/your_regexp/ && NR < 11' INPUTFILE
Su ogni riga, se your_regexp
corrisponde e il numero di record (righe) è inferiore a 11, esegue l'azione predefinita (che è stampare la riga di input).
Oppure usa sed
:
sed -n '/your_regexp/p;10q' INPUTFILE
Controlla la tua regexp e stampa la riga ( -n
significa non stampare l'input, che è altrimenti l'impostazione predefinita), e si chiude subito dopo la decima riga.
awk '{ if ( NR <= 10 ) { if(index($0,"ab") > 0) { print $0; } } else { exit; } }' textfile
-- Più veloce.
awk '{ if ( NR <= 10 ) { if( $0 ~ "YOUR_REGEXP") { print } } else { exit; } }' textfile
lo fa.
awkish
. 2xifs
e 1xelse
in un comando che non necessita di alcuna dichiarazione di azione farebbe aho. weinberger e kernighan piangono ...
Hai alcune opzioni che utilizzano programmi insieme a grep
. Il più semplice secondo me è usare head
:
head -n10 filename | grep ...
head
produrrà le prime 10 righe (usando l' -n
opzione), quindi puoi reindirizzare quell'output a grep
.
head
hanno utilizzato -n 10
(me compreso) non rendendomi conto che head
di default visualizza solo 10 righe . :)
grep "pattern" <(head -n 10 filename)
Puoi usare la seguente riga:
head -n 10 /path/to/file | grep [...]
L'output di head -10 file
può essere reindirizzato per ottenere grep
ciò:
head -10 file | grep …
Utilizzando Perl:
perl -ne 'last if $. > 10; print if /pattern/' file
head -10 log.txt | grep -A 2 -B 2 pattern_to_search
-A 2
: stampa due righe prima del motivo.
-B 2
: stampa due righe dopo il motivo.
head -10 log.txt # read the first 10 lines of the file.
-C 2
farà lo stesso di-A 2 -B 2
grep -m6 "string" cov.txt
Questo cerca solo le prime 6 righe per string
Un'estensione alla risposta di Joachim Isaksson: molto spesso ho bisogno di qualcosa dalla metà di un file lungo, ad esempio le righe da 5001 a 5020, nel qual caso puoi combinare head
con tail
:
head -5020 file.txt | tail -20 | grep x
Questo ottiene le prime 5020 righe, quindi mostra solo le ultime 20 di quelle, quindi convoglia tutto in grep.
(Modificato: errore fencepost nei miei numeri di esempio, aggiunta pipe a grep)
grep -A 10 <Pattern>
Questo per afferrare il modello e le successive 10 linee dopo il modello. Questo funzionerebbe bene solo per un pattern noto, se non si dispone di un pattern noto utilizzare i suggerimenti "head".
Ho avuto un problema simile e tutto il problema di cui sopra non lo risolve del tutto. Sono anche interessato a ottenere il nome del file contenente le righe corrispondenti. La mia soluzione:
ls |parallel --gnu 'cat <(echo {}) <(head {})|grep -B1 -m1 -P "^>.*F3$"'
NB: Il Pattern nel mio caso corrisponde sempre alla prima riga.
head
:someCmd | head -10