从 bash 输出中获取值

Get values from a bash output

更新:这个问题的回答要简单得多,结果根本不需要 grep。哇,我脸红了!

我是 bash 编程的新手,所以对此可能有一个简单的答案,但是虽然我的谷歌搜索已经出现了很多 bash grep 示例和很多 bash 数组示例,它没有出现任何我能弄清楚如何适应我正在尝试做的事情。

基本思想是我想从另一个程序的输出的每一行中提取一位,并将它们放入一个数组中。假设这是输出:

_ filename1 2015-11-06
. filename2 2015-11-04
X filename3 2015-11-01
_ filename4 2015-10-22

这里的所有内容都是 space 分隔的,而不是制表符分隔的。

我想要做的是在 bash 中获取一个数组,其中 仅包含 文件名,仅包含文件名。因此 运行 它与示例的结果将是一个四项数组。我设法创建了包含所有按顺序 space 分隔的部分(因此有 12 个项目)和大量空数组的数组,但无法弄清楚如何只获取文件名。

我使用的是旧版本的 bash,我无法升级(3.2.53(1)-release),因此 readarray 不可用。

感谢您的帮助!

你可以使用cut获取第二个字段并将其放入数组中:

arr=($(command | cut -d ' ' -f 2))

另一个纯 BASH 选项是使用 process substitution:

arr=()
while read -r _ fn _; do
   arr+=("$fn")
done < <(command)

编辑: 要处理带空格的文件名,请使用:

arr=()
while read -r fn ; do
   fn="${fn#* }"
   arr+=("${fn% *}")
done < <(command)

此版本使用正则表达式并处理文件名中的空格:

arr = (command | $(sed -s "s/^.\s\(.\+\)\s[0-9\-]\+$//"))

示例:

a="_ filename1 2015-11-06                                   
. filename2 2015-11-04
X filename3 2015-11-01
_ filen a m e4 2015-10-22"

echo "$(echo $a | sed -s "s/^.\s\(.\+\)\s[0-9\-]\+$//")"

输出:

filename1
filename2
filename3
filen a m e4