如何将一个命令输出的第二行读入到Bash变量中?

17
我有一个打印多行文本的命令,我想把第二行放进bash变量里。例如echo "AAA\nBBB",我希望有一个bash命令可以将BBB放入一个bash变量中。
7个回答

23

使用sed

var=$(echo -e "AAA\nBBB" | sed -n '2p')

使用 awk

var=$(echo -e "AAA\nBBB" | awk 'NR==2')

然后,简单地回显您的变量:

echo "$var"

7

调用read两次:

echo -e "AAA\nBBB" | { read line1 ; read line2 ; echo "$line2" ; }

请注意,你需要使用{}来确保两个命令获得相同的输入流。 另外,变量在{}之外是无法访问的,因此以下做法无法奏效:
echo -e "AAA\nBBB" | { read line1 ; read line2 ; } ; echo "$line2"

5
要使变量存在于块之外,请使用不涉及管道的方法:进程替换{ read line1; read line2; } < <(command)Here-Stringsoutput=$(command); { read line1; read line2; } <<< "$output" - glenn jackman
@glennjackman请将您在评论中给出的答案发布,因为它是迄今为止最好的答案(所有其他答案都使用了过度的sedawktail/head组合)。 - gniourf_gniourf

3
你可以使用 sed 命令:
SecondLine=$(Your_command |sed -n 2p)

例如:

 echo -e "AAA\nBBBB" | sed -n 2p

根据您想要打印的行数更改数字。


1
使用带有参数扩展的数组来避免子shell:
str="AAA\nBBB"
arr=(${str//\\n/ })
var="${arr[1]}"
echo -e "$str"

+1 建议使用强大的内置功能。在“/”和“}”之间的空格真的有必要吗? - Aaron Digulla
1
是的,没有空格子字符串就没有有效的替换来定义单独的数组元素。 - koola

1

您可以通过使用 head/tail 命令来实现此操作 -- var=$(cmd | tail -n +2 | head -n 1)


0

像这样:

var=$(echo -e 'AAA\nBBB' | sed -n 2p)
echo $var
BBB

0
在bash脚本中: 变量=echo "AAA\nBBB" | awk "NR==2"


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