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?
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
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.
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
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.
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")
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' *
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).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