Script shell : sed + awk
Résolu
Unicorn777
Messages postés
30
Date d'inscription
Statut
Membre
Dernière intervention
-
Unicorn777 Messages postés 30 Date d'inscription Statut Membre Dernière intervention -
Unicorn777 Messages postés 30 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je me penche actuellement faire un petit script shell qui convertit les logs weechat en format de logs irssi et j'aurais pour cela besoin d'un peu d'aide.
En effet j'ai besoin de combiner un sed et un awk, je m'explique:
J'explique donc:
sed (la commande sed jusque la pas de soucis)
-i (pour que la commande remplace directement dans le fichier et non sur la sortie standard)
REGEXP (mon expression régulière qui me permet de matcher seulement avec certaines lignes du fichier)
awk (la commande qui permet de récupérer certains mots qu'il en entrée pour ressortir ce que je veux)
Le soucis c'est comment piper awk avec ce que match la regexp.
J'espère avoir été clair :s
Sinon n'hésitez pas à me demander de rééxpliquer !
Merci d'avance !
Je me penche actuellement faire un petit script shell qui convertit les logs weechat en format de logs irssi et j'aurais pour cela besoin d'un peu d'aide.
En effet j'ai besoin de combiner un sed et un awk, je m'explique:
sed -i 's/REGEXP/awk sur ce que match la REGEXP/g' log
J'explique donc:
sed (la commande sed jusque la pas de soucis)
-i (pour que la commande remplace directement dans le fichier et non sur la sortie standard)
REGEXP (mon expression régulière qui me permet de matcher seulement avec certaines lignes du fichier)
awk (la commande qui permet de récupérer certains mots qu'il en entrée pour ressortir ce que je veux)
Le soucis c'est comment piper awk avec ce que match la regexp.
J'espère avoir été clair :s
Sinon n'hésitez pas à me demander de rééxpliquer !
Merci d'avance !
A voir également:
- Script shell : sed + awk
- Classic shell - Télécharger - Personnalisation
- Script vidéo youtube - Guide
- Mas script - Accueil - Windows
- Ghost script - Télécharger - Polices de caractères
- Script cmd - Guide
6 réponses
Salut,
J'espère avoir été clair :s
Sinon n'hésitez pas à me demander de rééxpliquer !
Ben pas très, enfin si mais ce serait mieux si tu nous affichais un exemple de ce qui entre d'un côté et ce que tu voudrais qu'il sorte de l'autre, histoire qu'on s'entende bien sur ce qu'il faut faire ;-))
J'espère avoir été clair :s
Sinon n'hésitez pas à me demander de rééxpliquer !
Ben pas très, enfin si mais ce serait mieux si tu nous affichais un exemple de ce qui entre d'un côté et ce que tu voudrais qu'il sorte de l'autre, histoire qu'on s'entende bien sur ce qu'il faut faire ;-))
en entré un fichier du type :
en sortie il me faut :
avec "#chan", "admin" et "user" pouvant changer
Pour le moment j'ai quelque chose qui ressemble à ça, mais il faudrais que j'arrive a recuperer ce qui match avec ma regexp pour le piper avec awk:
J'espère que c'est un peu plus clair...
En tout cas merci beaucoup pour la rapidité de la reponse !
11:11:11 < user> Bonjour 22:22:22 <-- admin has kicked user from #chan 23:33:33 < user> Au revoir
en sortie il me faut :
11:11:11 < user> Bonjour 22:22:22 -!- user was kicked from #chan by admin 23:33:33 < user> Au revoir
avec "#chan", "admin" et "user" pouvant changer
Pour le moment j'ai quelque chose qui ressemble à ça, mais il faudrais que j'arrive a recuperer ce qui match avec ma regexp pour le piper avec awk:
sed -i 's/[0-9]{2}:[0-9]{2}:[0-9]{2} <-- .[^ ]+ has kicked .[^ ]+ from/awk -F ' ' '{ print $1" -!- "$6" was kicked from "$8" by "$3" ["$3"]" }'/g' log_file
J'espère que c'est un peu plus clair...
En tout cas merci beaucoup pour la rapidité de la reponse !
Et simplement avec "awk" ç'est pas bon ?
awk ' $5 !~ /kicked/ { print $0} $5 ~ /kicked/ { print $1" -!- "$6" was kicked from "$8" by "$3 }' fichierCe qui donne :
$ cat plop 11:11:11 < user> Bonjour 22:22:22 <-- admin has kicked user from #chan 23:33:33 < user> Au revoir $ awk ' $5 !~ /kicked/ { print $0} $5 ~ /kicked/ { print $1" -!- "$6" was kicked from "$8" by "$3 }' plop 11:11:11 < user> Bonjour 22:22:22 -!- user was kicked from #chan by admin 23:33:33 < user> Au revoir $;-))
Est ce que ca remplace toutes les occurrences si il y en a plusieurs (avec des user et admin différents)
Et je t'en demande encore un peu... je découvre juste awk aujourd'hui.. donc si c'était possible d'avoir une explication sur la ligne, plutôt que de la copier simplement je t'en serais vraiment très reconnaissant !
Je teste ça et je vois ce que ça donne !
Merci pour tout !
edit : ça fait bien toutes les occurrences, par contre ca ne modifie pas directement dans le fichier comme dans sed -i
Et je t'en demande encore un peu... je découvre juste awk aujourd'hui.. donc si c'était possible d'avoir une explication sur la ligne, plutôt que de la copier simplement je t'en serais vraiment très reconnaissant !
Je teste ça et je vois ce que ça donne !
Merci pour tout !
edit : ça fait bien toutes les occurrences, par contre ca ne modifie pas directement dans le fichier comme dans sed -i
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Tiens essaye ça aussi avec "sed" :
$5 !~ /kicked/ { print $0}
Si le champ 5 ($5) est différent ( !~) du mot "kicked" on imprime la ligne
$5 ~ /kicked/ { print $1...$6... }
Si le champ 5 ($5) est identique (~) au mot "kicked" on imprime la ligne formatée
sed -r '/kicked/ s/([^ ]*) <-- ([^ ]*) has kicked ([^ ]*) from (.*)/\1 -!- \3 was kicked from \4 by \2/' plopCe qui donne avec des admins et des users différents :
$ cat plop 11:11:11 < user> Bonjour 22:22:22 <-- admin has kicked user from #chan 23:33:33 < user> Au revoir 1:11:11 < user> Bonjour 22:22:22 <-- admin1 has kicked user1 from #chan 23:33:33 < user> Au revoir 1:11:11 < user> Bonjour 22:22:22 <-- admin2 has kicked user2 from #chan 23:33:33 < user> Au revoir 1:11:11 < user> Bonjour 22:22:22 <-- toto has kicked charlot from #chan 23:33:33 < user> Au revoir $ sed -r '/kicked/ s/([^ ]*) <-- ([^ ]*) has kicked ([^ ]*) from (.*)/\1 -!- \3 was kicked from \4 by \2/' plop 11:11:11 < user> Bonjour 22:22:22 -!- user was kicked from #chan by admin 23:33:33 < user> Au revoir 1:11:11 < user> Bonjour 22:22:22 -!- user1 was kicked from #chan by admin1 23:33:33 < user> Au revoir 1:11:11 < user> Bonjour 22:22:22 -!- user2 was kicked from #chan by admin2 23:33:33 < user> Au revoir 1:11:11 < user> Bonjour 22:22:22 -!- charlot was kicked from #chan by toto 23:33:33 < user> Au revoir $Et idem avec "awk" :
$ awk ' $5 !~ /kicked/ { print $0} $5 ~ /kicked/ { print $1" -!- "$6" was kicked from "$8" by "$3 }' plop 11:11:11 < user> Bonjour 22:22:22 -!- user was kicked from #chan by admin 23:33:33 < user> Au revoir 1:11:11 < user> Bonjour 22:22:22 -!- user1 was kicked from #chan by admin1 23:33:33 < user> Au revoir 1:11:11 < user> Bonjour 22:22:22 -!- user2 was kicked from #chan by admin2 23:33:33 < user> Au revoir 1:11:11 < user> Bonjour 22:22:22 -!- charlot was kicked from #chan by toto 23:33:33 < user> Au revoirPour les explications avec "awk" :
$5 !~ /kicked/ { print $0}
Si le champ 5 ($5) est différent ( !~) du mot "kicked" on imprime la ligne
$5 ~ /kicked/ { print $1...$6... }
Si le champ 5 ($5) est identique (~) au mot "kicked" on imprime la ligne formatée