Negatieve overeenkomst met grep (overeenkomst met regels die geen foo bevatten)

Ik heb geprobeerd de syntaxis voor dit commando te achterhalen:

grep ! error_log | find /home/foo/public_html/ -mmin -60

of

grep '[^error_log]' | find /home/baumerf/public_html/ -mmin -60

Ik moet alle bestanden zien die gewijzigd zijn, behalve die met de naam error_log.

Ik heb er hier over gelezen, maar heb maar één niet-regex patroon gevonden.

Oplossing

grep -v is je vriend:

grep --help | grep invert  

-v, --invert-match selecteert niet-overeenkomende regels

Bekijk ook de gerelateerde -L (het complement van -l).

-L, --files-without-match print alleen bestandsnamen die geen overeenkomst bevatten

Commentaren (9)

Je kunt awk ook voor deze doeleinden gebruiken, omdat het je in staat stelt om complexere controles op een duidelijker manier uit te voeren:

Regels die foo niet bevatten:

awk '!/foo/'

Regels die noch foo noch bar bevatten:

awk '!/foo/ && !/bar/'

Regels die noch foo noch bar bevatten en die foo2 of bar2 bevatten:

awk '!/foo/ && !/bar/ && (/foo2/ || /bar2/)'

En zo verder.

Commentaren (1)

In uw geval wilt u vermoedelijk grep niet gebruiken, maar in plaats daarvan een negatieve clausule toevoegen aan het commando find, bijv.

find /home/baumerf/public_html/ -mmin -60 -not -name error_log

Als u jokertekens in de naam wilt opnemen, zult u'ze moeten escapen, bijv. om bestanden met suffix .log uit te sluiten:

find /home/baumerf/public_html/ -mmin -60 -not -name \*.log
Commentaren (0)