grep jak ukryć wyświetlanie niepasującego pliku?

11

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 -qprzełączniku, ale to tłumiłoby pełne wyjście, czego nie chcę.

Jak mogę to zrobić?

Mtk
źródło
2
Zwykle grepnie powinien wypisywać nazw niepasujących plików. W rzeczywistości wygląda na to, że grepuważa linię z treścią 0za pasującą. Czy możesz opublikować dokładny wzór wyszukiwania, którego używasz?
Adrian Heine
Kompletny cmd grep, którego użyłem, był grep 'delete' * -R, ale nie sądzę, że -Rpowoduje to żadnego problemu. I tak, normalnie nie drukuje tych niepasujących, ale nie jestem pewien, co się tutaj dzieje ...
Mt
@step @everyone .. Dziwne ... Po obejrzeniu edytowanego postu powyżej. Próbowałem grep -- 'delete' *(dodałem --) i działało zgodnie z oczekiwaniami. Usunięcie --prowadzi do powyższego ekranu.
mtk
1
@Stephane Rzeczywiście masz rację. Przeszukałem katalog ... i był plik z nazwą -ci. Dziękujemy za rozwiązanie problemu. Możesz opublikować ten scenariusz jako odpowiedź.
mtk

Odpowiedzi:

9

Takie zachowanie wykazuje grep -c.

Prawdopodobnie masz plik, którego nazwa zaczyna się od -i zawiera cznak, i używasz GNU grep bez ustawiania POSIXLY_CORRECTzmiennej środowiskowej.

Posługiwać się:

grep -- delete *

albo lepiej:

grep delete ./*

--oznacza koniec opcji, aby nazwa pliku nie była traktowana jako opcja (w przypadku POSP grep nie byłoby tak, ponieważ deleteargument 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).

Stéphane Chazelas
źródło
12

Dodaj

| grep -v ':0$'

Niezbyt elegancki, ale myślę, że to zadziała.

Dodanie -ldo twojego polecenia da ci tylko dopasowania, ale także powstrzyma drukowanie liczby dopasowań dla każdego pliku.

Laurentiu Roescu
źródło
1
-lpracował obejście jest również dobre. Dzięki
Mt
4
linia grep powinna być grep -v ':0$'taka, aby pasowały tylko te na końcu linii (jednak grep -lpodejście jest znacznie lepsze, o ile nie potrzebujesz zliczania linii)
mreithub
9

Za pomocą grep -lotrzymasz 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ąć, -cktóry służy do zliczania liczby dopasowań w pliku.

edycja: I jak powiedział Warlock, -Itłumienie dopasowań w plikach binarnych może być dobrym pomysłem.

tongpu
źródło
0

Jak grep liczyć niezerowe liczy się:

grep -rIcH 'string' . | grep -v ':0$'

  • -r Powtarzaj podkatalogi.
  • -IZignoruj ​​pliki binarne (dzięki @tongpu , warlock ) .
  • -cPokaż 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.)

Bob Stein
źródło
0

Podobnie do odpowiedzi Laurentiu, możesz również użyć listingu -ljako danych wejściowych pliku dla grep:
grep -r "pattern" -c $(grep -rl "pattern")
Pozwala zachować kolor grepa, ale robi to samo w tle

adriel
źródło
zwróć uwagę, że nazwy plików i katalogi zawierające dowolne białe znaki lub symbole wieloznaczne zostaną w wyniku tego błędnie podzielone i dopasowane.
Jeff Schaller