Script BASH : récupération variable dans fichier txt
Résolu
gtasplinter
Messages postés
11
Date d'inscription
Statut
Membre
Dernière intervention
-
gtasplinter Messages postés 11 Date d'inscription Statut Membre Dernière intervention -
gtasplinter Messages postés 11 Date d'inscription Statut Membre Dernière intervention -
Bonjour à tous,
Je suis sous Redhat et j'aimerai faire un script qui me permet de récupérer dans un fichier des variables. le problème est que mon fichier n'est pas formaté de la même façon.
Pour être plus claire, voilà un exemple de la tête de mon fichier : (les éléments que je veux récupérer et stocker sont en gras)
toto.txt :
;*************
; A records
;*************
lplppkokogrgrr 3600 IN A 19.65.12.21
LOkfeokOOkfeooe 3600 IN A 19.66.64.2
;****************
; CNAME records
;****************
mpofk.toto.fr. 3600 IN CNAME 0TuTTfTdTIfIfOdO.toto.fr.
okgor.toto.fr. 3600 IN CNAME MUMUMUMUPKIOKIU.toto.fr.
zfplepfkNC.toto.fr. 3600 IN CNAME MUMUMUMUPKIOKIU.toto.fr.
;************************************
; Other resource records
;************************************
sepogksepoke.toto.fr. IN CNAME plppkokogrgrr.toto.fr.
OKZOKDZO.toto.fr. IN CNAME plppkokogrgrr.toto.fr.
toto.fr. 600 IN A 19.83.190.2
lpuo 300 IN A 19.83.12.3
Donc en gros, ce que je voudrai faire c'est trouver des commandes qui permettent de récupérer dans 2 variables les infos en gras et les copier dans un nouveau fichier. (A savoir que j'ai plusieurs espace entre les différent champs : variable1 <X espaces> 3600 <X espaces> IN <X espaces> A <X espaces> variable 2)
Je suis sous Redhat et j'aimerai faire un script qui me permet de récupérer dans un fichier des variables. le problème est que mon fichier n'est pas formaté de la même façon.
Pour être plus claire, voilà un exemple de la tête de mon fichier : (les éléments que je veux récupérer et stocker sont en gras)
toto.txt :
;*************
; A records
;*************
lplppkokogrgrr 3600 IN A 19.65.12.21
LOkfeokOOkfeooe 3600 IN A 19.66.64.2
;****************
; CNAME records
;****************
mpofk.toto.fr. 3600 IN CNAME 0TuTTfTdTIfIfOdO.toto.fr.
okgor.toto.fr. 3600 IN CNAME MUMUMUMUPKIOKIU.toto.fr.
zfplepfkNC.toto.fr. 3600 IN CNAME MUMUMUMUPKIOKIU.toto.fr.
;************************************
; Other resource records
;************************************
sepogksepoke.toto.fr. IN CNAME plppkokogrgrr.toto.fr.
OKZOKDZO.toto.fr. IN CNAME plppkokogrgrr.toto.fr.
toto.fr. 600 IN A 19.83.190.2
lpuo 300 IN A 19.83.12.3
Donc en gros, ce que je voudrai faire c'est trouver des commandes qui permettent de récupérer dans 2 variables les infos en gras et les copier dans un nouveau fichier. (A savoir que j'ai plusieurs espace entre les différent champs : variable1 <X espaces> 3600 <X espaces> IN <X espaces> A <X espaces> variable 2)
A voir également:
- Script BASH : récupération variable dans fichier txt
- Script vidéo youtube - Guide
- Mas script - Accueil - Windows
- Ghost script - Télécharger - Polices de caractères
- Bingo bash - Télécharger - Divers Jeux
- Bash addition ✓ - Forum Shell
13 réponses
modification pour avoir des tabs en sortie
$ awk -F"\t" '/IN\tA/ {t[$1]=$NF} /IN\tCNAME/ {x=$0; FS="[.\t]*"; $0=x; c=$(NF-3); a[c]=a[c] "\t" $1; OFS=FS="\t"} END{for(n in t)print t[n], n, a[n]}' a11 19.83.12.3 lpuo 19.66.64.2 MOkfeokOOkfeooe okgor sepogksepoke OKZOKDZO 19.65.12.21 lplppkokogrgrr mpofk $
$ awk -v OFS='\t' '/IN[ \t]+A/ {t[$NF]=t[$NF] OFS $1} /IN[ \t]+CNAME/ {split($NF, t1, "."); split($1, t2, "."); a[t1[1]]=a[t1[1]] OFS t2[1]} END{for(n in t){split(t[n], t3); print n, t[n], a[t3[1]]}}' test| sort 19.65.12.21 lplppkokogrgrr ldap mpofk 19.66.64.2 MOkfeokOOkfeooe RESEAU okgor sepogksepoke OKZOKDZO 19.83.12.4 lpuo 19.84.12.3 toto.fr. 19.84.220.2 toto.fr. 19.84.92.2 toto.fr. $ $
Salut,
$ cat plop ;************* ; A records ;************* lplppkokogrgrr 3600 IN A 19.65.12.21 LOkfeokOOkfeooe 3600 IN A 19.66.64.2 ;**************** ; CNAME records ;**************** mpofk.toto.fr. 3600 IN CNAME 0TuTTfTdTIfIfOdO.toto.fr. okgor.toto.fr. 3600 IN CNAME MUMUMUMUPKIOKIU.toto.fr. zfplepfkNC.toto.fr. 3600 IN CNAME MUMUMUMUPKIOKIU.toto.fr. ;************************************ ; Other resource records ;************************************ sepogksepoke.toto.fr. IN CNAME plppkokogrgrr.toto.fr. OKZOKDZO.toto.fr. IN CNAME plppkokogrgrr.toto.fr. toto.fr. 600 IN A 19.83.190.2 lpuo 300 IN A 19.83.12.3 $ awk '/IN CNAME/ || /IN A/ { print $1,$NF }' plop lplppkokogrgrr 19.65.12.21 LOkfeokOOkfeooe 19.66.64.2 mpofk.toto.fr. 0TuTTfTdTIfIfOdO.toto.fr. okgor.toto.fr. MUMUMUMUPKIOKIU.toto.fr. zfplepfkNC.toto.fr. MUMUMUMUPKIOKIU.toto.fr. sepogksepoke.toto.fr. plppkokogrgrr.toto.fr. OKZOKDZO.toto.fr. plppkokogrgrr.toto.fr. toto.fr. 19.83.190.2 lpuo 19.83.12.3 $
hello
faut-il quand même passer par des variables ?
faut-il quand même passer par des variables ?
awk '/^[^;]/ {print $1, $NF}' fichier > nouveau_fichier
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
OK merci :)
Il reste bien les infos dont j'ai besoin (il faut retirer le nom de domaine toto.fr mais un simple "sed " devrait faire l'affaire). Par contre, j'ai besoin de les mettre en variable. Enfin c'est l'idée que j'avais, car j'ai besoin de récupérer les infos pour pouvoir faire un affichage comme dans /etc/hosts
Avec donc :
@IP Host CNAME
(pour CNAME il fait vérifier la derniere variable et la rajouter derriere cette derniere si elle est présente)
Exemple :
toto.txt
lplppkokogrgrr 3600 IN A 19.65.12.21
;****************
; CNAME records
;****************
mpofk.toto.fr. 3600 IN CNAME lplppkokogrgrr.toto.fr.
fichier de sortie :
19.65.12.21 lplppkokogrgrr mpofk
etc......
Il reste bien les infos dont j'ai besoin (il faut retirer le nom de domaine toto.fr mais un simple "sed " devrait faire l'affaire). Par contre, j'ai besoin de les mettre en variable. Enfin c'est l'idée que j'avais, car j'ai besoin de récupérer les infos pour pouvoir faire un affichage comme dans /etc/hosts
Avec donc :
@IP Host CNAME
(pour CNAME il fait vérifier la derniere variable et la rajouter derriere cette derniere si elle est présente)
Exemple :
toto.txt
lplppkokogrgrr 3600 IN A 19.65.12.21
;****************
; CNAME records
;****************
mpofk.toto.fr. 3600 IN CNAME lplppkokogrgrr.toto.fr.
fichier de sortie :
19.65.12.21 lplppkokogrgrr mpofk
etc......
essayer
$ cat a1 lplppkokogrgrr 3600 IN A 19.65.12.21 ;**************** ; CNAME records ;**************** mpofk.toto.fr. 3600 IN CNAME lplppkokogrgrr.toto.fr. $ awk '/IN A/ {t[$1]=$NF} /IN CNAME/ {x=$0; FS="[. ]*"; $0=x; print t[$(NF-3)], $(NF-3), $1}' a1 19.65.12.21 lplppkokogrgrr mpofk $
j'ai essayé avec :
p]# cat test.txt
;*************
; A records
;*************
lplppkokogrgrr 3600 IN A 19.65.12.21
MOkfeokOOkfeooe 3600 IN A 19.66.64.2
;****************
; CNAME records
;****************
mpofk.toto.fr. 3600 IN CNAME lplppkokogrgrr.toto.fr.
okgor.toto.fr. 3600 IN CNAME MOkfeokOOkfeooe.toto.fr.
;************************************
; Other resource records
;************************************
sepogksepoke.toto.fr. IN CNAME MOkfeokOOkfeooe.toto.fr.
OKZOKDZO.toto.fr. IN CNAME MOkfeokOOkfeooe.toto.fr.
lpuo 300 IN A 19.83.12.3
]# awk '/IN A/ {t[$1]=$NF} /IN CNAME/ {x=$0; FS="[. ]*"; $0=x; print t[$(NF-3)], $(NF-3), $1}' test.txt > ResultatT.txt
]# cat ResultatT.txt
19.65.12.21 lplppkokogrgrr mpofk
19.66.64.2 MOkfeokOOkfeooe okgor
19.66.64.2 MOkfeokOOkfeooe sepogksepoke
19.66.64.2 MOkfeokOOkfeooe OKZOKDZO
C'est pas exactement ce que je voudrai :
(il faudrai qu'il n'y ai qu'une seula dresse IP identique par ligne et donc que les nom se rajoute sur le meme ligne)
19.65.12.21 avec une tabulation lplppkokogrgrr mpofk
19.66.64.2 avec une tabulation MOkfeokOOkfeooe okgor sepogksepoke OKZOKDZO
19.83.12.3 avec une tabulation lpuo
Et sinon j'ai essayer la même chose avec comme mais avec un fichier qui contient des tabulation entre chaque champ. voir exemple sur les 2 première ligne, idem sur toutes les autres. (Avec la meme commande awk ça ne marche pas)
# cat test.txt
;*************
; A records
;*************
lplppkokogrgrr avec une tabulation 3600 avec une tabulationIN avec une tabulation A avec une tabulation19.65.12.21
MOkfeokOOkfeooe avec une tabulation3600 avec une tabulationIN avec une tabulationA avec une tabulation19.66.64.2
;****************
; CNAME records
;****************
mpofk.toto.fr. 3600 IN CNAME lplppkokogrgrr.toto.fr.
okgor.toto.fr. 3600 IN CNAME MOkfeokOOkfeooe.toto.fr.
;************************************
; Other resource records
;************************************
sepogksepoke.toto.fr. IN CNAME MOkfeokOOkfeooe.toto.fr.
OKZOKDZO.toto.fr. IN CNAME MOkfeokOOkfeooe.toto.fr.
lpuo 300 IN A 19.83.12.3
DSL, mais je ne maîtrise pas beaucoup la commande awk.
p]# cat test.txt
;*************
; A records
;*************
lplppkokogrgrr 3600 IN A 19.65.12.21
MOkfeokOOkfeooe 3600 IN A 19.66.64.2
;****************
; CNAME records
;****************
mpofk.toto.fr. 3600 IN CNAME lplppkokogrgrr.toto.fr.
okgor.toto.fr. 3600 IN CNAME MOkfeokOOkfeooe.toto.fr.
;************************************
; Other resource records
;************************************
sepogksepoke.toto.fr. IN CNAME MOkfeokOOkfeooe.toto.fr.
OKZOKDZO.toto.fr. IN CNAME MOkfeokOOkfeooe.toto.fr.
lpuo 300 IN A 19.83.12.3
]# awk '/IN A/ {t[$1]=$NF} /IN CNAME/ {x=$0; FS="[. ]*"; $0=x; print t[$(NF-3)], $(NF-3), $1}' test.txt > ResultatT.txt
]# cat ResultatT.txt
19.65.12.21 lplppkokogrgrr mpofk
19.66.64.2 MOkfeokOOkfeooe okgor
19.66.64.2 MOkfeokOOkfeooe sepogksepoke
19.66.64.2 MOkfeokOOkfeooe OKZOKDZO
C'est pas exactement ce que je voudrai :
(il faudrai qu'il n'y ai qu'une seula dresse IP identique par ligne et donc que les nom se rajoute sur le meme ligne)
19.65.12.21 avec une tabulation lplppkokogrgrr mpofk
19.66.64.2 avec une tabulation MOkfeokOOkfeooe okgor sepogksepoke OKZOKDZO
19.83.12.3 avec une tabulation lpuo
Et sinon j'ai essayer la même chose avec comme mais avec un fichier qui contient des tabulation entre chaque champ. voir exemple sur les 2 première ligne, idem sur toutes les autres. (Avec la meme commande awk ça ne marche pas)
# cat test.txt
;*************
; A records
;*************
lplppkokogrgrr avec une tabulation 3600 avec une tabulationIN avec une tabulation A avec une tabulation19.65.12.21
MOkfeokOOkfeooe avec une tabulation3600 avec une tabulationIN avec une tabulationA avec une tabulation19.66.64.2
;****************
; CNAME records
;****************
mpofk.toto.fr. 3600 IN CNAME lplppkokogrgrr.toto.fr.
okgor.toto.fr. 3600 IN CNAME MOkfeokOOkfeooe.toto.fr.
;************************************
; Other resource records
;************************************
sepogksepoke.toto.fr. IN CNAME MOkfeokOOkfeooe.toto.fr.
OKZOKDZO.toto.fr. IN CNAME MOkfeokOOkfeooe.toto.fr.
lpuo 300 IN A 19.83.12.3
DSL, mais je ne maîtrise pas beaucoup la commande awk.
avec des tabs comme séparateurs
$ awk -F"\t" '/IN\tA/ {t[$1]=$NF} /IN\tCNAME/ {x=$0; FS="[.\t]*"; $0=x; c=$(NF-3); a[c]=a[c] "\t" $1; FS="\t"} END{for(n in t)print t[n], n, a[n]}' test.txt 19.83.12.3 lpuo 19.66.64.2 MOkfeokOOkfeooe okgor sepogksepoke OKZOKDZO 19.65.12.21 lplppkokogrgrr mpofk $
Merci encore de m'aider,
j'ai essayé la commande suivante :
]# awk -F"\t" '/IN\tA/ {t[$1]=$NF} /IN\tCNAME/ {x=$0; FS="[.\t]*"; $0=x; c=$(NF-3); a[c]=a[c] "\t" $1; OFS=FS="\t"} END{for(n in t)print t[n], n, a[n]}' Test > Resultat.txt
Le problème est que je me retrouve avec un fichier vide en sortie :(
Test.txt :
]# cat Test.txt
;*************
; A records
;*************
lplppkokogrgrr 3600 IN A 19.65.12.21
MOkfeokOOkfeooe 3600 IN A 19.66.64.2
;****************
; CNAME records
;****************
mpofk.toto.fr. 3600 IN CNAME lplppkokogrgrr.toto.fr.
okgor.toto.fr. 3600 IN CNAME MOkfeokOOkfeooe.toto.fr.
;************************************
; Other resource records
;************************************
sepogksepoke.toto.fr. IN CNAME MOkfeokOOkfeooe.toto.fr.
OKZOKDZO.toto.fr. IN CNAME MOkfeokOOkfeooe.toto.fr.
lpuo 300 IN A 19.83.12.3
j'ai essayé la commande suivante :
]# awk -F"\t" '/IN\tA/ {t[$1]=$NF} /IN\tCNAME/ {x=$0; FS="[.\t]*"; $0=x; c=$(NF-3); a[c]=a[c] "\t" $1; OFS=FS="\t"} END{for(n in t)print t[n], n, a[n]}' Test > Resultat.txt
Le problème est que je me retrouve avec un fichier vide en sortie :(
Test.txt :
]# cat Test.txt
;*************
; A records
;*************
lplppkokogrgrr 3600 IN A 19.65.12.21
MOkfeokOOkfeooe 3600 IN A 19.66.64.2
;****************
; CNAME records
;****************
mpofk.toto.fr. 3600 IN CNAME lplppkokogrgrr.toto.fr.
okgor.toto.fr. 3600 IN CNAME MOkfeokOOkfeooe.toto.fr.
;************************************
; Other resource records
;************************************
sepogksepoke.toto.fr. IN CNAME MOkfeokOOkfeooe.toto.fr.
OKZOKDZO.toto.fr. IN CNAME MOkfeokOOkfeooe.toto.fr.
lpuo 300 IN A 19.83.12.3
non, j'ai modifier le nom de mon fichier d'origine avant de poster mon message mais j'ai oublier de rajouter l'extension. Mais le problème ne viens pas de là.
j'ai donc bien mon fichier : Test.txt (avec les infos ci-dessus) et la commande :
awk -F"\t" '/IN\tA/ {t[$1]=$NF} /IN\tCNAME/ {x=$0; FS="[.\t]*"; $0=x; c=$(NF-3); a[c]=a[c] "\t" $1; OFS=FS="\t"} END{for(n in t)print t[n], n, a[n]}' Test.txt > Resultat.txt
Resultat.txt => vide
j'ai donc bien mon fichier : Test.txt (avec les infos ci-dessus) et la commande :
awk -F"\t" '/IN\tA/ {t[$1]=$NF} /IN\tCNAME/ {x=$0; FS="[.\t]*"; $0=x; c=$(NF-3); a[c]=a[c] "\t" $1; OFS=FS="\t"} END{for(n in t)print t[n], n, a[n]}' Test.txt > Resultat.txt
Resultat.txt => vide
Bonjour, j'aurai une dernière question. Après quelque test j'ai remarqué un problème.
Dans le cas ou mon fichier d'origine est :
[root@099-lab-scm1 TestVitalQIP]# cat Test
;*************
; A records
;*************
lplppkokogrgrr 3600 IN A 19.65.12.21
MOkfeokOOkfeooe 3600 IN A 19.66.64.2
;****************
; CNAME records
;****************
mpofk.toto.fr. 3600 IN CNAME lplppkokogrgrr.toto.fr.
okgor.toto.fr. 3600 IN CNAME MOkfeokOOkfeooe.toto.fr.
;************************************
; Other resource records
;************************************
sepogksepoke.toto.fr. IN CNAME MOkfeokOOkfeooe.toto.fr.
OKZOKDZO.toto.fr. IN CNAME MOkfeokOOkfeooe.toto.fr.
lpuo 300 IN A 19.83.12.4
toto.fr. 600 IN A 19.84.220.2
toto.fr. 600 IN A 19.84.92.2
toto.fr. 600 IN A 19.84.12.3
ldap 300 IN A 19.65.12.21
RESEAU 3600 IN A 19.66.64.2
Après la commande j'ai :
[root@099-lab-scm1 TestVitalQIP]# awk '/IN A/ {t[$1]=$NF} /IN CNAME/ {x=$0; FS="[.\t ]*"; $0=x; c=$(NF-3); a[c]=a[c] "\t" $1; OFS="\t"; FS="[ \t]*"} END{for(n in t)print t[n], n, a[n]}' Test | sort
19.65.12.21 ldap
19.65.12.21 lplppkokogrgrr mpofk
19.66.64.2 MOkfeokOOkfeooe okgor sepogksepoke OKZOKDZO
19.66.64.2 RESEAU
19.83.12.4 lpuo
19.84.12.3 toto.fr.
Il me manque :
19.84.220.2 toto.fr.
19.84.92.2 toto.fr.
Et je voudrai que mon nom "RESEAU" se rajouter a la ligne 19.66.64.2 idem pour ldap en 19.65.12.21 et ainsi de suite...
Dans le cas ou mon fichier d'origine est :
[root@099-lab-scm1 TestVitalQIP]# cat Test
;*************
; A records
;*************
lplppkokogrgrr 3600 IN A 19.65.12.21
MOkfeokOOkfeooe 3600 IN A 19.66.64.2
;****************
; CNAME records
;****************
mpofk.toto.fr. 3600 IN CNAME lplppkokogrgrr.toto.fr.
okgor.toto.fr. 3600 IN CNAME MOkfeokOOkfeooe.toto.fr.
;************************************
; Other resource records
;************************************
sepogksepoke.toto.fr. IN CNAME MOkfeokOOkfeooe.toto.fr.
OKZOKDZO.toto.fr. IN CNAME MOkfeokOOkfeooe.toto.fr.
lpuo 300 IN A 19.83.12.4
toto.fr. 600 IN A 19.84.220.2
toto.fr. 600 IN A 19.84.92.2
toto.fr. 600 IN A 19.84.12.3
ldap 300 IN A 19.65.12.21
RESEAU 3600 IN A 19.66.64.2
Après la commande j'ai :
[root@099-lab-scm1 TestVitalQIP]# awk '/IN A/ {t[$1]=$NF} /IN CNAME/ {x=$0; FS="[.\t ]*"; $0=x; c=$(NF-3); a[c]=a[c] "\t" $1; OFS="\t"; FS="[ \t]*"} END{for(n in t)print t[n], n, a[n]}' Test | sort
19.65.12.21 ldap
19.65.12.21 lplppkokogrgrr mpofk
19.66.64.2 MOkfeokOOkfeooe okgor sepogksepoke OKZOKDZO
19.66.64.2 RESEAU
19.83.12.4 lpuo
19.84.12.3 toto.fr.
Il me manque :
19.84.220.2 toto.fr.
19.84.92.2 toto.fr.
Et je voudrai que mon nom "RESEAU" se rajouter a la ligne 19.66.64.2 idem pour ldap en 19.65.12.21 et ainsi de suite...
effectivement, en utilisant le nom comme index, plusieurs fois le même nom posait un problème, essayer
$ awk '/IN[ \t]+A/ {t[$1, $NF]=$NF} /IN[ \t]+CNAME/ {x=$0; FS="[. \t]*"; $0=x; c=$(NF-3); a[c]=a[c] "\t" $1; OFS="\t"; FS="[ \t]*"} END{for(n in t){split(n, b, SUBSEP); print t[n], b[1], a[b[1]]}}' test | sort 19.65.12.21 ldap 19.65.12.21 lplppkokogrgrr mpofk 19.66.64.2 MOkfeokOOkfeooe okgor sepogksepoke OKZOKDZO 19.66.64.2 RESEAU 19.83.12.4 lpuo 19.84.12.3 toto.fr. 19.84.220.2 toto.fr. 19.84.92.2 toto.fr. $il accepte un nombre quelconque d'espaces ou/et de tabs comme séparateurs de champs
Oui c'est beaucoup mieux :)
C 'est possible de voir le 2 eme point ? C'est a dire d'avoir :
19.65.12.21 lplppkokogrgrr mpofk ldap
19.66.64.2 MOkfeokOOkfeooe okgor sepogksepoke OKZOKDZO RESEAU
19.83.12.4 lpuo
19.84.12.3 toto.fr.
19.84.220.2 toto.fr.
19.84.92.2 toto.fr.
A la place de :
19.65.12.21 ldap
19.65.12.21 lplppkokogrgrr mpofk
19.66.64.2 MOkfeokOOkfeooe okgor sepogksepoke OKZOKDZO
19.66.64.2 RESEAU
19.83.12.4 lpuo
19.84.12.3 toto.fr.
19.84.220.2 toto.fr.
19.84.92.2 toto.fr.
C 'est possible de voir le 2 eme point ? C'est a dire d'avoir :
19.65.12.21 lplppkokogrgrr mpofk ldap
19.66.64.2 MOkfeokOOkfeooe okgor sepogksepoke OKZOKDZO RESEAU
19.83.12.4 lpuo
19.84.12.3 toto.fr.
19.84.220.2 toto.fr.
19.84.92.2 toto.fr.
A la place de :
19.65.12.21 ldap
19.65.12.21 lplppkokogrgrr mpofk
19.66.64.2 MOkfeokOOkfeooe okgor sepogksepoke OKZOKDZO
19.66.64.2 RESEAU
19.83.12.4 lpuo
19.84.12.3 toto.fr.
19.84.220.2 toto.fr.
19.84.92.2 toto.fr.