web-dev-qa-db-fra.com

Correspondance négative à l'aide de grep (lignes de correspondance ne contenant pas foo)

J'ai essayé de trouver la syntaxe pour cette commande:

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

ou

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

J'ai besoin de voir tous les fichiers qui ont été modifiés à l'exception de ceux nommés error_log.

J'ai lu à ce sujet ici , mais je n'ai trouvé qu'un seul motif not- regex.

869
jerrygarciuh

grep -v est votre ami:

grep --help | grep invert  

-v, --invert-match sélectionne des lignes non concordantes

Consultez également le code -L associé (le complément de -l).

-L, --files-without-match n'indique que les noms de fichier ne contenant aucune correspondance

1577
Motti

Vous pouvez également utiliser awk à ces fins, car cela vous permet d'effectuer des vérifications plus complexes de manière plus claire:

Lignes ne contenant pas foo:

awk '!/foo/'

Lignes ne contenant ni foo ni bar:

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

Lignes ne contenant ni foo ni bar qui contiennent soit foo2, soit bar2:

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

Etc.

117
fedorqui

Dans votre cas, vous ne voulez probablement pas utiliser grep, mais ajoutez plutôt une clause négative à la commande find, par exemple.

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

Si vous souhaitez inclure des caractères génériques dans le nom, vous devrez les échapper, par exemple. pour exclure des fichiers avec le suffixe .log:

find /home/baumerf/public_html/ -mmin -60 -not -name \*.log
12
Papa Smurf