Grep индикатор выполнения с помощью PV (труба просмотра)

11

У меня есть огромный каталог на моем компьютере, и мне нужно искать строку в каждом рубиновом файле внутри.

Я мог бы сделать это так: grep -R "string" *.rbно это занимает очень много времени, и я хотел бы использовать pv (pipe viewer), чтобы показать индикатор выполнения, чтобы иметь возможность отслеживать grepпрогресс.

Но я действительно не знаю, как я могу написать эту команду, потому что есть некоторые вещи, которые я просто не могу понять об этой команде.

У кого-нибудь есть идеи?

Cydonia7
источник

Ответы:

15

pvработает на каналах (не на командах) - это индикатор объема, показывающий, сколько данных прошло заданную точку в конвейере.
Ваша команда grep - это не конвейер ( |- его pipe operatorнигде нет) - это всего лишь одна команда, которая делает свое дело. pvздесь вам ничего не поделаешь, просто нужно верить, что grepна самом деле делает свое дело во всех входных файлах.

Вы могли бы что-то сделать вместе с find, pv, xargs & grep ( find . -name "*.rb" | pv | xargs grep [regex]похоже, это может быть многообещающе, но вам нужно будет сказать, pvнасколько велика его findвыдача, чтобы дать значимые результаты.

Честно говоря, это кажется больше работы, чем стоит. Просто запустите ваш grep, терпеливо ждите и разберитесь с выводом, когда это будет сделано.

voretaq7
источник
1
Это определенно возможно , это просто замысловато и, вероятно, потребуется больше времени, чтобы собрать и начать работать, чем просто ждать окончания работы grep :-)
voretaq7
1
Может быть действительно хороший фрагмент: p
Cydonia7
4

Еще два метода:

for file in *.rb; do echo $file; grep "string" $file >> output.txt; done

Или в другой оболочке во время выполнения исходной команды найдите pid команды grep и затем:

strace -q -s 256 -e trace=open -p [pid] 2>&1 | head

Оба вышеперечисленных покажут вам, над каким файлом работает команда grep. Вы можете найти общее количество файлов с:

ls -l *.rb | wc -l

Наконец, используйте это, чтобы выяснить, какой номер текущий файл в списке:

ls -l *.rb | grep -n [the current filename]

PS Мои ответы предполагают, что все ваши файлы находятся в одном каталоге. Если это не так, вам придется использовать findвместо lsи, *.rbкак предложено.

Ladadadada
источник
1
Это хорошая альтернатива
Cydonia7
1

Я не уверен, какую операционную систему вы используете, но, grep -R "string" *.extвозможно, не работает правильно для вас.

Вы могли бы лучше использовать, используя findв сочетании с grep:

find . -type f -name "*.rb" -print0 |xargs --null grep "string"

тонкий лед
источник
Да, команда, которую я дал, на самом деле работает на Fedora 16, но ваша более понятна. Спасибо !
Cydonia7
1

В последних версиях pvесть "-d"опция просмотра всех FD другого процесса.

Таким образом, в теории pvбудет работать не только как труба, но и как индикатор прогресса для всего процесса. (Например, попробуйте это с PID вашего Firefox)

Для описанной выше проблемы более простая идея заключается в следующем: во время grepработы используйте lsofвместе с watch.

$ watch -n 1 "lsof | grep -n $PWD"

Таким образом, вы можете отслеживать прогресс вашего grep.

Ян Вальцер
источник
0

Ты уже пробовал

grep -R "string" *.rb | pv

Я не знаю, работает ли это на самом деле, потому что он не знает, сколько битов общих данных искать, потому что это рекурсивно?

nhutto
источник
4
Я не думаю , что это будет делать то , что он хочет - pvбудет работать на выходе Grep (так что даже если он указан полный размер входного pvтолько видит выход выходит конец трубы - это будет путь под -счет байтов.
voretaq7
0

Я обычно использую proc-файловую систему в системах Linux, т.е.

ls -al /proc/<pid of grep>/fd

В этом списке перечислены все файлы, открытые в данный момент с помощью grep-invocation, и, таким образом, создается впечатление о том, где в поиске он находится в данный момент.

centic
источник