OVH Cloud OVH Cloud

Ajouter une colonne à un fichier

13 réponses
Avatar
Hugolino
Bonjour,

J'ai un fichier généré par arpwatch qui contient des lignes contenant 3
ou 4 champs séparés par une tabulation.
Ça ressemble à ça:
8<-----------8<---------8<----------8<----------8<----------8<----------8<
0:c:76:45:cb:be 10.176.184.69 1159452619
0:10:b5:a4:f6:d8 10.176.202.9 1164988574 B-202-09
0:11:9:b9:32:6f 10.176.202.9 1160059098 B-202-09
0:2:44:16:67:58 10.176.182.131 1164897841
8<-----------8<---------8<----------8<----------8<----------8<----------8<
(Rien que cet exemple montre pourquoi je dois me palucher ce fichier)

Ce que je veux, c'est ajouter un nouveau <champ4>, qui serait la date en
human-readable (la sortie de date +%d"/"%m"/"%Y -d @<champ3>) et donc
repousser l'éventuel nom de machine comme <champ5>.
Dans l'exemple qui nous interesse, ça donnerait ça:
8<-----------8<---------8<----------8<----------8<----------8<----------8<
0:c:76:45:cb:be 10.176.184.69 1159452619 28/09/2006
0:10:b5:a4:f6:d8 10.176.202.9 1164988574 01/12/2006 B-202-09
0:11:9:b9:32:6f 10.176.202.9 1160059098 05/10/2006 B-202-09
0:2:44:16:67:58 10.176.182.131 1164897841 30/11/2006
8<-----------8<---------8<----------8<----------8<----------8<----------8<

Évidement vu la qualité des contributeurs ici, je ne doute pas que cela
sera réglé en moins de 3 minutes et 2 lignes de sed ou de awk, mais si
j'osais je demanderais en plus une petite explication didactique afin
que je puisse me débrouiller un peu seul à l'avenir.

Merci de votre aide.



--
<|Leo404|> tu peux m'aider à configurer ma connexion?
delepine| Mais encore ?
<|Leo404|> va te faire enculer
-+- Leo404 in Guide du linuxien pervers - "Connexions inavouables" -+-

10 réponses

1 2
Avatar
Stephane Chazelas
2006-12-6, 09:54(+01), Hugolino:
Bonjour,

J'ai un fichier généré par arpwatch qui contient des lignes contenant 3
ou 4 champs séparés par une tabulation.
Ça ressemble à ça:
8<-----------8<---------8<----------8<----------8<----------8<----------8<
0:c:76:45:cb:be 10.176.184.69 1159452619
0:10:b5:a4:f6:d8 10.176.202.9 1164988574 B-202-09
0:11:9:b9:32:6f 10.176.202.9 1160059098 B-202-09
0:2:44:16:67:58 10.176.182.131 1164897841
8<-----------8<---------8<----------8<----------8<----------8<----------8<
(Rien que cet exemple montre pourquoi je dois me palucher ce fichier)

Ce que je veux, c'est ajouter un nouveau <champ4>, qui serait la date en
human-readable (la sortie de date +%d"/"%m"/"%Y -d @<champ3>) et donc
repousser l'éventuel nom de machine comme <champ5>.
Dans l'exemple qui nous interesse, ça donnerait ça:
8<-----------8<---------8<----------8<----------8<----------8<----------8<
0:c:76:45:cb:be 10.176.184.69 1159452619 28/09/2006
0:10:b5:a4:f6:d8 10.176.202.9 1164988574 01/12/2006 B-202-09
0:11:9:b9:32:6f 10.176.202.9 1160059098 05/10/2006 B-202-09
0:2:44:16:67:58 10.176.182.131 1164897841 30/11/2006
8<-----------8<---------8<----------8<----------8<----------8<----------8<
[...]


gawk -F't' -v OFS='t' '{$4 = strftime("%F",$3) "t" $4}1'

-F: field separator on input
OFS: output field separator
%F: date au format 2006-10-05 (eviter 05/10/2006 qui est source
de malentendu pour les americains et qui n'est pas facile a
trier)
1: "true" condition (pour affichier la ligne).

--
Stéphane

Avatar
Hugolino
Le Wed, 06 Dec 2006 08:42:27 GMT, Stephane Chazelas a écrit:

gawk -F't' -v OFS='t' '{$4 = strftime("%F",$3) "t" $4}1'

-F: field separator on input
OFS: output field separator
%F: date au format 2006-10-05 (eviter 05/10/2006 qui est source
de malentendu pour les americains et qui n'est pas facile a
trier)
1: "true" condition (pour affichier la ligne).


