2015-11-06 59 views
3

更新:这个回答更加简单,结果并不需要grep。哇,我的脸红了!从bash输出中获取值

我对bash编程相当陌生,所以这可能是一个简单的答案,但是当我的谷歌搜索出现了很多bash grep示例和很多bash数组示例时,它并没有显示任何内容可以弄清楚如何适应我想要做的事情。

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

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

所有内容都以空格分隔,而不是制表符分隔。

我想要做的是在bash中获得一个数组,其中包含只是的文件名,没有别的。所以对照这个例子运行它的结果是四项数组。我已经创建了数组,其中包含所有按空格分隔的片断(因此包含12个项目)以及大量空阵列,但无法弄清楚如何获取文件名。

我在不是我的升级(3.2.53(1) - 释放)的bash的旧版本,所以readarray不可用。

感谢您的帮助!

回答

1

这个版本使用正则表达式和涉及空间中的文件名:

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

例子:

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\-]\+\$/\1/")" 

输出:

filename1 
filename2 
filename3 
filen a m e4 
3

您可以使用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) 
+1

这是完全正确的答案。谢谢!我会相应地更新问题。 –

+1

如果文件名*不能包含空格,这两个选项都是唯一可行的。如果可以,那么更仔细的解析就需要工作。 –

+0

好点,Etan。在这种情况下,我约99.99%确定文件名不会包含空格,但我想我不能确定未来。你有更强大的建议,可以处理fileenames中的空格吗?我很乐意从中吸取教训! –