Muszę grepować niektóre pliki, aby zobaczyć, które zawierają określone słowo:
grep -l word *
Następnie muszę grepować listę plików, aby zobaczyć, które zawierają inne słowo. Najłatwiejszym sposobem byłoby prawdopodobnie napisanie scenariusza, ale nie bardzo wiem, jak go obsługiwać.
Komentarze
Odpowiedź
Zakładając, że żadna z nazw plików nie zawiera białych znaków, pojedynczego cudzysłowu, podwójne cudzysłowy lub znaki ukośnika odwrotnego (lub zacząć od – z GNU grep
), możesz wykonać:
grep -l word * | xargs grep word2
Xargs uruchomi drugi grep na każdym pliku z pierwszego grepa.
Z GNU grep
/ xargs
lub kompatybilnym, możesz zwiększyć niezawodność dzięki:
grep -lZ word ./* | xargs -r0 grep word2
Używanie -Z
sprawia, że grep
drukuje nazwy plików rozdzielane znakami NUL, aby można było ich używać z xargs -0
. Opcja -r
do xargs
pozwala uniknąć uruchomienia drugiego grep
, jeśli pierwszy grep
niczego „nie znajdzie.
Odpowiedź
grep -l word1 $(grep -l word2 *)
lub może dla jednego z dwóch słów w tym samym wierszu:
grep -w "word1\|word2" *
patrz tutaj
Odpowiedź
Jeśli chcesz znaleźć pliki zawierające słowo, a następnie odfiltrować te pliki zawierające inne słowo, możesz użyć następującej sekwencji poleceń:
grep word * | awk -F ":" "{print $1}"|uniq | xargs grep word2
-
grep word *
– pokaże wszystkie pliki zawierające „słowo”, nazwa pliku będzie pierwsza na liście. -
awk -F ":" "{print $1}"
– wydrukuje tylko nazwę pliku z wynikami -
uniq
– upewni się, że nie drukujesz nazwy pliku więcej niż raz. -
xargs grep word2
– ponownie przeszuka listę otrzymanych plików.
Komentarze
- @don_crissti Ale łączenie elementów
grep -l word1 * | xargs -d'\n' grep -l word2
działa na wszystko oprócz nowej linii, co jest dość dziwne, prawie nikt go nie używa.
grep
? GNUgrep
? Czy korzystasz z Linuksa, Solaris, BSD?