将grep输出存储在数组中

Luc*_*nzo 41 arrays bash shell

我需要在目录中搜索模式,并将包含它的文件的名称保存在数组中.

搜索模式:

grep -HR "pattern" . | cut -d: -f1
Run Code Online (Sandbox Code Playgroud)

这将打印出包含"pattern"的所有文件名.

如果我尝试:

targets=$(grep  -HR "pattern" . | cut -d: -f1)
length=${#targets[@]}
for ((i = 0; i != length; i++)); do
   echo "target $i: '${targets[i]}'"
done
Run Code Online (Sandbox Code Playgroud)

这只打印一个包含所有filnames字符串的元素.

output: target 0: 'file0 file1 .. fileN'
Run Code Online (Sandbox Code Playgroud)

但是我需要:

 output: target 0: 'file0'
 output: target 1: 'file1'
 .....
 output: target N: 'fileN'
Run Code Online (Sandbox Code Playgroud)

如果不对目标执行无聊的拆分操作,我怎样才能实现结果?

anu*_*ava 55

您可以使用:

targets=($(grep -HRl "pattern" .))
Run Code Online (Sandbox Code Playgroud)

注意(...)在BASH中使用数组创建.

您还可以使用输出中的grep -l文件名grep(如我的命令所示).

  • 如果filename包含空格或通配符,则无法正常工作 (4认同)
  • 这是BASH中数组创建的语法.如果删除外部`(..)`那么你只是将`grep`分配给一个简单的shell变量,它不会被视为数组. (2认同)
  • 如果可能,那么使用`grep --null`和`IFS =`来创建数组 (2认同)