Récupérer les lignes dans un array à la sortie d'un pipe

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour ! Dans la catégorie "je fais des trucs dégeux avec Linux", voici mon problème. :p

Lorsque j'interroge mon serveur de licences, j'obtiens un paquet de lignes (inutiles) et j'en retire seulement certaines à l'aide d'un trifouillage à coup de sed. Le résultat obtenu en console contient bien les lignes et uniquement les lignes que je souhaite garder.

Voici ma commande :

1
/softs/ma_commande_qui_renvoie_plein_de_lignes | sed -n '/"motclef"/,/-----/p' | sed '1,3d' | head -n -4

Cette commande me renvoie donc une série de lignes (je ne sais pas combien lorsque je lance ma commande) que j'aimerais pouvoir traiter et parser séparément. Je pensais les taper dans un array mais je ne vois pas bien comment faire. Une idée ?

Merci d'avance.

Zestons !

+0 -0

Cette réponse a aidé l'auteur du sujet

Bonjour,

Je ne pense pas que ça réponde exactement à ta question, mais ça pourrait donner une piste pour démarrer.

1
2
3
4
5
6
7
  troislines=$(tail -3 ${i}/ed111.dumb)
  export IFS="\t\n"
  k=1
  while read line; do
   lines[k]=${line}
   k=`echo "${k}+1"|bc -l`
  done < <(echo $troislines|awk '{print $0}')

Donc comme toi j'avais trois ligne que je voulais mettre dans un tableau. Je ne prétends pas que ce soit efficace ou esthétique, je suis même prêt à prétendre le contraire, mais ça fonctionne.

Auteur du sujet

~~Tu as essayé

1
declare -a a=($(commande exécutée qui produit des lignes) )

?~~

Edit: j'ai rien dit.

lmghs

Ca n'a pas l'air de fonctionner. Le me crée un array avec le contenu, mais séparé mot par mot et non ligne par ligne.

Je vais peut-être dire une bêtise mais, pourquoi ne pas écrire le résultat dans un fichier que tu traites ligne par ligne?

Xia

Why not, mais c'est ma solution "dernier recours". D'autant plus que des processus concurrents pourraient utiliser la commande en parallèle. Il faudrait du coup un fichier avec un nom unique, etc… Un joyeux petit bordel. Avec la quantité de commandes de unix, il y a certainement une meilleure méthode.

Bonjour,

Je ne pense pas que ça réponde exactement à ta question, mais ça pourrait donner une piste pour démarrer.

1
2
3
4
5
6
7
  troislines=$(tail -3 ${i}/ed111.dumb)
  export IFS="\t\n"
  k=1
  while read line; do
   lines[k]=${line}
   k=`echo "${k}+1"|bc -l`
  done < <(echo $troislines|awk '{print $0}')

Donc comme toi j'avais trois ligne que je voulais mettre dans un tableau. Je ne prétends pas que ce soit efficace ou esthétique, je suis même prêt à prétendre le contraire, mais ça fonctionne.

Rockaround

Même problème que pour l'idée de lmghs. Ca crée un array de mots et non un array de lignes.

Zestons !

+0 -0
Auteur du sujet

J'ai une solution avec la commande tr. C'est un peu crade, mais ça fonctionne.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
strlines=$(/softs/ma_commande | sed -ne "/\"monpattern\"/,/-----/p" | sed '1,3d' | head -n -4 | tr '\n' '#')

lines=()
i=1
while true
do
    line=$(echo $strlines | cut -d '#' -f $i)
    if [[ $line = '' ]]
    then
        break
    fi
    lines+=("$line")
    i=$((i+1))
done

n=${#lines[@]}
echo $n
for ((i = 0; i < $n; i += 1))
do
    echo ${lines[$i]}
done

Zestons !

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte