Działa jak magia! Wskazówka: użyj -rLzamiast, -Laby dopasować podkatalogi
Ufos
1
@ Larry - Bardziej czystym sposobem na uniknięcie problemów z globowaniem jest użycie opcji „pustej” długiej w następujący sposób: grep -L 'foo' -- *Standardowo polecenia wymagające długich opcji --wskazują, że po tym punkcie nie ma już żadnych opcji.
Paddy Landau
45
Spójrz na ack. Robi .svnwykluczenia dla Ciebie automatycznie, daje Perl wyrażeń regularnych, i jest prosty do pobrania z jednego programu Perl.
Odpowiednikiem tego, czego szukasz, powinno być ack:
Chcesz zmienić grep 0 na końcu na grep 0 $ (w przeciwnym razie otrzymujesz błędne dopasowania dla plików, które mają znak 0 w nazwie pliku).
clouseau,
9
@clouseau ma w większości rację ... Jednak grep '0$'pasowałoby też do plików z wielokrotnością 10 linii! Na grep ':0$'końcu musisz sprawdzić wyraźne „: 0” na końcu linii. Otrzymasz wtedy tylko pliki z dopasowanymi zerami linii.
TrinitronX,
System UNIX, na którym pracuję, nie miał wersji find ani grep z tymi opcjami, więc musiałem użyć polecenia „ack” sugerowanego w innych komentarzach.
KC Baltz,
14
Następujące polecenie wyklucza potrzebę wyszukiwania przez filtrowanie svnfolderów za pomocą drugiego grep.
Muszę przefakturować duży projekt, który używa .phtmlplików do pisania HTML przy użyciu wbudowanego kodu PHP. Chcę zamiast tego użyć szablonów wąsów . Chcę znaleźć wszelkie .phtmlgiles, które nie zawierają łańcucha, new Mustacheponieważ nadal wymagają przepisania.
Zapominam polecenia, ale zamiast zrzucać nazwy plików, możesz faktycznie zrobić diffpomiędzy dwoma strumieniami wyjściowymi (myślę, że otaczasz polecenia nawiasami, a gdzieś tam jest też nawias kątowy), jeśli twój system to obsługuje, tak myślę jest pytanie, ponieważ nie obsługujegrep -L
Dexygen
1
find *20161109* -mtime -2|grep -vwE "(TRIGGER)"
Możesz określić filtr pod „find”, a ciąg wykluczenia pod „grep -vwE”. Jeśli chcesz filtrować według zmodyfikowanego czasu, użyj mtime w find.
Ponieważ postęp w zgłaszaniu błędów jest niewielki, nie należy polegać na-L opcji wymienionej poniżej , dopóki błąd nie zostanie rozwiązany. Zamiast tego użyj różnych podejść przedstawionych w tym wątku. Cytując komentarz do raportu o błędzie [moje podkreślenie]:
Wszelkie aktualizacje na ten temat? -Lcałkowicie ignoruje dopasowania w pierwszym wierszu pliku. Wygląda na to, że jeśli nie zostanie to wkrótce naprawione, flaga powinna zostać całkowicie usunięta, ponieważ w rzeczywistości nie działa tak, jak reklamowano .
Silver Searcher - Ag (zamierzona funkcja - patrz raport o błędach)
Spowoduje to wydrukowanie linii, które nie zawierają wzoru. Możesz dodać -lopcję drukowania tylko nazwy pliku; ale nadal drukuje nazwy każdego pliku zawierającego dowolny wiersz, który nie zawiera wzorca. Wierzę, że OP chce znaleźć pliki, które nie zawierają żadnej linii zawierającej wzorzec.
tripleee
Podane polecenie wyświetla listę plików w „ścieżce plików” wraz ze wszystkimi wierszami, które nie zawierają „wzorca”.
aprodan
-6
Poniższe polecenie może pomóc w filtrowaniu wierszy zawierających podciąg „foo”.
Wyświetla linie, które nie pasują, a nie nazwy plików, które nie zawierają dopasowania w żadnej linii. Aby dodać obrażenia do obrażeń, jest to bezużyteczne użyciecat .
GREP_OPTIONS='--exclude-dir=.svn --exclude-dir=.git'
: ^)ag -L 'foo'
-rL
zamiast,-L
aby dopasować podkatalogigrep -L 'foo' -- *
Standardowo polecenia wymagające długich opcji--
wskazują, że po tym punkcie nie ma już żadnych opcji.Spójrz na
ack
. Robi.svn
wykluczenia dla Ciebie automatycznie, daje Perl wyrażeń regularnych, i jest prosty do pobrania z jednego programu Perl.Odpowiednikiem tego, czego szukasz, powinno być
ack
:źródło
Możesz to zrobić tylko z grep (bez znalezienia).
To jest wyjaśnienie zastosowanych parametrów
grep
Jeśli użyjesz
l
(małe litery) otrzymasz odwrotnie (pliki z dopasowaniami)źródło
Następujące polecenie daje mi wszystkie pliki, które nie zawierają wzorca
foo
:źródło
grep '0$'
pasowałoby też do plików z wielokrotnością 10 linii! Nagrep ':0$'
końcu musisz sprawdzić wyraźne „: 0” na końcu linii. Otrzymasz wtedy tylko pliki z dopasowanymi zerami linii.Następujące polecenie wyklucza potrzebę wyszukiwania przez filtrowanie
svn
folderów za pomocą drugiegogrep
.źródło
Będziesz potrzebować:
źródło
Miałem szczęście
Moje próby z
grep -v
po prostu dały mi wszystkie linie bez „foo”.źródło
Problem
Muszę przefakturować duży projekt, który używa
.phtml
plików do pisania HTML przy użyciu wbudowanego kodu PHP. Chcę zamiast tego użyć szablonów wąsów . Chcę znaleźć wszelkie.phtml
giles, które nie zawierają łańcucha,new Mustache
ponieważ nadal wymagają przepisania.Rozwiązanie
find . -iname '*.phtml' -exec grep -H -E -o -c 'new Mustache' {} \; | grep :0$ | sed 's/..$//'
Wyjaśnienie
Przed rurami:
Odnaleźć
find .
Znajdź pliki rekurencyjnie, zaczynając od tego katalogu-iname '*.phtml'
Nazwa pliku musi zawierać.phtml
(i
czyni to bez rozróżniania wielkości liter)-exec 'grep -H -E -o -c 'new Mustache' {}'
Uruchomgrep
polecenie na każdej ze zgodnych ścieżekGrep
-H
Zawsze drukuj nagłówki plików z wierszami wyjściowymi.-E
Interpretuj wzorzec jako rozszerzone wyrażenie regularne (tj. Wymuś, aby grep zachowywał się jak egrep).-o
Drukuje tylko pasującą część linii.-c
Tylko liczba wybranych wierszy jest zapisywana na standardowe wyjście.To da mi listę wszystkich ścieżek plików kończących się na
.phtml
, wraz z liczbą przypadków, w których łańcuchnew Mustache
występuje w każdej z nich.Pierwsza rura
grep :0$
filtruje tę listę, aby uwzględnić tylko linie kończące się na:0
:Druga rura
sed 's/..$//'
usuwa ostatnie dwa znaki każdego wiersza, pozostawiając tylko ścieżki plików.źródło
Jeśli używasz git, przeszukuje wszystkie śledzone pliki:
i możesz wyszukiwać w podzbiorze śledzonych plików, jeśli masz włączone ** globowanie podkatalogów ** (
shopt -s globstar
w .bashrc, patrz to ):źródło
Mój grep nie ma żadnej opcji -L. Znalazłem obejście, aby to osiągnąć.
Pomysły to:
zrób różnicę między plikiem 2 zrzutu za pomocą polecenia diff.
źródło
diff
pomiędzy dwoma strumieniami wyjściowymi (myślę, że otaczasz polecenia nawiasami, a gdzieś tam jest też nawias kątowy), jeśli twój system to obsługuje, tak myślę jest pytanie, ponieważ nie obsługujegrep -L
find *20161109* -mtime -2|grep -vwE "(TRIGGER)"
Możesz określić filtr pod „find”, a ciąg wykluczenia pod „grep -vwE”. Jeśli chcesz filtrować według zmodyfikowanego czasu, użyj mtime w find.
źródło
Otwórz raport o błędzie
Jak skomentował @tukan, istnieje otwarty raport o błędzie dla Ag dotyczący flagi
-L
/--files-without-matches
:--files-without-matches
nie działa poprawniePonieważ postęp w zgłaszaniu błędów jest niewielki, nie należy polegać na
-L
opcji wymienionej poniżej , dopóki błąd nie zostanie rozwiązany. Zamiast tego użyj różnych podejść przedstawionych w tym wątku. Cytując komentarz do raportu o błędzie [moje podkreślenie]:Silver Searcher - Ag (zamierzona funkcja - patrz raport o błędach)
Jako potężną alternatywę
grep
możesz użyć Srebrnego Poszukiwacza - Ag :Patrząc na
man ag
, znajdujemy opcję-L
lub--files-without-matches
:To znaczy, aby rekurencyjnie wyszukiwać pliki, które nie pasują
foo
, z bieżącego katalogu:Aby przeszukać tylko bieżący katalog w poszukiwaniu plików, które nie pasują
foo
, po prostu określ--depth=0
rekurencję:źródło
-L
błędu - github.com/ggreer/the_silver_searcher/issues/238kolejna alternatywa, gdy grep nie ma opcji -L (na przykład IBM AIX), tylko grep i powłoka:
źródło
lub
powyższe polecenie da nam wynik, ponieważ -v znajdzie odwrotność przeszukiwanego wzorca
źródło
-l
opcję drukowania tylko nazwy pliku; ale nadal drukuje nazwy każdego pliku zawierającego dowolny wiersz, który nie zawiera wzorca. Wierzę, że OP chce znaleźć pliki, które nie zawierają żadnej linii zawierającej wzorzec.Poniższe polecenie może pomóc w filtrowaniu wierszy zawierających podciąg „foo”.
źródło
cat
.