grep -вывести имя файла, который grep в данный момент ищет в

Включите xtrace глобально:

> set -x; a a.mp3 a.m4 ; set +x

или включите xtrace для функций, затем выполните его:

> typeset -tf a   # turns on xtrace for function a and below
> a a.mp3 a.m4

> typeset -Tf a   # turns on xtrace for function a only
> a a.mp3 a.m4
2
27.10.2020, 00:44
3 ответа

Это можно сделать в определенный момент времени с помощью lsof,даже на уже работающем -grep, хотя он не будет постоянно печатать файлы по мере их поступления.

Сначала получите PID запущенного grepпроцесса:

$ pgrep -l grep
21531 grep

Затем перечислите все открытые файлы этого процесса:

$ lsof -p 21531
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
grep    21531 izkata  cwd    DIR  253,1     4096 22020097 /var
grep    21531 izkata  rtd    DIR  253,1     4096        2 /
grep    21531 izkata  txt    REG  253,1   219456 22544390 /bin/grep
grep    21531 izkata  mem    REG  253,1  3004224 11805539 /usr/lib/locale/locale-archive
grep    21531 izkata  mem    REG  253,1   144976 29104688 /lib/x86_64-linux-gnu/libpthread-2.27.so
grep    21531 izkata  mem    REG  253,1  2030544 29104673 /lib/x86_64-linux-gnu/libc-2.27.so
grep    21531 izkata  mem    REG  253,1    14560 29104676 /lib/x86_64-linux-gnu/libdl-2.27.so
grep    21531 izkata  mem    REG  253,1   464824 29103098 /lib/x86_64-linux-gnu/libpcre.so.3.13.3
grep    21531 izkata  mem    REG  253,1   170960 29104669 /lib/x86_64-linux-gnu/ld-2.27.so
grep    21531 izkata  mem    REG  253,1    26376 12064533 /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
grep    21531 izkata    0u   CHR  136,8      0t0       11 /dev/pts/8
grep    21531 izkata    1u   CHR  136,8      0t0       11 /dev/pts/8
grep    21531 izkata    2u   CHR  136,8      0t0       11 /dev/pts/8
grep    21531 izkata    3r   DIR  253,1     4096 22020408 /var/lib
grep    21531 izkata    4r   REG  253,1    35765 22156714 /var/lib/dpkg/info/systemd.md5sums
grep    21531 izkata    5r   DIR  253,1     4096 22020692 /var/lib/dpkg
grep    21531 izkata    6r   DIR  253,1   471040 22021003 /var/lib/dpkg/info

В основном это просто то, что grepнужно запустить, но последние 4 строки являются каталогами, а файл grepв данный момент читается(/var/lib/dpkg/info/systemd.md5sumsв этом примере ).

2
18.03.2021, 22:54

Перед началом поиска необходимо вызвать отдельные grepпроцессы вместе с печатью имени файла. Конечно, это будет медленнее, но в вашем случае, так как grepимеет крошечное время начальной загрузки, это не будет вас беспокоить по сравнению с текущей ситуацией.

Использование find и exec:

find. -type f -exec sh -c 'printf "checking: %s\n" "$1"; grep pattern "$1"' sh {} \;

Или найти и массово выполнить, чтобы вызвать одну оболочку для цикла

find. -type f -exec sh -c 'for f do printf "checking: %s\n" "$f"; grep pattern "$f"; done' sh {} +

Или используя find и xargs, с нулевым разделением GNU для файловых аргументов:

find. -type f -print0 | xargs -0 sh -c 'for f do printf "checking: %s\n" "$f"; grep pattern "$f"; done'

Кстати, как я вижу, вы используете macOS, рассмотрите возможность установки программного обеспечения GNU для grep, sed, awk и т. д.

5
18.03.2021, 22:54

С zsh(, который, как я понимаю, теперь является интерактивной оболочкой по умолчанию в macOS ), вы можете сделать:

for f (**/*(ND-.)) (set -x; grep pattern $f)

(где set -x, сокращение от set -o xtrace, выводит команду, которая выполняется на stderr, как и во всех оболочках POSIX, а **/*(ND-.)рекурсивно ищет все обычные файлы после разрешения символической ссылки, включая скрытые ).

С GNU или FreeBSD xargs(, надеюсь, и с macOS ), вы могли бы сделать что-то подобное с:

find. -type f -print0 | xargs -0tn1 grep pattern

(, где опция -tэквивалентнаxtrace)

Это не рассматривает символические ссылки на обычные файлы, хотя (GNU findимеет -xtype fдля этого, но не FreeBSD ). Независимо от того, просматривает ли grep -rсимволические ссылки на обычные файлы, зависит от реализации и версии grep, вы можете дважды проверить -со своей.

Они запускают по одному grepна файл, поэтому они менее эффективны, чем grep -r.

Другим подходом может быть использование трассировщика системных вызовов, такого как strace/ truss/ dtruss/ tuscили аналогичный в вашей macOS, и отслеживание open()или openat()или любого другого системного вызова. grepиспользуется для открытия файлов.

В GNU/Linux,это было бы:

strace -e open,openat grep -r pattern.

Я не знаю, что будет эквивалентно в macOS.

3
18.03.2021, 22:54

Теги

Похожие вопросы