Exraire les donnes d'un fichier
Résolu/Fermé
othmane19
Messages postés
96
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
27 avril 2013
-
9 avril 2012 à 12:43
othmane19 Messages postés 96 Date d'inscription jeudi 16 avril 2009 Statut Membre Dernière intervention 27 avril 2013 - 11 avril 2012 à 18:15
othmane19 Messages postés 96 Date d'inscription jeudi 16 avril 2009 Statut Membre Dernière intervention 27 avril 2013 - 11 avril 2012 à 18:15
A voir également:
- Exraire les donnes d'un fichier
- Fichier rar - Guide
- Comment ouvrir un fichier epub ? - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier host - Guide
- Ouvrir un fichier .bin - Guide
39 réponses
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 620
Modifié par dubcek le 9/04/2012 à 13:03
Modifié par dubcek le 9/04/2012 à 13:03
hello
$ awk -F"[ ;]" '/state free/{getline;print $3}' fichier 00:14:22:c3:38:53 00:20:d2:2b:f6:1a 00:20:d2:2b:f6:1a $ou
$ awk -F"[ ;]" '/^binding state free/{getline;print $3}' fichier 00:14:22:c3:38:53 $
othmane19
Messages postés
96
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
27 avril 2013
9 avril 2012 à 13:13
9 avril 2012 à 13:13
salut
merci pour ta reponse
reste un souci c'est que la commande m'affiche tous les adresses MAC c'est parceque il prend en consideration la ligne next binding stat , aussi alors que moi je voulais qui il regarde que binding state
merci pour ton aide
merci pour ta reponse
reste un souci c'est que la commande m'affiche tous les adresses MAC c'est parceque il prend en consideration la ligne next binding stat , aussi alors que moi je voulais qui il regarde que binding state
merci pour ton aide
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 620
9 avril 2012 à 14:26
9 avril 2012 à 14:26
c'est ce que fait la deuxième commande
mamiemando
Messages postés
33357
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
14 novembre 2024
7 799
9 avril 2012 à 13:41
9 avril 2012 à 13:41
Voici une solution que je te propose de mettre dans un fichier par exemple script.awk :
Ensuite, pour parser toto.txt :
... ce qui donne avec le fichier toto.txt :
...le résultat suivant :
Bonne chance
#/usr/bin/env awk function trim(v) { gsub(/^[ \t]+/, "", v); gsub(/[ \t]+$/, "", v); return v; } function extract(key, line) { v = trim(line); sub(key, "", v); sub(";", "", v); v = trim(v); return v; } /{/ { binding_state = hardware_address = ""; } /^[ \t]*binding state/ { binding_state = extract("binding state", $0); } /^[ \t]*hardware ethernet/ { hardware_address = extract("hardware ethernet", $0); } /}/ { if (binding_state == "active") print hardware_address; }
Ensuite, pour parser toto.txt :
awk -f script.awk toto.txt
... ce qui donne avec le fichier toto.txt :
lease 192.168.100.2 { starts 1 2012/04/02 09:54:36; ends 1 2012/04/02 09:55:48; tstp 1 2012/04/02 09:55:48; cltt 1 2012/04/02 09:54:36; binding state free; hardware ethernet 00:14:22:c3:38:53; uid "\001\000\024\"\3038S"; } lease 192.168.100.14 { starts 3 2012/04/04 14:35:26; ends 3 2012/04/04 14:36:38; cltt 3 2012/04/04 14:35:26; binding state active; next binding state free; hardware ethernet 00:20:d2:2b:f6:1a; } lease 192.168.100.14 { starts 3 2012/04/04 14:36:02; ends 3 2012/04/04 14:37:14; cltt 3 2012/04/04 14:36:02; binding state active; next binding state free; hardware ethernet 00:20:d2:2b:f6:1a; }
...le résultat suivant :
(mando@aldur) (~) $ awk -f toto.awk toto.txt 00:20:d2:2b:f6:1a 00:20:d2:2b:f6:1a
Bonne chance
othmane19
Messages postés
96
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
27 avril 2013
9 avril 2012 à 14:11
9 avril 2012 à 14:11
merci bien pour ta reponse
j'aurai aimé avoir une solution plus simple genre passer par la commande sed,
j'assaie de creuser la dessus tu pense pas q'il aurait d'autre solution plus simple en passant par sed ou autre
et merci d'avance
j'aurai aimé avoir une solution plus simple genre passer par la commande sed,
j'assaie de creuser la dessus tu pense pas q'il aurait d'autre solution plus simple en passant par sed ou autre
et merci d'avance
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 417
9 avril 2012 à 14:14
9 avril 2012 à 14:14
La solution de dubcek ici même ou la mienne dans ton autre post devrait faire l'affaire, mais il nous faut un exemple plus précis de ton fichier ;-(
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
othmane19
Messages postés
96
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
27 avril 2013
9 avril 2012 à 15:57
9 avril 2012 à 15:57
meme ce script il marche pas correctement qu'on j'ajoute une MAC avec un state free il l'affiche pas
merci d'avance de votre reponse
merci d'avance de votre reponse
mamiemando
Messages postés
33357
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
14 novembre 2024
7 799
9 avril 2012 à 18:10
9 avril 2012 à 18:10
Eh bien il suffit de corriger le test pour qu'il affiche aussi les free :
qui devient du coup :
Bonne chance
if (binding_state == "active") print hardware_address;
qui devient du coup :
if (binding_state == "active" || binding_state == "free") print hardware_address;
Bonne chance
othmane19
Messages postés
96
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
27 avril 2013
10 avril 2012 à 10:26
10 avril 2012 à 10:26
Bonjour,
je voulais afficher que les lignes dont leur time est supérieur a un time donné
voila le fichier:
Apr++4+10.10.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+13.20.d2.2b.f6.1a+via+10.10.11.1
Apr++4+09.31.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+19.20.d2.2b.f6.1a+via+10.10.11.1
Apr++4+11.10.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+13.20.d2.2b.f6.1a+via+10.10.11.1
Apr++4+09.10.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+13.20.d2.2b.f6.1a+via+10.10.11.1
Apr++4+07.45.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+13.20.d2.2b.f6.1a+via+10.10.11.1
quand j'essaie avec cette commande:
awk -F'+' ' $4 > 10 { print }' tg
j'ai cette affichage ce qui est bien
Apr++4+10.10.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+13.20.d2.2b.f6.1a+via+10.10.11.1
Apr++4+11.10.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+13.20.d2.2b.f6.1a+via+10.10.11.1
mais quand j'essaie d'afficher les ligne avec un time supérieur a 7.00(par exemple)
awk -F'+' ' $4 > 7.00 { print }' tg
il affiche rien.
je voulais savoir c'est quoi le problème.
merci d'avance de votre aide et de votre compréhension
je voulais afficher que les lignes dont leur time est supérieur a un time donné
voila le fichier:
Apr++4+10.10.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+13.20.d2.2b.f6.1a+via+10.10.11.1
Apr++4+09.31.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+19.20.d2.2b.f6.1a+via+10.10.11.1
Apr++4+11.10.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+13.20.d2.2b.f6.1a+via+10.10.11.1
Apr++4+09.10.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+13.20.d2.2b.f6.1a+via+10.10.11.1
Apr++4+07.45.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+13.20.d2.2b.f6.1a+via+10.10.11.1
quand j'essaie avec cette commande:
awk -F'+' ' $4 > 10 { print }' tg
j'ai cette affichage ce qui est bien
Apr++4+10.10.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+13.20.d2.2b.f6.1a+via+10.10.11.1
Apr++4+11.10.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+13.20.d2.2b.f6.1a+via+10.10.11.1
mais quand j'essaie d'afficher les ligne avec un time supérieur a 7.00(par exemple)
awk -F'+' ' $4 > 7.00 { print }' tg
il affiche rien.
je voulais savoir c'est quoi le problème.
merci d'avance de votre aide et de votre compréhension
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 620
10 avril 2012 à 11:02
10 avril 2012 à 11:02
othmane19
Messages postés
96
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
27 avril 2013
10 avril 2012 à 11:42
10 avril 2012 à 11:42
salut,
ok je vois merci beaucoup.
mais la je suis un peu déçu la par ce que je voulais utiliser cette commande dans un script perl ca fait un moment que je cherche est ce qui parait que perl ne support pas AWK aurez vous une idée comment résoudre ce probleme
ok je vois merci beaucoup.
mais la je suis un peu déçu la par ce que je voulais utiliser cette commande dans un script perl ca fait un moment que je cherche est ce qui parait que perl ne support pas AWK aurez vous une idée comment résoudre ce probleme
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 417
10 avril 2012 à 11:47
10 avril 2012 à 11:47
Ce que fait awk, perl peut le faire ;-)
othmane19
Messages postés
96
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
27 avril 2013
10 avril 2012 à 11:56
10 avril 2012 à 11:56
vue que j'ai jamais utilisé perl je vois pas trop comment faire je viens de voir la commande split mais comparer le champ je sais pas comment le faire
j'espère que vous aurez un idé concernant la commande
merci d'avance
j'espère que vous aurez un idé concernant la commande
merci d'avance
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 620
10 avril 2012 à 12:28
10 avril 2012 à 12:28
$ perl -e '$x=$ARGV[0] ; $x =~s/(^[\d]+\.[\d]+).*$/\1/ ; print $x, "\n"' 11.22.33 11.22 $ $ perl -e '$x=$ARGV[0] ; $x =~s/(^[\d]+\.[\d]+).*$/\1/ ; print $x, "\n"' 07.45.33 07.45 $
othmane19
Messages postés
96
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
27 avril 2013
10 avril 2012 à 12:41
10 avril 2012 à 12:41
salut
merci pour ta reponse je vois que ca fait pas le meme effet que AWk(afficher les ligne d'un fichier s'il sont sup a un time donné
j'ai pas trop compris comment tester ca?
merci d'avance
merci pour ta reponse je vois que ca fait pas le meme effet que AWk(afficher les ligne d'un fichier s'il sont sup a un time donné
j'ai pas trop compris comment tester ca?
merci d'avance
othmane19
Messages postés
96
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
27 avril 2013
10 avril 2012 à 12:44
10 avril 2012 à 12:44
tu vois pas un moyen pour intégrer cette commande sur le scipt perl?
awk -F'+' ' strtonum($4) > 10 { print }' tg
merci d'avance.
awk -F'+' ' strtonum($4) > 10 { print }' tg
merci d'avance.
othmane19
Messages postés
96
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
27 avril 2013
10 avril 2012 à 13:50
10 avril 2012 à 13:50
j'attends toujours une réponse de votre part
merci d'avance
merci d'avance
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 620
Modifié par dubcek le 10/04/2012 à 14:09
Modifié par dubcek le 10/04/2012 à 14:09
regarde a2p
NAME a2p - Awk to Perl translator SYNOPSIS a2p [options] [filename] DESCRIPTION A2p takes an awk script specified on the command line (or from standard input) and produces a comparable perl script on the standard output. ...
othmane19
Messages postés
96
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
27 avril 2013
10 avril 2012 à 14:13
10 avril 2012 à 14:13
sa ce voit que l'utilisation de cette commande sera pas evident
merci d'avance
merci d'avance
othmane19
Messages postés
96
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
27 avril 2013
10 avril 2012 à 14:17
10 avril 2012 à 14:17
j pense pas que ca va marcher vu que je voulais pas utiliser un script AWk
ce que je cherche c'est d'utiliser un script perl dans le kel j'integre la commande
merci d'avance
ce que je cherche c'est d'utiliser un script perl dans le kel j'integre la commande
merci d'avance
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 620
10 avril 2012 à 14:24
10 avril 2012 à 14:24
$ perl -ne '($c1,$c2,$c3,$c4)=split(/\+/); $c4 =~s/(^[\d]+\.[\d]+).*$/\1/ ; if($c4 > 10){print $_};' < tg Apr++4+10.10.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+13.20.d2.2b.f6.1a+via+10.10.11.1 Apr++4+11.10.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+13.20.d2.2b.f6.1a+via+10.10.11.1 $ $ perl -ne '($c1,$c2,$c3,$c4)=split(/\+/); $c4 =~s/(^[\d]+\.[\d]+).*$/\1/ ; if($c4 > 7){print $_};' < tg Apr++4+10.10.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+13.20.d2.2b.f6.1a+via+10.10.11.1 Apr++4+09.31.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+19.20.d2.2b.f6.1a+via+10.10.11.1 Apr++4+11.10.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+13.20.d2.2b.f6.1a+via+10.10.11.1 Apr++4+09.10.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+13.20.d2.2b.f6.1a+via+10.10.11.1 Apr++4+07.45.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+13.20.d2.2b.f6.1a+via+10.10.11.1 $
othmane19
Messages postés
96
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
27 avril 2013
10 avril 2012 à 14:33
10 avril 2012 à 14:33
merci beaucoup je pense que la commande fait bien son rôle
reste un petit truc, c'est que je cherche a l'exécuter sur un fichier perl et orienter son affichage vers un autre fichier
ce serait sympa de m'aider sur ce dernier petit point
et merci d'avance
reste un petit truc, c'est que je cherche a l'exécuter sur un fichier perl et orienter son affichage vers un autre fichier
ce serait sympa de m'aider sur ce dernier petit point
et merci d'avance
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 620
10 avril 2012 à 14:50
10 avril 2012 à 14:50
pour rediriger la sortie ajouter > fichier
si c'est dans un script, l'exécuter avec perl prog.pl
si c'est dans un script, l'exécuter avec perl prog.pl
othmane19
Messages postés
96
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
27 avril 2013
10 avril 2012 à 15:06
10 avril 2012 à 15:06
cette ligne ne s'execute pas dans un script perl
perl -ne '($c1,$c2,$c3,$c4)=split(/\+/); $c4 =~s/(^[\d]+\.[\d]+).*$/\1/ ; if($c4 > 7){print $_};' < tg
merci d'avance
perl -ne '($c1,$c2,$c3,$c4)=split(/\+/); $c4 =~s/(^[\d]+\.[\d]+).*$/\1/ ; if($c4 > 7){print $_};' < tg
merci d'avance
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 620
10 avril 2012 à 15:25
10 avril 2012 à 15:25
bin non, il ne faut que le code perl, mais il faut rajouter une boucle, boucle que fait implicitement l'option -n ou -p
$ perl p1 < tg Apr++4+10.10.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+13.20.d2.2b.f6.1a+via+10.10.11.1 Apr++4+11.10.11+BABALLE-01+dhcpd.+DHCPDISCOVER+from+13.20.d2.2b.f6.1a+via+10.10.11.1 $ $ cat p1 while (<>) { ($c1,$c2,$c3,$c4)=split(/\+/); $c4 =~s/(^[\d]+\.[\d]+).*$/\1/ ; if($c4 > 10){print $_} }