2013-03-15 12 views
175

Come posso ottenere grep per visualizzare il nome file prima delle righe corrispondenti nel suo output?Visualizza nome file prima della corrispondenza riga (grep)

+2

pls informi il grep versione 'grep --version' – Kent

+3

Kent,' grep --version' è che il comando da utilizzare per conoscere la versione grep? Se è così, non funziona. Impossibile trovare altri comandi per conoscere la versione di grep. – Vivek

+2

buona domanda ma 'Os versione' è un esempio di confusione nome file – HaveAGuess

risposta

284

provare questo piccolo trucco per convincere grep a pensare che si occupa di più file, in modo da visualizzare il nome del file:

grep 'pattern' file /dev/null 

Per ottenere anche il numero della linea:

grep -n 'pattern' file /dev/null 
+3

Sì, ha funzionato. Per favore, dimmi qual è il significato dell'aggiunta di '/ dev/null' in questo comando? – Vivek

+30

Se 'grep' viene fornito con più nomi di file, visualizzerà automaticamente i nomi dei file prima della corrispondenza, ma lascerà il nome del file in caso di un singolo file di input. Usando '/ dev/null' come un file di input in più' grep' "pensa che si tratti di più file, ma/dev/null è ovviamente vuoto, quindi non verrà visualizzato nell'elenco di corrispondenze .. – Scrutinizer

+23

utilizzando/dev/null è un trucco intelligente, ma penso che il suggerimento sotto il flag -H sia una risposta migliore. – JohnQ

188

Se avere le opzioni -H e -n disponibili (man grep è il tuo amico):

$ cat file 
foo 
bar 
foobar 

$ grep -H foo file 
file:foo 
file:foobar 

$ grep -Hn foo file 
file:1:foo 
file:3:foobar 

Opzioni:

-H, --with-filename

Stampa il nome del file per ogni partita. Questa è l'impostazione predefinita quando c'è più di un file nella ricerca .

-n, --line numero

con prefisso uscita con il numero di riga 1-base all'interno del suo file ingresso. (-n è specificato da POSIX.)

-H potrebbe essere un'estensione GNU ma -n è specificato da POSIX.

+2

No, '-H' non è supportato qui. – Vivek

+1

Supportato ma dà sempre grep: file: nessun file o directory – pal4life

+2

funziona su ubuntu -H e -n. Probabilmente con tutte le versioni più recenti di * nix – tgkprog

4

Che ne dici di questo, che sono riuscito a ottenere grazie, in parte, a questo post.

Si desidera trovare diversi file, diciamo registri con nomi diversi ma un modello (ad esempio filename=logfile.DATE), all'interno di più directory con un motivo (ad esempio /logsapp1, /logsapp2). Ogni file ha uno schema che si desidera grep (ad esempio "init time") e si desidera avere lo "init time" di ciascun file, ma conoscendo a quale file appartiene.

find ./logsapp* -name logfile* | xargs -I{} grep "init time" {} \dev\null | tee outputfilename.txt 

Poi il outputfilename.txt sarebbe qualcosa di simile

./logsapp1/logfile.22102015: init time: 10ms 
./logsapp1/logfile.21102015: init time: 15ms 
./logsapp2/logfile.21102015: init time: 17ms 
./logsapp2/logfile.22102015: init time: 11ms 

In generale

find ./path_pattern/to_files* -name filename_pattern* | xargs -I{} grep "grep_pattern" {} \dev\null | tee outfilename.txt 

Spiegazione:

find comando cercherà i nomi dei file in base al modello

poi, tubo xargs -I{} devierà la find output al {}

che sarà l'input per grep ""pattern" {}

Poi il trucco per rendere grep visualizzazione dei nomi \dev\null

e, infine, scrivere l'output in file con tee outputfile.txt

Questo ha funzionato per me nella versione grep versione 9.0.5 1989.

+2

O semplicemente usando find' find ./path_pattern/to_files -type f -name "file * .log" -exec grep -Hn pattern {} \; ' – Martin

-3
grep 'search this' *.txt 

ha funzionato per me per cercare tra tutti i file .txt (inserire il proprio valore di ricerca, ovviamente).

17

Nessun trucco necessario.

grep --with-filename 'pattern' file 

Con i numeri di riga:

grep -n --with-filename 'pattern' file 
+2

Funziona solo in GNU 'grep', giusto? – codeforester

+2

@codeforester Non conosco nessun altro 'grep's, quindi non lo so. –

+2

Fantastico! questo ha funzionato per Linux. se usi mac, puoi installare coreutils con brew. E ricorda di aggiungere PATH = "/ usr/local/opt/coreutils/libexec/gnubin: $ PATH" al tuo .bashrc – zw963

0

Questa è una lieve modifica da una precedente soluzione. Il mio esempio si presenta per il reindirizzamento stderr in script bash: grep '2>' $(find . -name "*.bash")

Problemi correlati