Utiliser awk dans Perl - Codes et scripts - Linux et OS Alternatifs
Marsh Posté le 27-06-2008 à 16:20:22
pourquoi ne pas le faire directement en perl ?
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, ...)
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.
Marsh Posté le 27-06-2008 à 16:39:02
Code :
|
edit : c'est loin d'être le plus concis, mais c'est facilement compréhensible.
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 :
|
Mais j'avais pas le résultat escompté.
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).
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
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 :
à adapter en fonction du besoin réel
Encore désolé pour le déterrage , je retourne à mes recherches ^^
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.
La commande qui fonctionne bien est :
Ca me retourne tout ce dont j'ai besoin dans mon fichier result.
Voila comment je l'appelle en PERL:
Et voila le code d'erreur en sortie :
Je ne sais pas si j'ai mis trop d'anti exrapol' ou pas...
Merci de m'avoir lu.
+