Pasek postępu Grep za pomocą pv (przeglądarka potoków)

11

Mam ogromny katalog na swoim komputerze i muszę wyszukać w każdym pliku ruby ​​ciąg znaków.

Mógłbym to zrobić w ten sposób: grep -R "string" *.rbale trwa to naprawdę długo i chciałbym użyć pv (podglądu rur), aby pokazać pasek postępu, aby móc monitorować greppostęp.

Ale tak naprawdę nie wiem, jak napisać to polecenie, ponieważ wciąż jest kilka rzeczy, których po prostu nie rozumiem na temat tego polecenia.

Czy ktoś ma jakiś pomysł?

Cydonia 7
źródło

Odpowiedzi:

15

pvdziała na potokach (nie komendach) - Jest to miernik objętości pokazujący, ile danych minęło dany punkt w potoku.
Twoje polecenie grep nie jest potokiem ( |- pipe operatornigdzie nie można go znaleźć) - to tylko jedno polecenie, które działa. pvnic ci tu nie pomoże, musisz tylko zaufać, że greptak naprawdę działa na wszystkich plikach wejściowych.

Państwo mogłoby kostka coś razem z find, PV, xargs i grep ( find . -name "*.rb" | pv | xargs grep [regex]wygląda na to może być obiecujące, ale trzeba by powiedzieć pv, jak duża findmoc jest na to, aby dać miarodajne wyniki.

Szczerze mówiąc, wydaje się, że to więcej pracy niż jest warte. Po prostu uruchom grep, poczekaj cierpliwie i poradz sobie z danymi wyjściowymi, gdy skończą .

voretaq7
źródło
1
Jest to na pewno możliwe , jest po prostu skomplikowane i prawdopodobnie zajmie więcej czasu, zanim zaczną działać, niż czekanie na grep :-)
voretaq7
1
To może być naprawdę fajny fragment: p
Cydonia7
4

Dwie kolejne metody:

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

Lub, w innej powłoce, podczas gdy oryginalne polecenie jest uruchomione, znajdź pid polecenia grep, a następnie:

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

Oba powyższe pokażą, nad którym plikiem aktualnie pracuje polecenie grep. Możesz znaleźć łączną liczbę plików za pomocą:

ls -l *.rb | wc -l

Na koniec użyj tego, aby dowiedzieć się, jaki numer znajduje się na liście:

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

PS Moje odpowiedzi zakładają, że wszystkie twoje pliki są w jednym katalogu. Jeśli nie są, będziesz musiał użyć findzamiast lsi *.rbjak sugeruje cienkość.

Ladadadada
źródło
1
To fajna alternatywa
Cydonia7,
1

Nie jestem pewien, jakiego systemu operacyjnego używasz, ale grep -R "string" *.extmoże nie działać poprawnie.

Możesz być lepiej obsługiwany findw połączeniu z grep:

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

cienki lód
źródło
Tak, polecenie, które wydałem, faktycznie działa na Fedorze 16, ale twoje jest bardziej przejrzyste. Dziękuję Ci !
Cydonia7
1

W najnowszych wersjach pvistnieje "-d"możliwość oglądania wszystkich FD innego procesu.

Teoretycznie pvbędzie więc działał nie tylko jako rura, ale także jako wskaźnik postępu dla całego procesu. (Na przykład spróbuj z PID przeglądarki Firefox)

W przypadku powyższego problemu prostszym pomysłem jest: Podczas grepdziałania użyj lsofrazem z watch.

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

W ten sposób możesz monitorować postęp swojego grep.

Jan Walzer
źródło
0

Już próbowałeś

grep -R "string" *.rb | pv

Nie wiem, czy to faktycznie działa, ponieważ nie wie, ile bitów danych do przeszukania, ponieważ jest rekurencyjne?

nhutto
źródło
4
Nie sądzę, że zrobi to, co chce - pvbędzie działał na wyjściu grep (więc nawet jeśli określił pełny rozmiar wejścia, pvwidzi tylko wyjście wychodzące z końca potoku - Byłoby to znacznie poniżej -liczanie bajtów
voretaq7
0

Zwykle używam systemu plików proc w systemach Linux, tj

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

Wyświetla listę wszystkich plików, które aktualnie otwarte jest wywołanie grep, a tym samym daje wrażenie, gdzie aktualnie jest wyszukiwane.

centyczne
źródło