从 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
更新:这个问题的回答要简单得多,结果根本不需要 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