Próbuję znaleźć pliki zawierające określone słowo za pomocą grep
. W katalogu znajduje się wiele plików (> 500)
Polecenie uruchamiam
$ grep 'delete' *
Wynik
validate_data_stage1:0
validate_data_stage2:0
validate_data_stage3:0
validate_data_stage4:0
validate_data_stage5:0
validate_input_stage1:0
validate_input_stage2:0
validate_input_stage3:0
validate_input_stage4:0
.... and hundred of such lines
Są to pliki, które nie zawierają podanego dopasowania. Chcę ukryć wyświetlanie tych linii na standardowym. Wiem o -q
przełączniku, ale to tłumiłoby pełne wyjście, czego nie chcę.
Jak mogę to zrobić?
grep
nie powinien wypisywać nazw niepasujących plików. W rzeczywistości wygląda na to, żegrep
uważa linię z treścią0
za pasującą. Czy możesz opublikować dokładny wzór wyszukiwania, którego używasz?grep 'delete' * -R
, ale nie sądzę, że-R
powoduje to żadnego problemu. I tak, normalnie nie drukuje tych niepasujących, ale nie jestem pewien, co się tutaj dzieje ...grep -- 'delete' *
(dodałem--
) i działało zgodnie z oczekiwaniami. Usunięcie--
prowadzi do powyższego ekranu.-ci
. Dziękujemy za rozwiązanie problemu. Możesz opublikować ten scenariusz jako odpowiedź.Odpowiedzi:
Takie zachowanie wykazuje
grep -c
.Prawdopodobnie masz plik, którego nazwa zaczyna się od
-
i zawierac
znak, i używasz GNU grep bez ustawianiaPOSIXLY_CORRECT
zmiennej środowiskowej.Posługiwać się:
albo lepiej:
--
oznacza koniec opcji, aby nazwa pliku nie była traktowana jako opcja (w przypadku POSP grep nie byłoby tak, ponieważdelete
argument braku opcji oznaczałby koniec opcji), ale nie rozwiązałby problemu plik o nazwie-
.grep delete ./*
Jest bardziej wytrzymała, ale ma tę wadę, że wyprowadzanie z dodatkowych./
plików dobieraniu (mimo że mogą być uznane jako bonus ponieważ pomaga zidentyfikować nazwy plików, które zawierają znaki nowej linii).źródło
Dodaj
Niezbyt elegancki, ale myślę, że to zadziała.
Dodanie
-l
do twojego polecenia da ci tylko dopasowania, ale także powstrzyma drukowanie liczby dopasowań dla każdego pliku.źródło
-l
pracował obejście jest również dobre. Dziękigrep -v ':0$'
taka, aby pasowały tylko te na końcu linii (jednakgrep -l
podejście jest znacznie lepsze, o ile nie potrzebujesz zliczania linii)Za pomocą
grep -l
otrzymasz tylko pliki, które zawierają co najmniej jedno dopasowanie.Czy potrzebujesz informacji o tym, ile w ogóle pasuje do pliku? Ponieważ można pominąć,
-c
który służy do zliczania liczby dopasowań w pliku.edycja: I jak powiedział Warlock,
-I
tłumienie dopasowań w plikach binarnych może być dobrym pomysłem.źródło
Jak grep liczyć niezerowe liczy się:
grep -rIcH 'string' . | grep -v ':0$'
-r
Powtarzaj podkatalogi.-I
Zignoruj pliki binarne (dzięki @tongpu , warlock ) .-c
Pokaż liczbę dopasowań. Irytujące, zawiera pliki 0-count.-H
Pokaż nazwę pliku, nawet jeśli tylko jeden plik.'string'
twój sznur idzie tutaj..
Zacznij od bieżącego katalogu.| -v ':0$'
Usuń pliki 0-count. (dzięki @LaurentiuRoescu )(Zdaję sobie sprawę, że OP nieumyślnie się liczy - c, ale Google (grep nonzero count) ląduje tutaj.)
źródło
Podobnie do odpowiedzi Laurentiu, możesz również użyć listingu
-l
jako danych wejściowych pliku dla grep:grep -r "pattern" -c $(grep -rl "pattern")
Pozwala zachować kolor grepa, ale robi to samo w tle
źródło