2013-02-27 11 views
26

Sono bloccato su un piccolo problema. Ho un comando che invia le pipe a awk ma voglio catturare l'output di un array uno per uno.Bash che cattura l'output di awk in array

Il mio esempio:

myarr=$(ps -u kdride | awk '{ print $1 }') 

Ma che catturano tutta la mia uscita in un'unica stringa gigante separati da virgole:

output: PID 3856 5339 6483 10448 15313 15314 15315 15316 22348 29589 29593 32657 1 

Ho anche provato il seguente:

IFS="," 
myarr=$(ps -u kdride | awk '{ print $1"," }') 

But the output is: PID, 3856, 5339, 6483, 10448, 15293, 15294, 15295, 15296, 22348, 29589, 29593, 32657, 
1 

voglio essere in grado di catturare ogni singolo pid nel proprio elemento dell'array. L'impostazione IFS = '\n' non fa nulla e conserva la mia produzione originale. Che cambiamento devo fare per farlo funzionare?

+0

È possibile saltare completamente il comando 'awk' usando' myarr = ($ (ps -u kdride -o pid)) '. (Nota la parentesi in più come indicato nella risposta di Paolo). – chepner

risposta

42

Aggiungi parentesi aggiuntive, come questo:

myarr=($(ps -u kdride | awk '{ print $1 }')) 

# Now access elements of an array (change "1" to whatever you want) 
echo ${myarr[1]} 

# Or loop through every element in the array 
for i in "${myarr[@]}" 
do 
    : 
    echo $i 
done 

Vedi anche bash — Arrays.

+0

Ah molte grazie. Ho saltato del tutto quella parte. Il riferimento aiuta molto grazie – Paul

+3

Qual è il punto del: dopo il fare? Perché abbiamo bisogno di un vero qui? L'ho eseguito senza di esso e funzionava ancora? – mmlac

+0

Sono anche curioso del perché c'è un ':' –