web-dev-qa-db-fra.com

Comment attribuer la sortie d'une commande à un tableau?

J'ai besoin d'assigner les résultats d'un grep à un tableau ... par exemple

grep -n "search term" file.txt | sed 's/:.*//'

Cela a abouti à un groupe de lignes avec des numéros de ligne dans lesquels le terme de recherche a été trouvé.

1
3
12
19

Quel est le moyen le plus simple de les affecter à un tableau bash? Si je les attribue simplement à une variable, ils deviennent une chaîne séparée par des espaces.

61
ceiling cat

Pour affecter la sortie d'une commande à un tableau, vous devez utiliser une substitution de commande à l'intérieur d'une affectation de tableau. Pour une commande générale command, cela ressemble à:

arr=( $(command) )

Dans l'exemple du PO, cela se lirait comme suit:

arr=($(grep -n "search term" file.txt | sed 's/:.*//'))

Inner $() exécute la commande tandis que externe () Fait en sorte que la sortie soit un tableau. Le problème, c'est que cela ne fonctionnera pas lorsque la sortie de la commande contient des espaces. Pour gérer cela, vous pouvez définir IFS sur \n.

IFS=$'\n'
arr=($(grep -n "search term" file.txt | sed 's/:.*//'))
unset IFS

Vous pouvez également éliminer le besoin de sed en effectuant une expansion sur chaque élément du tableau:

arr=($(grep -n "search term" file.txt))
arr=("${arr[@]%%:*}")
112
jordanm

Les chaînes séparées par des espaces sont facilement parcourables en bash.

# save the ouput
output=$(grep -n "search term" file.txt | sed 's/:.*//')

# iterating by for.
for x in $output; do echo $x; done;

# awk
echo $out | awk '{for(i=1;i<=NF;i++) print $i;}'

# convert to an array
ar=($out)
echo ${ar[3]} # echos 4th element

si vous pensez à l’espace dans le nom du fichier, utilisez find . -printf "\"%p\"\n"

6
Shiplu Mokaddim