Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 26/08/2010, à 15:46

iuchiban

SED - Appliquer un traitement à la partie matchee et l'afficher

Bonjour tout le monde,

Nouveau problème sur sed.

j'ai des fichiers de logs dont la date n'est pas en format "utile"
Les lignes sont de type :

TEXTE [DATE_FORMAT_POURRI] TEXTE

avec FORMAT_POURRI :
[13/Oct/2009:10:25:06 +0200]

avec la commande suivante, je transforme la date en format que je veux :

date -d "$(head -1 fichier | cut -d"[" -f2 | cut -d"]" -f1 | tr "[:punct:]" " " | awk '{print $2" "$1" "$3" "$4":"$5":"$6}')" +%Y%m%d-%H%M%S

qui transforme format pourri en
Oct 13 2009 10:25:06
puis
date -d "Oct 13 2009 10:25:06" me donne le bon format

avec la commande suivante je remplace bien ma date par TOTO :

sed 's/\[.*\]/TOTO/' fichier

Je voudrais donc :
- trouver ma date (qui est \[\(.*\)\]
- lui appliquer le traitement
- afficher la nouvelle date à la place de l'ancienne

J'imagine que c'est faisable et ça m'aiderais à apprendre sed (si je trouve pas, je ferai un script à la place, mais c'est moins "propre" big_smile)

Merci.


C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.

Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.

Hors ligne

#2 Le 26/08/2010, à 15:55

survietamine

Re : SED - Appliquer un traitement à la partie matchee et l'afficher

salut, je n'ai pas compris pourquoi tu utilises `sed` si au final tu a besoin de la chaîne complète pour la commande `date -d`


Ðɸ Ƴơц ℕεєđ Şø₥€ √іêŤąɱίɳƸʂ ?

Hors ligne

#3 Le 26/08/2010, à 15:56

bennyboy

Re : SED - Appliquer un traitement à la partie matchee et l'afficher

Alors tu dois mettre ta date dans le sed entre parenthèses: \[(.*)\]
Et au lieu de toto tu peux mettre des backtits (`) et mettre entre la commande que tu souhaite executer avec \1 (ça c'est la valeur entre parenthèses.

Tu devrais donc avoir un truc dans le style:

sed 's/\[(.*)\]/`date -d "\1"`/' fichier

Dernière modification par bennyboy (Le 26/08/2010, à 15:57)


T'es tellement no-life que t'aimerais être un PC pour redémarrer ta vie en mode sans échec !
"Ubuntu" - an African word meaning "Gentoo is too hard for me".
Un wiki inutile (ou presque)
Un github inutile (ou presque)

Hors ligne

#4 Le 27/08/2010, à 15:09

credenhill

Re : SED - Appliquer un traitement à la partie matchee et l'afficher

hello
conversion de la date avec awk et date

$ cat a1
TEXTE [13/Oct/2009:10:25:06 +0200] TEXTE
$ awk -F"[][/:+]" '{b=" " ; "date -d " "\"" $2 b $3 b $4 b $5 ":" $6 ":" $7 "\""|getline d;sub("[[].*[]]", "[" d "]"); print}' a1
TEXTE [Tue Oct 13 10:25:06 CEST 2009] TEXTE
$

Hors ligne

#5 Le 27/08/2010, à 15:44

Totor

Re : SED - Appliquer un traitement à la partie matchee et l'afficher

Dans le même esprit :

while IFS="[]/:" read -a values
do echo "${values[0]}[$(date -d "${values[2]} ${values[1]} ${values[3]} ${values[4]}:${values[5]}:${values[6]}")]${values[7]}"
done < fichier

edit : correction pour éviter des bugs :

while IFS="[]/:" read texte1 d1 d2 d3 d4 d5 d6 texte2 
do
echo "${texte1}[$(date -d "${d2} ${d1} ${d3} ${d4}:${d5}:${d6}")]${texte2}"
done < fichier

ce qui revient au même !

Dernière modification par Totor (Le 30/08/2010, à 16:19)


-- Lucid Lynx --

Hors ligne