Je tente de "grep" out bind pour un utilisateur spécifique à partir d'un fichier journal LDAP. Les lignes dont j'ai besoin seront réparties sur plusieurs lignes dans le journal. Voici entrée exemple:sed: utilisation de variables sur plusieurs lignes
[2009/04/28 17:04:42.414] DoBind on connection 0x7c8affc0
[2009/04/28 17:04:42.414] Bind name:cn=admin,ou=appids,o=admineq, version:3, authentication:simple
[2009/04/28 17:04:42.415] Failed to authenticate local on connection 0x6cc8ee80, err = log account expired (-220)
[2009/04/28 17:04:42.416] Sending operation result 53:"":"NDS error: log account expired (-220)" to connection 0x6cc8ee80
[2009/04/28 17:04:42.416] Operation 0x3:0x60 on connection 0x6cc8ee80 completed in 3 seconds
[2009/04/28 17:04:42.416] Sending operation result 0:"":"" to connection 0x7c8affc0
[2009/04/28 17:04:42.416] Operation 0x1:0x60 on connection 0x7c8affc0 completed in 0 seconds
[2009/04/28 17:04:48.772] DoSearch on connection 0x7c8affc0
[2009/04/28 17:04:48.772] Search request:
base: "o=intranet"
scope:2 dereference:0 sizelimit:0 timelimit:600 attrsonly:0
filter: "(guid='03ADmin)"
attribute: "cn"
attribute: "cn"
attribute: "cn"
attribute: "cn"
attribute: "objectClass"
attribute: "guid"
attribute: "mail"
[2009/04/28 17:04:48.773] Sending operation result 0:"":"" to connection 0x7c8affc0
[2009/04/28 17:04:48.773] Operation 0xe851:0x63 on connection 0x7c8affc0 completed in 0 seconds
Pour cet exemple, ce qui suit devrait être le résultat:
[2009/04/28 17:04:42.414] DoBind on connection 0x7c8affc0
[2009/04/28 17:04:42.414] Bind name:cn=admin,ou=appids,o=admineq, version:3, authentication:simple
[2009/04/28 17:04:42.416] Sending operation result 0:"":"" to connection 0x7c8affc0
[2009/04/28 17:04:42.416] Operation 0x1:0x60 on connection 0x7c8affc0 completed in 0 seconds
Fondamentalement, c'est un journal des opérations de serveur à travers plusieurs connexions. J'ai besoin d'analyser le temps passé dans les opérations 'bind' par l'utilisateur admin, mais ce serveur est très occupé, donc j'ai besoin d'éliminer beaucoup de bruit.
En pseudocode:
for each line in file
if line contains "DoBind" and next line contains "cn=admin"
print both lines
find the connection number X in lines
skip lines until "Sending operation result.*to connection X" is found
print two lines
Je voudrais obtenir les « doBind » lignes qui sont précédées par l'utilisateur « cn = admin » et les lignes de résultat, qui sont classées en fonction du numéro de connexion " 0x7c8affc0 "dans cet exemple. D'autres opérations peuvent avoir lieu entre le début et la fin de la liaison dont je n'ai pas besoin, comme le message "Impossible d'authentifier", qui se déroule sur une connexion différente.
En outre, d'autres opérations auront lieu sur la connexion après que la liaison est faite ce qui ne m'intéresse pas. Dans ce qui précède, les résultats de l'opération DoSearch après le 'bind' ne doivent pas être capturés. J'essaye de faire ceci avec 'sed', qui a semblé être le bon outil pour le travail. Hélas, je suis un débutant et c'est une expérience d'apprentissage. Voici ce que j'ai jusqu'à présent:
/.*DoBind on connection \(0x[0-9a-f]*\)\n.*Bind name:cn=OblixAppId.*/ p
/.*Sending operation result.*to connection \1\nOperation.*on connection \1 completed.*/ p
sed se plaint de la deuxième ligne où j'utilise '\ 1'. J'essaie de capturer l'adresse de connexion et de l'utiliser dans une recherche ultérieure pour capturer les chaînes de résultats, mais je ne l'utilise évidemment pas correctement. Les variables '#' semblent être locales à chaque opération de recherche.
Existe-t-il un moyen de passer des "variables" d'une recherche à une autre ou devrais-je plutôt apprendre perl?
Merci, mais il y aura d'autres opérations qui ont lieu sur ces liens que je ne suis pas intéressé. Les lignes de résultats ne permettent pas d'identifier le fait que le résultat était une « opération de liaison » . La deuxième partie de ce script finirait par me donner tous les résultats d'opération qui se sont produits sur toute connexion à laquelle l'administrateur s'est lié. Je vais ajouter ceci à la question. – veefu
Ce n'est pas tout à fait clair pour moi ce que vous voulez. Quelles lignes voulez-vous en sortie? Pouvez-vous fournir un exemple de sortie? Basé sur votre description "fgrep -v DoSearch" ou un "egrep (complété | Envoyé)" à la fin de ma solution ci-dessus ferait. –
ce qui m'inquiète à propos de cette solution est "le fgrep final trouve toutes les lignes qui contiennent l'un des numéros de connexion" Je ne veux pas toutes les lignes qui contiennent les numéros de connexion, je veux seulement les premières lignes trouvées pour une connexion DoBind "a été effectué sur la connexion J'ai ajouté des exemples de résultats – veefu