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


J'ai essayé de travailler sur la syntaxe de 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 seulement trouvé un notmodèle -regex


667
2017-08-23 14:24


origine


Réponses:


grep -v est votre ami:

grep --help | grep invert  

-v, --invert-match sélectionne les lignes qui ne correspondent pas

Consultez également les connexes -L (le complément de -l).

-L, --files-without-match uniquement les noms FILE d'impression ne contenant pas de correspondance


1238
2017-08-23 14:25



Vous pouvez aussi utiliser awk à ces fins, car il vous permet d'effectuer des contrôles plus complexes d'une manière plus claire:

Lignes ne contenant pas foo:

awk '!/foo/'

Lignes ne contenant pas non plus foo ni bar:

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

Lignes ne contenant pas non plus foo ni bar mais contenant soit foo2 ou bar2:

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

Etc.


73
2018-06-19 22:34



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

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 leur échapper, par ex. pour exclure les fichiers avec le suffixe .log:

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

8
2017-11-02 13:33