2012-11-28 14 views
11

rozpatrywanymi w ocenie środków Mam następujący strumień danych:Korzystanie grep dla wielu wzorców wyszukiwania

BODY1 
attrib1: someval11 
attrib2: someval12 
attrib3: someval13 

BODY2 
attrib1: someval21 
attrib2: someval22 
attrib3: someval23 

BODY3 
attrib1: someval31 
attrib2: someval32 
attrib3: someval33 

chcę wyodrębnić tylko attrib1 i attrib3 dla każdego podmiotu, tj

attrib1: someval11 
attrib3: someval13 
attrib1: someval21 
attrib3: someval23 
attrib1: someval31 
attrib3: someval33 

Próbowałem

grep 'attrib1\|attrib3', zgodnie z this site, ale to nic nie zwróciło. grep attrib1 i grep attrib2 zwraca dane, ale tylko dla określonego wzorca pojedynczego.

+0

Nie dlatego, że to rozwiąże problem, ale może to być łatwiejsze do naśladowania i szybsze do grep do znalezienia jeśli regex jest 'attrib [13 ] '. Częste wydłużanie części wspólnej jest zwykle lepsze. –

+0

co, jeśli nie było wzorca komunalnego między 1 a 3 atrybutami? czy zostali nazwani czymś kompletnym innym? – amphibient

+0

w prawdziwym przykładzie, moje attrib1 jest nazywane foo, a attrib3 to bar ... – amphibient

Odpowiedz

15

grep -e 'attrib1' -e 'attrib3' file

Od strony man:

-e WZÓR, --regexp = WZÓR
Wykorzystanie wzorca jako wzorca. Można go użyć do określenia wielu wzorców wyszukiwania lub do ochrony wzorca zaczynającego się od łącznika (-). (-e jest określony przez POSIX.)

Edit: Alternatywnie można zapisać wzory w pliku i wybierz opcję -f:

[email protected]:~$ cat>patt 
attrib1 
attrib3 

[email protected]:~$ grep -f patt test 
attrib1: someval11 
attrib3: someval13 
attrib1: someval21 
attrib3: someval23 
attrib1: someval31 
attrib3: someval33 
+0

grep: niedozwolona opcja - e.używam SunOS – amphibient

+0

Jak mówi strona man, -e jest określone przez POSIX, więc powinno działać. Postaram się znaleźć alternatywę. – axiom

+0

@foampile Możesz spróbować sprawdzić, czy opcja '-f' jest przydatna. Należy również zauważyć, że dla przykładu, 'grep 'attrib1 \ | attrib3'' również powinien działać poprawnie. – axiom

0

To działa, z GNU grep 2.6.3

grep "attrib[13]" 

lub

grep "^[^0-9]*[13]:" 
+0

co, jeśli nie było wzorca komunalnego między przedziałami 1 i 3? czy zostali nazwani czymś kompletnym innym? – amphibient

+0

Czego szukasz, 1 lub 3 na końcu pierwszego słowa linii, a następnie dwukropka? – Sirch

0

To zależy od powłoki, w której się znajdujesz. grep -iw 'patter1\|patter2\|pattern3' działa na powłoce bash, gdzie jak to nie działa na powłoce korn. W przypadku powłoki korn możemy musieć spróbować grep -e pattern1 -e patter2 i tak dalej.

+0

Która używana powłoka nie ma bezpośredniego wpływu na parametry, które obsługuje zewnętrzne polecenie 'grep'. – tripleee

10

Również egrep;

egrep "pattern1|pattern2|pattern3" file 
8

bardzo proste polecenie:

bash> grep "attrib1\|attrib3" <file.name> 

attrib1: someval11 attrib3: someval13 attrib1: someval21 attrib3: someval23 attrib1: someval31 attrib3: someval33

Powiązane problemy