2013-02-27 11 views
26

Utknąłem na małym problemie. Mam polecenie, które potoki wyprowadzają do awk, ale chcę przechwytywać dane wyjściowe do tablicy jeden po drugim.Bash przechwytujący wyjście awk do tablicy

Mój przykład:

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

Ale przechwytywania całe wyjście w jeden gigantyczny ciąg oddzielonych przecinkami:

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

Próbowałem również:

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 

chcę aby móc przechwycić każdy pojedynczy pid we własny element tablicy. Ustawienie IFS = '\n' nic nie daje i zachowuje moje oryginalne wyjście. Jaką zmianę muszę zrobić, aby to zadziałało?

+0

Możesz całkowicie pominąć komendę 'awk' używając' myarr = ($ (ps -u kdride -o pid)) '. (Zwróć uwagę na dodatkowe nawiasy, jak wskazano w odpowiedzi Pawła). – chepner

Odpowiedz

42

Dodaj dodatkowych nawiasów, tak:

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 

Zobacz także bash — Arrays.

+0

Ah wielkie dzięki. Całkowicie pominąłem tę część. Odniesienie bardzo pomaga – Paul

+3

Jaki jest sens: po wykonaniu? Dlaczego potrzebujemy tutaj prawdy? Uruchomiłem to bez niego i nadal działało? – mmlac

+0

Jestem także ciekawy, dlaczego istnieje ':' –