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

**URL:** <https://www.debian-fr.org/t/awk-probleme-sur-le-resultat-obtenu-perte-des-fs/53302>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 12:13 UTC](https://www.debian-fr.org/t/awk-probleme-sur-le-resultat-obtenu-perte-des-fs/53302 "2016-02-21T12:13:30Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![swiip81](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/9de0a6/32.png) [@swiip81](https://www.debian-fr.org/u/swiip81)\
**Post date:** [Février 21, 2016, 12:13 UTC](https://www.debian-fr.org/t/awk-probleme-sur-le-resultat-obtenu-perte-des-fs/53302/1 "2016-02-21T12:13:30Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![valrik](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/v/db5fbb/32.png) [@valrik](https://www.debian-fr.org/u/valrik)\
**Post date:** [Février 21, 2016, 12:13 UTC](https://www.debian-fr.org/t/awk-probleme-sur-le-resultat-obtenu-perte-des-fs/53302/2 "2016-02-21T12:13:31Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![swiip81](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/9de0a6/32.png) [@swiip81](https://www.debian-fr.org/u/swiip81)\
**Post date:** [Février 21, 2016, 12:13 UTC](https://www.debian-fr.org/t/awk-probleme-sur-le-resultat-obtenu-perte-des-fs/53302/3 "2016-02-21T12:13:32Z")

</div>

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. 😮

---

<div class="post-metadata">

**Author:** ![swiip81](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/9de0a6/32.png) [@swiip81](https://www.debian-fr.org/u/swiip81)\
**Post date:** [Février 21, 2016, 12:13 UTC](https://www.debian-fr.org/t/awk-probleme-sur-le-resultat-obtenu-perte-des-fs/53302/4 "2016-02-21T12:13:35Z")

</div>

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

`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 😉

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

```auto

```

---

<div class="post-metadata">

**Author:** ![valrik](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/v/db5fbb/32.png) [@valrik](https://www.debian-fr.org/u/valrik)\
**Post date:** [Février 21, 2016, 12:13 UTC](https://www.debian-fr.org/t/awk-probleme-sur-le-resultat-obtenu-perte-des-fs/53302/5 "2016-02-21T12:13:37Z")

</div>

[quote]  
Je viens de trouver un truc qui marche mais je trouve ça assez crade 😕  
[/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! 😉

---

<div class="post-metadata">

**Author:** ![Watael](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/w/a4c791/32.png) [@Watael](https://www.debian-fr.org/u/Watael)\
**Post date:** [Février 21, 2016, 12:13 UTC](https://www.debian-fr.org/t/awk-probleme-sur-le-resultat-obtenu-perte-des-fs/53302/6 "2016-02-21T12:13:38Z")

</div>

salut,

peut-être`mawk '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.

---

<div class="post-metadata">

**Author:** ![swiip81](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/9de0a6/32.png) [@swiip81](https://www.debian-fr.org/u/swiip81)\
**Post date:** [Février 21, 2016, 12:13 UTC](https://www.debian-fr.org/t/awk-probleme-sur-le-resultat-obtenu-perte-des-fs/53302/7 "2016-02-21T12:13:39Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Watael](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/w/a4c791/32.png) [@Watael](https://www.debian-fr.org/u/Watael)\
**Post date:** [Février 21, 2016, 12:13 UTC](https://www.debian-fr.org/t/awk-probleme-sur-le-resultat-obtenu-perte-des-fs/53302/8 "2016-02-21T12:13:41Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![ripat](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/r/bc79bd/32.png) [@ripat](https://www.debian-fr.org/u/ripat)\
**Post date:** [Février 21, 2016, 12:13 UTC](https://www.debian-fr.org/t/awk-probleme-sur-le-resultat-obtenu-perte-des-fs/53302/9 "2016-02-21T12:13:44Z")

</div>

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.

```auto

```

Ne marchera pas dans mawk.
