Extraction de données avec la commande "awk"

Résolu
jimmy75_13 -  
 jimmy75_13 -
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

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    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
  2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    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
  3. jimmy75_13
     
    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
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      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
  4. jimmy75_13
     
    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
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. jimmy75_13
     
    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
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      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
  7. jimmy75_13
     
    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
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Ça ce n'est pas un souci...

      Et ma seconde question ?

      Franchement si tu avais un exemple CONCRET on avancerait beaucoup plus vite ;-\
      0
  8. jimmy75_13
     
    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
  9. jimmy75_13
     
    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