Збільшити смугу ходу за допомогою ПВ (переглядача труб)


11

У мене є величезний каталог на моєму комп’ютері, і мені потрібно шукати рядок у кожному рубіновому файлі всередині.

Я міг би зробити це так: grep -R "string" *.rbале це займає дуже багато часу, і я хотів би використовувати pv (переглядач труб), щоб показати панель прогресу, щоб можна було стежити за grepпрогресом.

Але я не знаю, як я можу написати цю команду, тому що все ще є речі, які я просто не можу зрозуміти щодо цієї команди.

Хтось має якусь ідею?

Відповіді:


15

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

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

Відверто кажучи, здається, що більше роботи, ніж варто. Просто запустіть греп, терпляче чекайте і розбирайтеся з результатами, коли це буде зроблено.


1
Це, безумовно, можливо , це просто перекрученість і, ймовірно, знадобиться більше часу, щоб зібратись і працювати, ніж просто чекати, коли
греп

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як thinice запропонував.


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"можливість перегляду всіх ФД іншого процесу.

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

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

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

Таким чином ви можете відстежувати хід грипу.


0

Ви вже пробували

grep -R "string" *.rb | pv

Я не знаю, чи справді це працює, тому що він не знає, скільки біт загальної інформації для пошуку, оскільки це рекурсивний?


4
Я не думаю , що це буде робити те , що він хоче - pvбуде працювати на виході Grep (так що навіть якщо він зазначений повний розмір вхідного pvтільки бачить вихід виходить кінець труби - це буде шлях під - облік байтів.
voretaq7

0

Зазвичай я використовую proc-файлову систему в системах Linux, тобто

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

У цьому списку перераховані всі файли, які в даний час відкрито grep-invocation, і таким чином створюється враження, де в пошуку він знаходиться зараз.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.