如何将命令的输出分配到数组中?

时间:2012-02-26 00:25:34

标签: arrays bash command-substitution

我需要将grep的结果分配给数组...例如

grep -n "search term" file.txt | sed 's/:.*//'

这导致了一系列行号,其中找到了搜索词。

1
3
12
19

将它们分配给bash数组的最简单方法是什么?如果我只是将它们分配给变量,它们就会变成一个以空格分隔的字符串。

2 个答案:

答案 0 :(得分:104)

要将输出分配给数组,需要在数组赋值内使用命令替换。

arr=($(grep -n "search term" file.txt | sed 's/:.*//'))

内部$()运行命令,而outer()导致输出为数组。这样做的问题是它不适用于包含空格的文件。要处理此问题,您可以将IFS设置为\ n。

IFS=$'\n'
arr=($(grep -n "search term" file.txt | sed 's/:.*//'))
unset IFS

您还可以通过对阵列的每个元素执行扩展来减少对sed的需求:

arr=($(grep -n "search term" file.txt))
arr=("${arr[@]%%:*}")

答案 1 :(得分:6)

空格分隔的字符串在bash中很容易遍历。

# save the ouput
output=$(grep -n "search term" file.txt | sed 's/:.*//')

# iterating by for.
for x in $output; do echo $x; done;

# awk
echo $out | awk '{for(i=1;i<=NF;i++) print $i;}'

# convert to an array
ar=($out)
echo ${ar[3]} # echos 4th element

如果您认为文件名中的空格使用find . -printf "\"%p\"\n"