policzyć liczbę linii na wyjściu terminalowym

264

nie mogłem tego znaleźć na SO. Uruchomiłem następujące polecenie w terminalu:

>> grep -Rl "curl" ./

i wyświetla listę plików, w których występuje zwijanie się słowa kluczowego. Chcę policzyć liczbę plików. Pierwszy sposób, jaki mogę wymyślić, to policzyć liczbę linii na wyjściu, które przyszły w terminalu. Jak mogę to zrobić?

roopunk
źródło
40
Sam grep ma także -cflagę, która po prostu zwraca liczbę
EaterOfCode
Powiązane: unix.stackexchange.com/questions/248245/…
AlikElzin-kilaka

Odpowiedzi:

475

Prześlij wynik za wcpomocą przełącznika -l( liczba wierszy ):

grep -Rl "curl" ./ | wc -l
João Silva
źródło
1
Używam, grep "" -cale to jest o wiele ładniejsze :)
ninhenzo64
3
Należy zauważyć, że ta sztuczka polegająca na potokowaniu do wc będzie działać dla każdego wyjścia, nie tylko wyjścia grep. Na przykład można go połączyć z git diff.
Jason L.,
1
Dlaczego jest to akceptowana odpowiedź? Jak wspomniano w niektórych komentarzach, grep -cnależy użyć funkcji wbudowanej zamiast przesyłać dane wyjściowe do innego programu. Np. Nie zmieniłbyś nawet znaków w dokumencie Word za pomocą innego edytora tekstu niż Word, prawda?
Michael P
57

Umieszczając tutaj komentarz EaterOfCode jako odpowiedź.

Sam grep ma również flagę -c, która po prostu zwraca liczbę

Tak więc polecenie i dane wyjściowe mogą wyglądać następująco.

$ grep -Rl "curl" ./ -c
24

EDYTOWAĆ:

Chociaż ta odpowiedź może być krótsza, a zatem może wydawać się lepsza niż odpowiedź zaakceptowana (która jest używana wc). Nie zgadzam się już z tym. Pamiętam, że pamiętanie, że można liczyć wiersze za pomocą pipingu, wc -ljest o wiele bardziej przydatne, ponieważ można go używać z innymi programami niż greprównież.

JelteF
źródło
5

Rurowanie do „wc” mogłoby być lepsze JEŚLI ostatnia linia kończy się nową linią (wiem, że w tym przypadku tak się stanie)
Jednak jeśli ostatnia linia nie kończy się nową linią, „wc -l” zwraca fałszywy wynik.

Na przykład:

$ echo "asd" | wc -l

Wróci 1i

$ echo -n "asd" | wc -l

Wróci 0


Więc często używam grep <anything> -c

$ echo "asd" | grep "^.*$" -c
1

$ echo -n "asd" | grep "^.*$" -c
1

Jest to bliższe rzeczywistości niż to wc -l, co powróci.

GCS
źródło