Wyświetla nazwę pliku przed pasującym wierszem (grep)

Jak mogę uzyskać grep, aby wyświetlić nazwę pliku przed pasującymi liniami w jego wyjściu?

 204
Author: MD XF, 2013-03-15

7 answers

Wypróbuj tę małą sztuczkę, aby nakłonić grep do myślenia, że ma do czynienia z wieloma plikami, aby wyświetlić nazwę pliku:

grep 'pattern' file /dev/null

Aby uzyskać również numer linii:

grep -n 'pattern' file /dev/null
 334
Author: Scrutinizer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-18 18:10:42

Jeśli masz dostępne opcje -H i -n (man grep jest twoim przyjacielem):

$ cat file
foo
bar
foobar

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

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

Opcje:

- H, --with-filename

Wypisuje nazwę pliku dla każdego dopasowania. Jest to domyślne, gdy jest więcej niż jeden plik do Szukaj.

- n, --line-number

Przedrostek każdej linii wyjścia z numerem linii 1 w jej plik wejściowy. (- N jest określony przez POSIX.)

-H może być rozszerzenie GNU, ale -n jest określone przez POSIX.

 223
Author: Chris Seymour,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-18 08:53:07

Żadna sztuczka nie jest konieczna.

grep --with-filename 'pattern' file

Z numerami linii:

grep -n --with-filename 'pattern' file
 26
Author: MD XF,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-24 22:42:04

Co powiesz na to, co udało mi się osiągnąć, częściowo dzięki temu postowi.

Chcesz znaleźć kilka plików, powiedzmy logi o różnych nazwach, ale z wzorami (np. filename=logfile.DATE), wewnątrz kilku katalogów z wzorami (np. /logsapp1, /logsapp2). Każdy plik ma wzorzec, który chcesz grep (np. "init time"), i chcesz mieć "init time" KAŻDEGO pliku, ale wiedząc, do którego pliku należy.

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

Wtedy outputfilename.txt będzie coś w rodzaju

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

W ogólne

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

Wyjaśnienie:

find polecenie przeszukuje nazwy plików według wzorca

Następnie pipe xargs -I{} przekieruje wyjście find do {}

Które będą danymi wejściowymi dla grep ""pattern" {}

Następnie sztuczka, aby grep wyświetlać nazwy plików \dev\null

I na koniec zapisz wyjście w pliku za pomocą tee outputfile.txt

To działało dla mnie w grep wersji 9.0.5 build 1989.

 4
Author: Juan Jose Castellanos Lopez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-18 17:59:57

Jest to niewielka modyfikacja z poprzedniego rozwiązania. Mój przykład szuka przekierowania stderr w skryptach bash: grep '2>' $(find . -name "*.bash")

 1
Author: Richard Jessop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-18 17:59:35

Myślę, że to łatwiejsze niż inne odpowiedzi

grep 'pattern' *
 0
Author: user0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-10 21:15:35
grep 'search this' *.txt
/ Align = "center" bgcolor = "# e0ffe0 " / cesarz chin / / align = center / pliki txt (oczywiście wpisz własną wartość wyszukiwania).
 -3
Author: MagicMojo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-28 23:58:31