2009-10-03 21 views
14

Załóżmy, że mam kilka ciągów: str1 i str2 oraz str3.grep egrep multiple-strings

  • Jak znaleźć linie, które mają wszystkie ciągi?
  • Jak znaleźć linie, które mogą mieć którekolwiek z nich?
  • A jak znaleźć linie, które mają str1 i jedno ze str2 i str3 [, ale nie obie?]?

Odpowiedz

-2

Osobiście robię to w języku perl, zamiast próbować łączyć coś z grep.

Na przykład dla pierwszego:

while (<FILE>) 
{ 
    next if ! m/pattern1/; 
    next if ! m/pattern2/; 
    next if ! m/pattern3/; 

    print $_; 
} 
+3

-1: zadanie ion is not: jakie jest najlepsze narzędzie do tego, ale jak zrobić to z grep. – quosoo

+3

A odpowiedź brzmi: "Nie rób tego z grep, oszalejesz próbując" –

+0

@quosoo: wśród programistów Unixowych, "grep" może odnosić się albo do programu grep, albo do ogólnego problemu przeszukiwania ciała tekst na ciągi lub wzory. Nie jest jasne, które użycie Tim ma na celu, więc myślę, że odpowiedź Paula Tomblina jest w punkcie. –

8

nie można rozsądnie zrobić „wszystko” lub „to także jeden z tych” przypadków, ponieważ grep nie obsługuje uprzedzona. Użyj Perla. Dla "dowolnego" przypadku jest to egrep '(str1|str2|str3)' file.

nadmierną sposób zrobić „wszystko” przypadek jest:

egrep '(str1.*str2.*str3|str3.*str1.*str2|str2.*str1.*str3|str1.*str3.*str2)' file 

to znaczy budować na permutacji. Jest to oczywiście niedorzeczne.

Dla "to także jeden z tych", podobnie:

egrep '(str1.*(str2|str3)|(str2|str3).*str1)' file 
27

To wygląda jak trzy pytania. Najłatwiejszym sposobem na połączenie tego rodzaju wyrażeń jest użycie wielu potoków. Nie ma w tym wstydu, szczególnie, że wyrażenie regularne (używając egrep) byłoby niezręczne, ponieważ wydaje się, że sugerujesz, że chcesz uzyskać niezależność od celu.

Tak, w porządku,

  1. grep str1 | grep str2 | grep str3

  2. egrep '(str1 | słowo2 | str3)'

  3. grep str1 | egrep „(słowo2 | str3)”

można wykonać „i” forma w zamówieniu sposób niezależny wykorzystaniem egrep, ale myślę, że łatwiej jest pamiętać, aby zrobić porządek niezależnych Ands użyciu rurami greps i zamawiać niezależne lub używają wyrażeń regularnych.

+1

Ładnie wykonane. +1 –

+0

3 nie spełnia wymogu "ale nie oba", ale wymaganie to jest trudne do spełnienia. Będziesz potrzebował każdej strony alternatywy, by mieć starannie spreparowany przedrostek i przyrostek, z wyłączeniem innego ciągu, który nie pojawiłby się nigdzie indziej w linii. –

+0

@Michael E: Bit "ale nie oba" jest pisany kursywą i ma znak zapytania za nim, ponieważ kiedy redagowałem to pytanie, nie byłem pewien, po kim pytał. @Groundhog napisał swoją (dobrą) odpowiedź, zanim poprawiłem/poprawiłem pytanie z komentarzem/poprawką, które być może powinno zostać usunięte. –

3

grep -E --color "łańcuch1 | łańcuch2 | String3 ...."

na przykład znaleźć, czy nasz system za pomocą AMD (SVM) lub Intel (VMX) procesor i jeśli jest to 64-bitowy (LM) lm stoi długotrwały Mode co oznacza 64bit ...

przykład polecenie:

grep -E --color "lm | SVM | VMX"/proc/cpuinfo

-E jest koniecznością, aby znajdź wiele ciągów znaków: