web-dev-qa-db-fra.com

Grep pour début et fin de ligne?

J'ai un fichier où je veux grep pour les lignes qui commencent par -rwx ou drwx AND se terminant par un nombre.

J'ai ceci, mais ce n'est pas tout à fait correct. Des idées?

grep [^.rwx]*[0-9] usrLog.txt
59
texasCode

La partie délicate est une regex qui inclut un tiret parmi les caractères valides d'une classe de caractères. Le tiret doit venir immédiatement après le début pour une classe de caractères (normale) et immédiatement après le curseur pour une classe de caractères annulée. Si vous avez également besoin d'un crochet étroit, vous avez besoin du crochet fermé suivi du tiret. Heureusement, vous n'avez besoin que de tiret, d'où la notation choisie.

grep '^[-d]rwx.*[0-9]$' "$@"

Voir: Expressions régulières et grep pour plus de détails sur les standards POSIX.

55
Jonathan Leffler

On dirait que vous êtes sur la bonne voie ... Le ^ le caractère correspond au début de la ligne et $ correspond à la fin de ligne. Le modèle de Jonathan fonctionnera pour vous ... je voulais juste vous donner l'explication derrière

26
Ray

Il convient de noter que non seulement le curseur (^) se comportera différemment entre crochets, mais qu’il aura le résultat opposé de le placer en dehors des crochets. Si vous placez le curseur à l'endroit où vous l'avez, toutes les chaînes qui ne commencent pas par le contenu que vous avez placé entre crochets seront recherchées. Vous voudriez également placer un point avant l'astérisque entre vos crochets, comme pour grep, il agit également comme un "caractère générique".

grep ^[.rwx].*[0-9]$

Cela devrait fonctionner pour vous. J'ai remarqué que certaines affiches utilisaient une classe de caractères dans leurs expressions, ce qui est également une méthode efficace, mais vous n'en utilisiez pas dans votre expression d'origine. J'essaie donc de vous en expliquer le plus possible, chaque changement mineur en cours de route pour qu'il soit mieux compris. Comment pouvons-nous apprendre autrement?

5
Bria

Vous voulez probablement egrep. Essayer:

egrep '^[d-]rwx.*[0-9]$' usrLog.txt
3
Nate

analysez-vous la sortie de ls -l?

Si vous êtes et que vous voulez juste obtenir le nom du fichier

find . -iname "*[0-9]" 

Si vous n'avez pas le choix parce que usrLog.txt est créé par quelque chose/quelqu'un d'autre et que vous devez absolument utiliser ce fichier, les autres options incluent

awk '/^[-d].*[0-9]$/' file

Rubis (1.9+)

Ruby -ne 'print if /^[-d].*[0-9]$/' file

Bash

while read -r line ; do  case $line in [-d]*[0-9] ) echo $line;  esac; done < file
1
kurumi