将grep输出存入数组

14

伙计们,我该如何让这个工作?

`find /xyz/abc/music/ |grep def`

我不想将数组存储在任何临时变量中。我们如何直接操作这个数组。

所以要获取该数组的第一个元素

echo ${$(`find /xyz/abc/music/ |grep def`)[0]} 请帮助我如何实现这个。

5个回答

31

将查找调用放在数组括号中

X=( $(find /xyz/abc/music/ | grep def) )
echo ${X[1]}
echo ${X[2]}
echo ${X[3]}
echo ${X[4]}

2
这对我来说就是最好的解决方案。我看了很多关于将grep结果放入数组的SO问题,发现“优雅”这个词经常以负面的方式出现,作为一个无法实现的标准...这基本上是一个实际符合“优雅”定义并且可以在一行中完成任务的解决方案的典范。大多数答案都是“没有好的方法来做到这一点”...“很多绕路的方法...”谢谢!+1 - om01
回声$(om01的想法) :) - The_Lost_Avatar

13

如果你只需要第一个元素(或者说行),你可以使用head

`find /xyz/abc/music/ |grep def | head -n 1`

如果你需要访问任意元素,你可以先存储数组,然后检索元素:

arr=(`find /xyz/abc/music/ |grep def`)
echo ${arr[n]}

但这不会将grep输出的每一行放入数组的单独元素中。

如果您关心整行而不是单词,您可以使用headtail来完成此任务,像这样:

`find /xyz/abc/music/ |grep def | head -n line_number | tail -n 1`

谢谢您的评论,但我还想获取其他元素。我想执行像数组一样的操作。 - newbietester
为什么你说grep的每一行不会进入单独的数组元素? - Ray Toal
因为每个单词都会,至少在我给出的例子中 ;) - Michał Trybus

7
即使有点晚,Ray的答案应该是最好的解决方案,但你需要将默认字段分隔符环境变量IFS覆盖为换行符,以便将完整的行作为数组字段。填充数组后,应将IFS切换回原始值。我将扩展Rays的解决方案:


    # 保留原始IFS设置
    IFS_BAK=${IFS}
    # 注意两个引号之间的换行符,不要添加任何空格,
    # 只需按Enter并关闭引号(换行符的转义序列“\n”无法使用)
    IFS="
    "
    X=( $(find /xyz/abc/music/ | grep def) )
    echo ${X[1]}
    echo ${X[2]}
    echo ${X[3]}
    echo ${X[4]}
    # 将IFS设置回正常状态..
    IFS=${IFS_BAK}


希望这可以帮到你。

很好的观点,特别是当您的文件名中有空格时。然而,设置IFS的一种更好的方式是使用语法IFS=$'\n'。 - Elmar Zander

1
这将起作用。
array_name=(`find directorypath | grep "string" | awk -F "\n" '{print $1}'`)
echo $array_name

0

你的意思是要获取输出的第一行吗?

find /xyz/abc/music/ |grep def|head 1

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