Come posso assegnare l'output di un comando in un array?
-
12-11-2019 - |
Domanda
Devo assegnare i risultati da a grep
a un array ... per esempio
grep -n "search term" file.txt | sed 's/:.*//'
Ciò ha provocato un sacco di righe con numeri di linea in cui è stato trovato il termine di ricerca.
1
3
12
19
Qual è il modo più semplice per assegnarli a un array di bash? Se li assegno semplicemente a una variabile diventano una stringa separata nello spazio.
Soluzione
Per assegnare l'output di un comando a un array, è necessario utilizzare una sostituzione del comando all'interno di un incarico di array. Per un comando generale command
Sembra:
arr=( $(command) )
Nell'esempio dell'OP, questo avrebbe letto:
arr=($(grep -n "search term" file.txt | sed 's/:.*//'))
L'interno $()
esegue il comando mentre l'esterno ()
fa sì che l'output sia un array. Il problema è che non funzionerà quando l'output del comando contiene spazi. Per gestire questo, puoi impostare IFS
a \n
.
IFS=$'\n'
arr=($(grep -n "search term" file.txt | sed 's/:.*//'))
unset IFS
Puoi anche eliminare la necessità di SED eseguendo un'espansione su ciascun elemento dell'array:
arr=($(grep -n "search term" file.txt))
arr=("${arr[@]%%:*}")
Altri suggerimenti
Le stringhe separate dallo spazio sono facilmente attraversabili in 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 $output | awk '{for(i=1;i<=NF;i++) print $i;}'
# convert to an array
ar=($output)
echo ${ar[3]} # echos 4th element
Se stai pensando allo spazio in nome del file Utilizzo find . -printf "\"%p\"\n"