Stocker la sortie de la commande dans le tableau


23

C'est la commande: pdc status -a 2>&1 | grep 'okay'elle donne la sortie suivante

[okay     ]: you are currently listening: 33
[okay     ]: you are currently listening: 22
[okay     ]: you are currently listening: 11

J'ai écrit cette commande dans un fichier de script shell. Mais je veux stocker la sortie de cette commande dans le tableau pour un traitement sur chacune des valeurs d'index du tableau.

Comment puis-je stocker la sortie de cette commande dans le tableau?

Réponses:


24

Si vous voulez juste les chiffres à la fin de chaque ligne:

numbers=( $(pdc ... | grep -oP 'okay.+?\K\d+$') )

Si vous souhaitez stocker chaque ligne dans le tableau

mapfile -t lines < <(pdc ...)

Pour récupérer les données des tableaux:

for (( i=0; i<${#numbers[@]}; i++ )); do echo ${numbers[i]}; done
echo
printf "%s\n" "${lines[@]}"
33
22
11

[okay   ]: you are currently listening: 33
[okay   ]: you are currently listening: 22
[okay   ]: you are currently listening: 11

1
Erreur de syntaxe: redirection inattendue, lorsque j'utilisemapfile -t array < <(grep.....)
Sachith Muhandiram

Utilisez-vous bash ou un autre shell?
glenn jackman

20

Tout d'abord, vous n'avez pas nécessairement besoin du tableau, pour traiter la sortie ligne par ligne, vous pouvez faire:

pdc status -a 2>&1 | grep 'okay' | while read line; do somecommand "$line"; done

Si vous avez besoin du tableau, Glenn Jackman vous a déjà donné la meilleure façon de le faire, mais voici une autre approche:

#!/bin/bash
IFS=$'\n'
array=($(pdc status -a 2>&1 | grep 'okay'))

Explication:

  • $IFS=$'\n': $IFSest le séparateur de champ d'entrée de bash , le définir sur le caractère de nouvelle ligne uniquement ( \n) garantit que vos lignes de sortie ne seront pas divisées sur des espaces afin que vous puissiez enregistrer chaque ligne en tant qu'élément de tableau séparé. Sans cela, chaque mot de la sortie de votre commande serait un élément différent.

    Selon ce que vous voulez faire, il peut être judicieux d'enregistrer l'ancienne valeur de $IFSet de la restaurer après la lecture du tableau:

    oldifs="$IFS"
    IFS=$'\n'
    array=($(echo -e "foo bar\nbaz bar"))
    IFS="$oldifs"
  • $(command): Ceci est appelé substitution de commande et vous permet d'enregistrer la sortie d'une commande dans une variable. Il y a deux façons de le faire:

    var=$(command)

    et

    var=`command`

    Des deux, $()c'est mieux parce que:

    • Il peut gérer des commandes imbriquées:

      var=$(command1 $(command 2))

      Par exemple var=$(cat $(find ~/))

    • Il a beaucoup moins de problèmes avec les citations et entraîne une syntaxe plus propre. Voir ici pour en savoir plus.


6

Encore une autre façon plus intuitive d'utiliser la fonction readarrayintégrée (voir help -m readarray):

readarray -t array <<< "$(pdc status -a 2>&1 | grep 'okay')"

Ensuite, pour imprimer un élément de tableau, disons deuxième élément, vous pouvez utiliser:

echo "${array[1]}"

Pour imprimer tous les éléments du tableau sur des lignes distinctes, vous pouvez utiliser:

printf -- "%s\n" "${array[@]}"
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.