OK, super. Merci pour l'explication ça m'a donné un petit exemple simple
qui m'a encouragé à ouvrir Scripts Sous Linux de C.Blaess car j'avais
ça:
gawk: {$4 = strftime("%F",$3) "t" $5 = strftime("%T",$3) "t" $4}1
^ syntax error

Et la solution est page 291: il faut séparer les actions par des
points-virgules ou des sauts de lignes.

Merci à toi


--
Dans la Vraie vie, (presque) tout le monde s'accorde à me trouver
charmante...
La vraie vie n'existe pas, c'est seulement un troll qui a eu du succès.

Hugo (né il y a 1 344 846 557 secondes)

Avatar
talon
Hugolino wrote:
Le Wed, 06 Dec 2006 08:42:27 GMT, Stephane Chazelas a écrit:

gawk -F't' -v OFS='t' '{$4 = strftime("%F",$3) "t" $4}1'

-F: field separator on input
OFS: output field separator
%F: date au format 2006-10-05 (eviter 05/10/2006 qui est source
de malentendu pour les americains et qui n'est pas facile a
trier)
1: "true" condition (pour affichier la ligne).


OK, super. Merci pour l'explication ça m'a donné un petit exemple simple
qui m'a encouragé à ouvrir Scripts Sous Linux de C.Blaess car j'avais
ça:
gawk: {$4 = strftime("%F",$3) "t" $5 = strftime("%T",$3) "t" $4}1
^ syntax error

Et la solution est page 291: il faut séparer les actions par des
points-virgules ou des sauts de lignes.

Merci à toi


Je te recommande le tutoriel suivant:
http://www.grymoire.com/Unix/Awk.html
qui explique à mon avis de façon claire et simple comment utiliser awk,
et sans se limiter (ou s'étendre...) à gawk. Je trouve que awk est un
outil formidable pour toutes sortes de petites choses - mais bon il n'y
a justement pas strftime dans le awk standard - dommage.





--

Michel TALON


Avatar
Hugolino
Le Wed, 6 Dec 2006 15:57:30 +0000 (UTC), Michel Talon a écrit:

Je te recommande le tutoriel suivant:
http://www.grymoire.com/Unix/Awk.html
qui explique à mon avis de façon claire et simple comment utiliser awk,
et sans se limiter (ou s'étendre...) à gawk. Je trouve que awk est un
outil formidable pour toutes sortes de petites choses - mais bon il n'y
a justement pas strftime dans le awk standard - dommage.


OK, de la lecture: parfait! Je suis aussi remonté d'un niveau pour y
trouver http://www.grymoire.com/Unix/Regular.html, donc merci à toi
aussi.
Et puis tu peux aussi voir ici http://www.roulaize.fr/infos-machines.php
qu'une certaine HPPA-RISC sert encore... (bon je devrais pas y mettre
des photos de 2 Go, mais elle sert ;-)

--
I still maintain the point that designing a monolithic kernel in 1991
is a fundamental error. Be thankful you are not my student. You would
not get a high grade for such a design :-)
That's ok. Einstein got lousy grades in math and physics.


Avatar
Stephane Chazelas
2006-12-6, 16:33(+01), Hugolino:
Le Wed, 06 Dec 2006 08:42:27 GMT, Stephane Chazelas a écrit:

gawk -F't' -v OFS='t' '{$4 = strftime("%F",$3) "t" $4}1'

-F: field separator on input
OFS: output field separator
%F: date au format 2006-10-05 (eviter 05/10/2006 qui est source
de malentendu pour les americains et qui n'est pas facile a
trier)
1: "true" condition (pour affichier la ligne).


OK, super. Merci pour l'explication ça m'a donné un petit exemple simple
qui m'a encouragé à ouvrir Scripts Sous Linux de C.Blaess car j'avais
ça:
gawk: {$4 = strftime("%F",$3) "t" $5 = strftime("%T",$3) "t" $4}1
^ syntax error

Et la solution est page 291: il faut séparer les actions par des
points-virgules ou des sauts de lignes.


Plutot

gawk -F't' -v OFS='t' '{$4 = strftime("%Ft%T",$3) "t" $4}1'

sinon, tu perds ton $4 original.

--
Stéphane


Avatar
Hugolino
Le Wed, 06 Dec 2006 20:51:22 GMT, Stephane Chazelas a écrit:
2006-12-6, 16:33(+01), Hugolino:
Le Wed, 06 Dec 2006 08:42:27 GMT, Stephane Chazelas a écrit:

gawk -F't' -v OFS='t' '{$4 = strftime("%F",$3) "t" $4}1'

-F: field separator on input
OFS: output field separator
%F: date au format 2006-10-05 (eviter 05/10/2006 qui est source
de malentendu pour les americains et qui n'est pas facile a
trier)
1: "true" condition (pour affichier la ligne).


