Bash захват вывода awk в массив
Я застрял в небольшой проблеме. У меня есть команда, которая выводит выходные данные на awk, но я хочу, чтобы каждый из них выводил вывод массива.
Мой пример:
myarr=$(ps -u kdride | awk '{ print $1 }')
Но это захватывает весь мой вывод в одну гигантскую строку, разделенную запятыми:
output: PID 3856 5339 6483 10448 15313 15314 15315 15316 22348 29589 29593 32657 1
Я также пробовал следующее:
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
Я хочу иметь возможность захватывать каждый отдельный pid в свой собственный элемент массива. Настройка IFS = '\n'
ничего не делает и сохраняет исходный результат. Какие изменения мне нужно сделать, чтобы сделать эту работу?
Ответы
Ответ 1
Добавьте дополнительные круглые скобки, например:
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
См. также bash
- Массивы.
Ответ 2
Используйте встроенный в Bash mapfile (или его синоним readarray
)
mapfile -t -s 1 myarr < <(ps -u myusername | awk '{print $1}')
По крайней мере, в GNU/Linux вы можете форматировать вывод ps
, поэтому нет необходимости в awk
и -s 1
mapfile -t myarr < <(ps -u myusername -o pid=)