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

  • Które grep? GNU grep? Czy korzystasz z Linuksa, Solaris, BSD?
  • I ' korzystam z Linuksa.

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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *