Come posso ottenere grep
per visualizzare il nome file prima delle righe corrispondenti nel suo output?Visualizza nome file prima della corrispondenza riga (grep)
risposta
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
Sì, ha funzionato. Per favore, dimmi qual è il significato dell'aggiunta di '/ dev/null' in questo comando? – Vivek
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
utilizzando/dev/null è un trucco intelligente, ma penso che il suggerimento sotto il flag -H sia una risposta migliore. – JohnQ
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.
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.
O semplicemente usando find' find ./path_pattern/to_files -type f -name "file * .log" -exec grep -Hn pattern {} \; ' – Martin
grep 'search this' *.txt
ha funzionato per me per cercare tra tutti i file .txt (inserire il proprio valore di ricerca, ovviamente).
Nessun trucco necessario.
grep --with-filename 'pattern' file
Con i numeri di riga:
grep -n --with-filename 'pattern' file
Funziona solo in GNU 'grep', giusto? – codeforester
@codeforester Non conosco nessun altro 'grep's, quindi non lo so. –
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
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")
pls informi il grep versione 'grep --version' – Kent
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
buona domanda ma 'Os versione' è un esempio di confusione nome file – HaveAGuess