【问题标题】:Bash capturing output of awk into arrayBash 将 awk 的输出捕获到数组中
【发布时间】:2013-02-12 20:23:16
【问题描述】:

我遇到了一个小问题。我有一个将输出通过管道传输到 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 命令。 (请注意保罗的回答中指出的额外括号)。

标签: linux arrays bash


【解决方案1】:

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

【讨论】:

【解决方案2】:

添加额外的括号,如下所示:

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 — Arrays

【讨论】:

  • 非常感谢。我完全跳过了那部分。参考非常感谢
  • do 之后的 : 有什么意义?为什么我们需要一个 true 这里?我在没有它的情况下运行它,它仍然有效?
  • 我也很好奇为什么会有:
  • 我也很好奇为什么会有:请告诉我们
  • 有没有人来判断为什么会有一个随机冒号?
猜你喜欢
  • 2011-05-02
  • 2010-11-10
  • 2014-03-28
  • 2010-10-11
  • 2011-10-13
  • 1970-01-01
  • 2020-01-15
  • 2020-01-17
  • 1970-01-01
相关资源
最近更新 更多