2011-09-14 14 views
5

Przeszukałem i nie mogę znaleźć odpowiedzi, której szukam.Grep dla wielu wzorców na wielu plikach

Say mam plik text1.txt w katalogu mydir którego zawartość to:

one 
two 

a drugi nazywa text2.txt, również w mydir, którego zawartość jest:

two 
three 
four 

Próbuję aby uzyskać listę plików (dla danego katalogu), które zawierają wszystkie (nie wszystkie) wzory, których szukam. W przykładzie I, pod warunkiem, szukam wyjścia gdzieś wzdłuż linii:

./text1.txt 

lub

./text1.txt:one 
./text1.txt:two 

Jedyne co udało mi się znaleźć są dotycząca dopasowania jakiekolwiek wzorce w plik lub dopasowanie wielu wzorców w jednym pliku (próbowałem rozszerzyć do całego katalogu, ale otrzymałem błędy użycia grep).

Każda pomoc jest doceniana.

Edit-Czego próbowałem

grep "pattern1" < ./* | grep "pattern2" ./* 

"niejednoznaczne przekierowanie"

grep 'pattern1'|'pattern2' ./* 

zwraca plików pasujących albo wzorzec

+0

Jaki był komunikat o błędzie użycia? A co było poleceniem, które wypróbowałeś? –

Odpowiedz

8

Jednym ze sposobów może być tak:

find . | xargs grep 'pattern1' -sl | xargs grep 'pattern2' -sl 
+1

lub alternate tego jak: 'grep -rl 'pattern1' | xargs grep 'pattern2' -l' –

+0

'grep -rlZ 'pattern1' | xargs --null grep 'pattern2' -l', aby był wyjątkowo bezpieczny pod względem nazw plików. – Kal

3

Cienki k to co trzeba (można dodać łatwo więcej wzorów)

grep -EH 'pattern1|pattern2' mydir 
+1

To jest lub, OP chce i –

2

Aby udoskonalić mózgu odpowiedź:

find . -type f -print0 | xargs -0 grep 'pattern1' -slZ | xargs -0 grep 'pattern2' -sl 

to zachowa grep od próbując szukać w katalogach, a może prawidłowo obsługiwać nazwy plików ze spacjami , jeśli przełączysz flagę -Z na grep dla wszystkich oprócz ostatniego wzoru i przekaż -0 na xargs.

Powiązane problemy