Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3024 connectés 

  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  Utiliser awk dans Perl

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Utiliser awk dans Perl

n°1055978
makiwill
Posté le 27-06-2008 à 16:13:15  profilanswer
 

Bonjour,
 
Je souhaite utiliser awk dans perl, car je l'utilise pour parser des fichiers bind dns du genre db.65.65.36.
 

Code :
  1. 202             IN      PTR     ns.bureau.lan.
  2. 202             IN      PTR     mail2.bureau.lan.
  3. 200             IN      PTR     twin1.bureau.lan.
  4. 201             IN      PTR     twin2.bureau.lan.
  5. 205             IN      PTR     portable.bureau.lan.


 
La commande qui fonctionne bien est :

Code :
  1. cat db.10.26.13 | grep PTR | awk '{OFS=":";print $1,$4}' > result


 
Ca me retourne tout ce dont j'ai besoin dans mon fichier result.
 
Voila comment je l'appelle en PERL:
 

Code :
  1. my $filedb="/home/will/upload/".param('dnsfile');
  2. my $argument=$filedb." \| grep PTR \| awk \'\{OFS=\":\"\;print \$1,\$4\}\' > result";
  3. my $list=cat($argument);


 
Et voila le code d'erreur en sortie :
 

Code :
  1. cat: /home/will/upload/: Is a directory
  2. awk: 1: unexpected character '''
  3. awk: line 1: syntax error at or near :
  4. awk: line 2: missing } near end of file
  5. Warning: unknown mime-type for ",}'" -- using "application/*"
  6. Error: no such file ",}'"
  7. Content-Type:text/html
  8. <h3 align=center>Projet  /  sous-reseaux</h3>


 
Je ne sais pas si j'ai mis trop d'anti exrapol' ou pas...
Merci de m'avoir lu.
 
+

mood
Publicité
Posté le 27-06-2008 à 16:13:15  profilanswer
 

n°1055981
ogaby
Posté le 27-06-2008 à 16:19:14  profilanswer
 

Salut
 
La syntaxe: system( "<ta commande en console>" )
 

n°1055983
black_lord
Modérateur
Truth speaks from peacefulness
Posté le 27-06-2008 à 16:20:22  profilanswer
 

pourquoi ne pas le faire directement en perl ?


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
n°1055985
darkpengui​n
Posté le 27-06-2008 à 16:30:52  profilanswer
 

black_lord a écrit :

pourquoi ne pas le faire directement en perl ?


+1
 
c'est d'ailleurs l'une des grandes forces du perl, sa capacité à traiter les chaines de caractères (et notamment les regexp, ...)


---------------
Counting all the assh*les in the room, well I'm definitely not alone...
n°1055988
makiwill
Posté le 27-06-2008 à 16:34:06  profilanswer
 

C'est que j'ai lu, en faisant mes recherches. "Pourquoi pas le tout perl?".
Je parse mon fichier en 3 commandes et le truc c'est que les fichiers DNS ont une entête assez pénible à traiter. C'est la solution pour moi la plus simple.
Après je suis ouvert à tout.

n°1055992
black_lord
Modérateur
Truth speaks from peacefulness
Posté le 27-06-2008 à 16:39:02  profilanswer
 

Code :
  1. open(FP,'<','hop');
  2.  
  3. while(<FP> )
  4. {
  5.     if ($_ =~ ".*PTR.*" )
  6.     {
  7.         my @tab=split(' ', $_);
  8.         print "$tab[0] $tab[3]\n";
  9.     }
  10. }
 

edit : c'est loin d'être le plus concis, mais c'est facilement compréhensible.


Message édité par black_lord le 27-06-2008 à 16:39:27

---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
n°1055996
makiwill
Posté le 27-06-2008 à 16:42:17  profilanswer
 

Ok je suis d'accord avec toi.
Le problème c'est que j'ai des séparateurs de champs variables en longueur. J'avais traité mes lignes avec :
 

Code :
  1. $adresse{$l}=~s/(IN|PTR)//g;
  2.                         $adresse{$l}=~s/\t+/:/g;
  3.                         $adresse{$l}=~s/\s+/:/g;
  4.                         print $adresse{$l}."\n";


Mais j'avais pas le résultat escompté.


Message édité par makiwill le 27-06-2008 à 16:42:38
n°1056002
ogaby
Posté le 27-06-2008 à 16:49:37  profilanswer
 

Si t'as des tabs et des espaces, fait un pré-traitement de ton fichier (ou buffer) et remplace les tabs par des espaces (par exemple).
 
Puis travaille sur un tableau ne contenant que des espaces (cf prog de black_lord).

n°1315856
lennelei
Posté le 10-07-2012 à 16:03:00  profilanswer
 

Désolé de remonter ça des tréfonds du forum, mais vu que ça sort en premier résultat dans Google, je me devais d'apporter quelques corrections parce que ce qui est dit ici est un peu pas très propre sans vouloir offenser personne [:tilleul]  
 
Pour commencer :

cat db.10.26.13 | grep PTR | awk '{OFS=":";print $1,$4}' > result


voici un bel exemple de Useless Use of Cat ! :)
1) cat est inutile car on peut très bien faire un grep sur un fichier :

grep PTR db.10.26.13| awk '{OFS=":";print $1,$4}' > result


2) mais en plus, grep est également inutile car awk se suffit à lui même :

awk '/PTR/ {OFS=":";print $1,$4}' db.10.26.13 > result


la partie /PTR/ indique que ce qui suit {print...} ne sera fait que pour les lignes qui comportent PTR
3) on peut même améliorer si on considère à juste titre que PTR sera dans la 3ème colonne (normalement) :

awk '$3=="PTR" {OFS=":";print $1,$4}' db.10.26.13 > result


Personnellement, pour un truc aussi simple, j'aurais tendance à faire ceci et à éviter d'ajouter du OFS :

awk '$3=="PTR" {print $1":"$4}' db.10.26.13 > result


 
Bon, ça, c'est pour la partie grep / awk / cat...
 
Pour la partie perl, j'avoue que je ne comprends même pas le but du morceau de programme... mais si il faut faire pareil que ce qu'on a avec cat/grep/awk, voici une méthode un peu plus légère et propre (à adapter au niveau regexp si on veut blinder le truc) :

perl -ne "print qq|$1:$2\n| if (/(\d+)\s+IN\s+PTR\s+([\.\w]+)/);" db.test


-ne : boucle sur un fichier passé en paramètre en lisant chaque ligne et en alimentant $_
print ... if ... affiche ce qui suit print si ce qui suit if est vrai (sinon, n'affiche rien)
qq|$1:$2\n| équivalent à "$1:$2\n" (j'utilise qq parce que je suis sous Windows), affiche le premier et le second champ capturé de la regexp (cf. ci-dessous) séparés par deux-points
/(\d+)\s+IN\s+PTR\s+([\.\w]+)/ regexp utilisée d'une part pour filtrer les lignes à afficher et d'autre part pour récupérer les 2 champs qu'on souhaite afficher ($1 et $2 du print). Cette regexp signifie que les lignes doivent être composées de :

  • un ou plusieurs chiffres \d+  > capture $1
  • un ou plusieurs espaces (ou tabulations ou ...) \s+
  • le texte IN  
  • un ou plusieurs espaces (ou tabulations ou ...) \s+  
  • le texte PTR > permet de ne prendre que les lignes PTR
  • un ou plusieurs espaces (ou tabulations ou ...) \s+
  • une suite de lettre et de . [\.\w]+  > capture $2


à adapter en fonction du besoin réel  [:spamafote]  
 
Encore désolé pour le déterrage :jap:, je retourne à mes recherches ^^

n°1315857
Modération
Posté le 10-07-2012 à 16:12:27  answer
 

déterrer pour étaler ta science, merci.


Aller à :
  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  Utiliser awk dans Perl

 

Sujets relatifs
[Perl] envoyer un mail HTML[droit] Peut on utiliser les images d'un soft open Source
utiliser les signets de kde avec firefox[Pas résolu !] Problème de script Bash dans script Perl
Utiliser des données mac sous windowsAnacron et ssh : utiliser cle ssh d'un utilisateur
Utiliser le smtp sortant d'alice avec Postfixvmware -> use: command not found ... problème de perl ??
droits pr un utilisateur d'utiliser la commande "perl" et "newusers" 
Plus de sujets relatifs à : Utiliser awk dans Perl


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR