Подтвердить что ты не робот

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' ничего не делает и сохраняет исходный результат. Какие изменения мне нужно сделать, чтобы сделать эту работу?

4b9b3361

Ответ 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=)