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
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.
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
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?
Vous voulez probablement egrep. Essayer:
egrep '^[d-]rwx.*[0-9]$' usrLog.txt
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