OK, super. Merci pour l'explication ça m'a donné un petit exemple simple
qui m'a encouragé à ouvrir Scripts Sous Linux de C.Blaess car j'avais
ça:
gawk: {$4 = strftime("%F",$3) "t" $5 = strftime("%T",$3) "t" $4}1
^ syntax error

Et la solution est page 291: il faut séparer les actions par des
points-virgules ou des sauts de lignes.


Plutot

gawk -F't' -v OFS='t' '{$4 = strftime("%Ft%T",$3) "t" $4}1'

sinon, tu perds ton $4 original.


Oui, je n'avais pas fait gaffe. Mais pourquoi ma ligne ne marche-t-elle
pas alors que pour la tienne le champ 4 avait été préservé ?


--
J'ai une carte PCI TV2, est-il possible de la faire fonctionner ?
Non. Sauf si elle est interfacable avec un moule a gauffres SCSI,

auquel cas on veut bien etudier la question. -+- MA -+-
Hugo (né il y a 1 344 926 665 secondes)




Avatar
Stephane Chazelas
2006-12-7, 20:07(+01), Hugolino:
[...]
gawk -F't' -v OFS='t' '{$4 = strftime("%Ft%T",$3) "t" $4}1'
^^^



sinon, tu perds ton $4 original.


Oui, je n'avais pas fait gaffe. Mais pourquoi ma ligne ne marche-t-elle
pas alors que pour la tienne le champ 4 avait été préservé ?


Je rajoute le $4 original a la fin du nouveau $4.

--
Stéphane


Avatar
Hugolino
Le Thu, 07 Dec 2006 19:10:11 GMT, Stephane Chazelas a écrit:
2006-12-7, 20:07(+01), Hugolino:
[...]
gawk -F't' -v OFS='t' '{$4 = strftime("%Ft%T",$3) "t" $4}1'
^^^



sinon, tu perds ton $4 original.


Oui, je n'avais pas fait gaffe. Mais pourquoi ma ligne ne marche-t-elle
pas alors que pour la tienne le champ 4 avait été préservé ?


Je rajoute le $4 original a la fin du nouveau $4.


Veux-tu dire que le $4 n'est pas prévervé dans la commande

gawk: {$4 = strftime("%F",$3) "t"; $5 = strftime("%T",$3) "t" $4}1

car il ne "survit" pas à la séparation des deux actions par le
point-virgule ?


En tout cas merci de ton aide.

--
c'était pour moi, je ne me risquerais pas à faire du traitement de texte
avec xemacs ou vim, à moins bien sûr de coupler le tout à TeX/LaTeX.
je pourrai savoir comment on fait cela

-+- LJ in Guide du linuxien pervers - "savoir se donner des objectifs."



Avatar
Stephane Chazelas
2006-12-8, 09:50(+01), Hugolino:
Le Thu, 07 Dec 2006 19:10:11 GMT, Stephane Chazelas a écrit:
2006-12-7, 20:07(+01), Hugolino:
[...]
gawk -F't' -v OFS='t' '{$4 = strftime("%Ft%T",$3) "t" $4}1'
^^^



sinon, tu perds ton $4 original.


Oui, je n'avais pas fait gaffe. Mais pourquoi ma ligne ne marche-t-elle
pas alors que pour la tienne le champ 4 avait été préservé ?


Je rajoute le $4 original a la fin du nouveau $4.


Veux-tu dire que le $4 n'est pas prévervé dans la commande

gawk: {$4 = strftime("%F",$3) "t"; $5 = strftime("%T",$3) "t" $4}1

car il ne "survit" pas à la séparation des deux actions par le
point-virgule ?
[...]


Ben, si tu fais

a = "foo";
a = "bar";
b = a;

b va contenir "bar" et pas "foo", ca me semble logique.

awk a a peu pres la meme syntaxe que C et se comporte a peu pres
pareil.

--
Stéphane




Avatar
Hugolino
Le Fri, 08 Dec 2006 09:06:41 GMT, Stephane Chazelas a écrit:
[...]

Ben, si tu fais

a = "foo";
a = "bar";
b = a;

b va contenir "bar" et pas "foo", ca me semble logique.


Avant l'exécution de la ligne:
gawk -F't' -v OFS='t' '{$4 = strftime("%F",$3) "t" $4}1'
la variable $4 contient le nom de la machine.
Lors de l'exécution cette variable est remplacée par la date.
Mais une nouvelle variable $5 est « magiquement » créée pour stocker le
nom de la machine.

Donc je ne comprends pas ton exemple avec foobar

Merci de m'aider à comprendre

--
Mais je trouve que la salkware est bien surtout la 7.0
Ouppps excusez moi pas avoir ecorcher le nom de la distrib , c'est

slakware !! Je suis cretin
-+- Julien in Guide du linuxien pervers - L'erreur est humaine -+-

1 2