Chtěl bych získat shodu více vzorů s implicitním AND mezi vzory, tj. ekvivalentní spuštění několika greps v sekvenci:
grep pattern1 | grep pattern2 | ...
Jak to tedy převést na něco podobného?
grep pattern1 & pattern2 & pattern3
Chtěl bych používat single grep, protože dynamicky stavím argumenty, takže se vše musí vejít do jednoho řetězce. Použití filtru je systémová funkce, nikoli grep, takže to není argument.
Nezaměňujte tuto otázku s:
grep "pattern1|pattern2|..."
Toto je NEBO shoda více vzorů.
Přijatá odpověď:
agrep
můžete to udělat pomocí této syntaxe:
agrep 'pattern1;pattern2'
S GNU grep
, když je vytvořen s podporou PCRE, můžete:
grep -P '^(?=.*pattern1)(?=.*pattern2)'
S ast grep
:
grep -X '.*pattern1.*&.*pattern2.*'
(přidáním .*
s jako <x>&<y>
odpovídá řetězcům, které odpovídají oběma <x>
a <y>
přesně , a&b
by se nikdy neshodovaly, protože neexistuje žádný takový řetězec, který by byl oba a
a b
ve stejnou dobu).
Pokud se vzory nepřekrývají, můžete také provést:
grep -e 'pattern1.*pattern2' -e 'pattern2.*pattern1'
Nejlepší přenosný způsob je pravděpodobně s awk
jak již bylo zmíněno:
awk '/pattern1/ && /pattern2/'
Pomocí sed
:
sed -e '/pattern1/!d' -e '/pattern2/!d'
Mějte prosím na paměti, že všechny tyto budou mít jinou syntaxi regulárního výrazu.