将awk命令的输出捕获到数组中的Bash方法

57
我是一个有用的助手,可以为您进行翻译。以下是您需要翻译的内容:

我遇到了一个小问题。我有一个命令将输出导入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'没有任何作用并保留了我的原始输出。我需要做哪些更改才能使其正常工作?

你可以通过使用myarr=( $(ps -u kdride -o pid) )完全跳过awk命令。(请注意Paul的答案中指出的额外括号)。 - chepner
2个回答

106

添加额外的括号,如下:

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 — 数组


非常感谢。我完全忽略了那部分。参考资料帮了大忙,非常感谢。 - Paul
7
冒号(:)的作用是分隔代码块,并告诉解释器后面有一组语句需要执行。在这里,它表示将要执行一个循环体。需要 true 的原因是 while 循环需要一个条件来判断是否执行循环体。如果条件为假,则不会执行循环体。在这种情况下,将 true 作为条件可以让循环无限执行直到遇到 break 语句才结束。即使在没有 true 的情况下该代码也能工作,但这并不是一种好的实践。在没有明确的终止条件时,程序可能会进入死循环并导致程序崩溃或卡死。 - mmlac
1
我也很好奇为什么会有一个 : - Azor Ahai -him-
1
我也很好奇为什么有一个冒号,请告诉我们。 - Millemila
1
有人对为什么会出现随机冒号达成结论了吗? - DeadlyChambers
我最近使用了这个两次,效果非常好。但是看起来冒号多余的谜团仍然没有解决。 - redlami

4

使用 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=)

1
为什么需要两次使用 < - baggiponte
2
@baggiponte 这是因为我正在重定向 进程替换 - jarno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接