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


77

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

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

这导致一堆带有行号的行,在其中找到了搜索词。

1
3
12
19

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



空格分隔的字符串可以在bash中轻松遍历。
Shiplu Mokaddim

哦...应该进行更彻底的搜索。谢谢。
天花板猫

顺便说一句,这是一种常见的反模式用法,grep用于获取某项的行号并将其最终传递给具有正则表达式支持的工具。然后,它可以找到与找到的相同的行grep,而无需绕开找出比赛的行号的弯路。
Tripleee

Answers:


135

要将命令的输出分配给数组,需要在数组分配内使用命令替换。对于一般命令,command它看起来像:

arr=( $(command) )

在OP的示例中,内容为:

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

内部$()运行命令,而外部()使输出为数组。问题是当命令的输出包含空格时它将不起作用。要处理此问题,可以设置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[@]%%:*}")

4
再加上一个用于在元素中包含空格的案例。正是我想要的。
弗拉迪斯拉夫(Vladislavs Dovgalecs)2015年

1
IFS的东西很棒!一直在找小时!
magnusarinell

对我来说,工作只是没有外括号dvmList=`grep -RohP '(?<=oramds:).+\.dvm' myFolder`
tuxErrante

@bastaPasta不是数组分配。如果您没有使用支持数组的shell,则数组分配可能对您不起作用。
jordanm

您说得对,我使用的是sh而不是bash,但是它可以很好地循环播放
tuxErrante

11

空格分隔的字符串可以在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 $output | awk '{for(i=1;i<=NF;i++) print $i;}'

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

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


4
但是对于带有空格的文件是损坏的。
jordanm 2012年

@jordanm使用find . -printf "\"%p\"\n"
Shiplu Mokaddim'2
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.