Utiliser awk dans Perl

Utiliser awk dans Perl - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 27-06-2008 à 16:13:15    

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

Reply

Marsh Posté le 27-06-2008 à 16:13:15   

Reply

Marsh Posté le 27-06-2008 à 16:19:14    

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

Reply

Marsh Posté le 27-06-2008 à 16:20:22    

pourquoi ne pas le faire directement en perl ?


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 27-06-2008 à 16:30:52    

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

Marsh Posté le 27-06-2008 à 16:34:06    

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.

Reply

Marsh Posté le 27-06-2008 à 16:39:02    

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
Reply

Marsh Posté le 27-06-2008 à 16:42:17    

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
Reply

Marsh Posté le 27-06-2008 à 16:49:37    

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

Reply

Marsh Posté le 10-07-2012 à 16:03:00    

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 ^^

Reply

Marsh Posté le 10-07-2012 à 16:12:27    

déterrer pour étaler ta science, merci.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed