Extraction de données avec la commande "awk"

Résolu/Fermé
jimmy75_13 - 26 mai 2011 à 10:59
 jimmy75_13 - 26 mai 2011 à 17:07
Bonjour à toutes et à tous,

Je souhaite récuperer des données dans un fichier texte organiser comme suit :

line_number:data1_line1:data2_line1:data3_line1
line_number:data1_line2:data2_line2:data3_line2
line_number:data1_line3:data2_line3:data3_line3

Je souhaite pouvoir extracter ces données ligne par ligne grace a la commande suivante :

var='cat ${/home/jpassema/test_awk.txt} | awk -v server="" 'BEGIN {} $1 == "$line_number}" var=$2;}END{print var}''

Néanmoins je reçoit une erreur de syntaxe :

./test_awk.sh: line 26: syntax error near unexpected token 'server='cat ${/home/jpassema/test_awk.txt} | awk -v server="" 'BEGIN {} $1 == "${$i}" {server=$2;}END{print server}''

Je vous remercie d'avance pour votre aide



8 réponses

zipe31
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 590
26 mai 2011 à 16:58
En espérant que ce soit ce que tu cherches à faire...

$ cat fich
1:SERVEUR1:30:/etc/x/logs:/etc/y/logs
2:SERVEUR2:40:/usr/x/logs:/usr/y/logs:/usr/z/logs
3:SERVEUR3:50:/var/x/www:/usr/x/share/doc:/etc/x/logs

$ cat foo.sh
#! /bin/bash

#set -xv

IFS=":"
while read L SERVEUR RET LE_PATH
do
        echo "Retention = $RET"
        echo "Serveur = $SERVEUR"
        echo "Path = $LE_PATH"
        NEW_PATH=$(echo "$LE_PATH" | sed 's#:# \&\& purge #g')
        echo "ssh user@${SERVEUR} (purge ${NEW_PATH})"
        echo
done < fich

$ ./foo.sh fich
Retention = 30
Serveur = SERVEUR1
Path = /etc/x/logs:/etc/y/logs
ssh user@SERVEUR1 (purge /etc/x/logs && purge /etc/y/logs)

Retention = 40
Serveur = SERVEUR2
Path = /usr/x/logs:/usr/y/logs:/usr/z/logs
ssh user@SERVEUR2 (purge /usr/x/logs && purge /usr/y/logs && purge /usr/z/logs)

Retention = 50
Serveur = SERVEUR3
Path = /var/x/www:/usr/x/share/doc:/etc/x/logs
ssh user@SERVEUR3 (purge /var/x/www && purge /usr/x/share/doc && purge /etc/x/logs)

$


;-))
1
zipe31
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 590
26 mai 2011 à 11:17
Salut,

cat ${/home/jpassema/test_awk.txt}
La syntaxe n'est pas la bonne ;-(

Si "/home/jpassema/test_awk.txt" n'est pas une variable, les "${...}" autour ne sont pas nécessaires :
cat /home/jpassema/test_awk.txt

suffit amplement.


De plus il manque une accolade à :

== "$line_number}"

== "${line_number}"

Par contre la lecture via "cat" + un pipe est inutile, tu peux directement passer ton fichier à "awk" :

awk -v server="" 'BEGIN {} $1 == "${line_number}" var=$2;}END{print var}'  /home/jpassema/test_awk.txt



;-))
0
Salut,

Merci pour ta prompte réponse!!
Néanmoins je ne suis pas encore sorti de l'auberge......
J'ai pris en compte ta remarque et j'ai modifier la commande tel que suit:

awk -v server="" 'BEGIN {} $1 == "$i" server=$2;}END{print server}' /home/jpassema/test_awk.txt

(le i est la variable d'incrémentation de la boucle for...)

Mais il me renvoie encore l'erreur:

./test_awk.sh: line 26: syntax error near unexpected token 'awk'
./test_awk.sh: line 26: ' awk -v server="" 'BEGIN {} $1 == "$i" server=$2;}END{print server}' /home/jpassema/test_awk.txt'

Merci d'avance pour ta patience
0
zipe31
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 590
26 mai 2011 à 12:13
Ne sachant pas trop ce que tu veux faire, ça ne va pas être facile...

Déjà, il y a quelques petits couaks dans ta syntaxe de "awk" ;-(


awk -v server="" 'BEGIN {} $1 == "$i" server=$2;}END{print server}'

Soit le BEGIN est vide "{}" et dans ce cas l'accolade après le server=$2 est en trop.
Soit il faut écrire :
'BEGIN { $1 == "$i" server=$2;}
et encore il faudrait séparer les valeurs par un ";"
'BEGIN { $1 == "$i"; server=$2;}

Mais bon là aussi tout dépend de ce que tu veux faire ;-\

Donc quelle est la finalité de ton code ???
0
Mon but est le suivant :

1ere boucle for parcourant les lignes du .txt
{
commande awk pour recuperer le nom du serveur (ssh a suivre)
commande awk pour recuperer le delai de retention
2eme boucle for qui parcoure les autres champs de la ligne
{
commande awk qui recupere les repertoires de log
rotation de logs
}
}

Donc la commande que je t'ai fourni est en fait la meme ( a la variable près que les suivantes pour recuperer d'autres valeurs)
0
zipe31
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 590
26 mai 2011 à 15:04
Dis-nous exactement ce que tu veux faire comme traitement sur ton fichier qui se présente comme ceci si j'ai bien compris :

line_number:data1_line1:data2_line1:data3_line1
line_number:data1_line2:data2_line2:data3_line2
line_number:data1_line3:data2_line3:data3_line3

Parce que j'ai l'impression que tu t'embêtes pour rien (et nous avec).
Pas la peine de faire 2 boucles si le but final est de récupérer des champs en fonction de la valeur de la ligne...

Donne un exemple concret AVANT => APRES de ce que tu veux.

Merci ;-)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ce que je veux c'est placer sur chaque ligne un numero, un nom de serveur, un delai de retention et plusieurs champs contenant des repertoires.

Donc concrètement ce que je veux c'est me positionner sur une ligne, recuperer le nom de serveur pour faire un "ssh", ensuite stocker le delai de retention, et enfin de parcourir chaque repertoire pour faire une rotation de logs, avant de passer a la ligne suivante.

Voila la sequence de ce que je veux effectuer :

1. positionnement sur une ligne
a. recuperer le nom de serveur et le delai de retention ( 2 champs), puis ssh
b. se positionner sur un repertoire (1 champ) et effectuer une purge
c. parcourir les x repertoires du meme serveurs (x champs)
2. se positionner sur la ligne suivante


Encore merci de tes conseils
0
zipe31
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 590
26 mai 2011 à 15:58
1. positionnement sur une ligne
La ligne est imposée ou tu ne fais que lire ligne par ligne et traiter ?


a. recuperer le nom de serveur et le delai de retention ( 2 champs), puis ssh
b. se positionner sur un repertoire (1 champ) et effectuer une purge
c. parcourir les x repertoires du meme serveurs (x champs)

C'est toujours les même champs à récupérer ?
0
Je veux pouvoir imposer la ligne afin de terminer les opérations a effectuer sur la ligne avant de passer a la suivante.
Concrètement, pour chaque ligne j'effectuerai un ssh, j'aimerais donc finir les opérations sur un serveur avant de quitter la session et de passer à la ligne suivante.
0
zipe31
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 590
26 mai 2011 à 16:05
Ça ce n'est pas un souci...

Et ma seconde question ?

Franchement si tu avais un exemple CONCRET on avancerait beaucoup plus vite ;-\
0
Pardon j'ai zappé la deuxième question......... Les champs ne sont pas toujours les mêmes car certains serveurs ont plus de répertoires à purger que d'autres.

Prenons l'exemple suivant ( fichier .txt) :

1:SERVEUR1:30:/etc/x/logs:/etc/y/logs
2:SERVEUR2:40:/usr/x/logs:/usr/y/logs:usr/z/logs

Je veux dans un premier temps effectuer les opérations suivantes (séquentiellement):

retention=30
server=SERVEUR1
ssh user@server
path=/etc/x/logs
purge path # schématisation commande de purge
path=/etc/y/logs
purge path
exit

#passage a la ligne suivante

retention=40
server=SERVEUR2
ssh user@server
path=/usr/x/logs
purge path
path=/usr/y/logs
purge path
path=/usr/z/logs
purge path
exit
0
Tu es un champion!!!

Merci beaucoup ça marche nickel, après j'insérerai les commandes "ssh" et "purge".

je te remercie énormément pour ton aide et ta patience!!
0