Awk - problème sur le résultat obtenu, perte des FS

Bonjour à tous,

J’ai une ligne qui utilise awk pour transformer rapidement du gmt en localtime (gmt+2) sauf que je perd les FS et je trouve pas de manière de les conserver.

[code]2012-05-12 08:50:06.462957|INFO |VirtualServer | 1| client connected ‘name1’(id:41) from ip.ip.ip.ip:55401
2012-05-12 09:55:19.051825|INFO |VirtualServer | 1| client connected ‘name2’(id:13) from ip.ip.ip.ip:50176

awk -F " |:" ’ {$2=$2+2 ; print $0}’

2012-05-12 10 50 06.462957|INFO |VirtualServer | 1| client connected ‘name1’(id 41) from ip.ip.ip.ip 55401
2012-05-12 11 55 19.051825|INFO |VirtualServer | 1| client connected ‘name2’(id 13) from ip.ip.ip.ip 50176 [/code]

Comme vous le constatez les heures, les id et les ports ont perdu leurs ‘:’

J’ai testé plein de truc déjà mais rien de bon :

[code]awk -F ‘[: ]’ ‘{$2=$2+2 ; print $0}’
=> 2012-05-12 10 50 06.462957|INFO |VirtualServer | 1| client connected ‘name1’(id 41) from ip.ip.ip.ip 55401

awk -F ‘:’ ‘{$1=$1+2 ; print $0}’
=> 2014 50 06.462957|INFO |VirtualServer | 1| client connected ‘name1’(id 41) from ip.ip.ip.ip 55401

awk -F ‘[: ]’ ‘BEGIN { OFS=" " } {$2=$2+2 ; print $0}’
=> 2012-05-12 10 50 06.462957|INFO |VirtualServer | 1| client connected ‘name1’(id 41) from ip.ip.ip.ip 55401

awk -F ‘[: ]’ ‘BEGIN { OFS=":" } {$2=$2+2 ; print $0}’
=> 2012-05-12:10:50:06.462957|INFO:|VirtualServer:|:1|:client:connected:‘name1’(id:41):from:ip.ip.ip.ip:55401
[/code]

Si quelqu’un à une solution ? Y en a t-il une ?

Merci

Ps: le fond du problème sur le gmt n’est pas important, je sais que pour 23h et 24h je passe a 25h et 26h et pareil pour le gmt+2 qui devient gmt+1 en hiver

Salut swiip81,

Pourquoi ne pas garder le FS par défaut, c’est à dire les espaces,
tabulations, etc, et travailler sur les deux premiers digits de $2,
puisque ses champs internes ont une structure fixe?

Avec les fonctions de la famille sub() par exemple.

Salut,

Merci, je cherche avec cette nouvelle solution mais au final je suis bloqué au moment de l’addition

2012-05-12 08:50:06.462957|INFO |VirtualServer | 1| client connected 'name1'(id:41) from ip.ip.ip.ip:55401 awk '{sub(/(..)/,"->&<-",$2) ; print}' 2012-05-12 ->08<-:50:06.462957|INFO |VirtualServer | 1| client connected 'name1'(id:41) from ip.ip.ip.ip:55401

Je sélectionne bien les heures mais évidement après j’ai pas moyen de faire &+2 car j’obtiens 08+2 et pas 10

C’est fou comme c’est pas simple. :open_mouth:

Je viens de trouver un truc qui marche mais je trouve ça assez crade :confused:

awk '{printf $1 " " substr($2,0,2)+2 ; sub(/^.* ..:/,":",$0) ; print }' 2012-05-12 10:50:06.462957|INFO |VirtualServer | 1| client connected 'name1'(id:41) from ip.ip.ip.ip:55401

Si qq’un trouve mieux je suis toujours preneur :wink:

(Edit)
Une version avec gestion auto du décalage

[quote]
Je viens de trouver un truc qui marche mais je trouve ça assez crade :confused:
[/quote]

Non, pourquoi ce serait crade? L’essentiel, c’est le résultat.

Par contre, pour les digits, tu peux utiliser les motifs
[[:digit:]]{n}, avec n représentant le nombre de chiffres de ton
motif. Tu gagneras en clarté et tu seras plus précis dans ton
motif. Le risque de bugs sera moins important.

Regardes dans la documentation tout de même, j’écris de mémoire.

Les expressions rationnelles sont extrêmement puissantes, et le fait
de les utiliser avec les fonctions de manipulation de chaînes les
rendent quasi démoniaque! :wink:

salut,

peut-êtremawk 'BEGIN{FS=OFS="|"}{ cmd ="date \"+%F, %T.%N\" -u -d \"+2hours "$1"\""; cmd | getline myDate; $1 = myDate; print $0} fichier.log

gawk possède des fonctions time, qui pourraient aider au lieu d’appeler une commande externe.

Effectivement ça marche aussi, une intéressante façon de faire que de redonner à date le soin de modifier l’heure pour la réinjecter ensuite.

Merci

C’est d’autant mieux, que si un enregistrement a eu lieu à 23 heures nn minutes nn.nnnn secondes,
contrairement à ta méthode qui affichera «25:nn:nn.nnnnn,
`date’ fera passer au jour suivant.

Comme signalé plus haut, GNU awk dispose de fonctions date-time intéressantes pour ce problème. Il est donc possible de faire un calcul sur une date sans passer par des commandes externes. Le passage de minuit au jour ou mois suivant se fera également sans problème.

Ne marchera pas dans mawk.