La tuyauterie de grep et en utilisant les regex
Fondamentalement, ce que je veux faire est d'analyser des lignes dans un fichier et le retour des noms d'utilisateurs. Les noms d'utilisateur sont toujours entouré en < et >, donc je veux utiliser les regex pour correspondre à tout avant (et y compris) la < et tout ce qui suit (et y compris) la >, puis inverser mon match. Je comprends que grep -vE devrait être capable de faire cela.
Mon script ressemble un peu à quelque chose comme ça pour l'instant:
#!/bin/bash
while read line; do
echo $line | grep -vE '(.*<)|(>.*)'
done < test_log
Et test_log se compose des éléments suivants:
Mar 1 09:28:08 (IP redacted) dovecot: pop3-login: Login: user=<emcjannet>, method=PLAIN, rip=(IP redacted), lip=(IP redacted)
Mar 1 09:27:53 (IP redacted) dovecot: pop3-login: Login: user=<dprotzak>, method=PLAIN, rip=(IP redacted), lip=(IP redacted)
Mar 1 09:28:28 (IP redacted) dovecot: imap-login: Login: user=<gconnie>, method=PLAIN, rip=(IP redacted), lip=(IP redacted), TLS
Mar 1 09:27:25 (IP redacted) dovecot: imap-login: Login: user=<gconnie>, method=PLAIN, rip=(IP redacted), lip=(IP redacted), TLS
Cependant, lors de l'exécution de mon script, rien n'est renvoyé, en dépit quand je teste la regex dans quelque chose comme regexpal avec une inversion de match c'est exactement ce que je veux. Ce que je fais mal?
- Je ne comprends pas l'inverser. Le -v signifie "trouver des lignes où ce modèle ne correspond pas". Je pense que la meilleure approche est de saisir le nom d'utilisateur. C'est bien ça?
Vous devez vous connecter pour publier un commentaire.
essayer cette grep ligne:
ou plus sécurisé:
MODIFIER
courte explication
En fait, j'aime @Kent réponse trop et c'est correct, mais il est parfois difficile de se rappeler les commutateurs comme "-Po" pour "grep" utilitaire. Habituellement, si vous ne vous souvenez pas exact drapeau vous pouvez demander l'utilitaire grep pour rafraîchir votre mémoire de façon suivante:
Comme nous pouvons le voir, il y a aussi un autre de ces options, comme "-E".
En fait, j'aime @Kent répondre mieux, mais si nous pouvons partir d'une version récente de grep et vous voulez éviter de perl à base d'expressions régulières, vous pouvez toujours extraire le nom d'utilisateur directement:
This is highly experimental and grep -P may warn of unimplemented features.
Vous n'avez pas vraiment besoin d'un programme externe si vos données est aussi cohérent que vous montrez.