如何从bash变量回显/打印特定行

时间:2013-04-03 01:13:24

标签: bash variables debian

我正在尝试从多行bash变量中打印特定行。我发现了以下内容:

while read line; do echo LINE: "$line"; done <<< "$x"

其中x将是变量,但它只是打印出所有行而不是只打印一行(例如第1行)。我怎么能适应这个来打印出一条特定的线而不是所有线呢? (希望避免将变量写入文件)

3 个答案:

答案 0 :(得分:8)

您可以将其拆分为如下数组:

IFS=$'\n' lines=($x)

然后,您可以通过索引数组来访问任何行,例如:

echo ${lines[1]}

(当然,lines[0]是“第1行”)。

答案 1 :(得分:7)

要打印第N行:

sed -n ${N}p <<< "$x"

或(更便携):

sed -n ${N}p << EOF
$x
EOF

echo "$x" | sed -n "$N"p

echo "$x" | sed -n ${N}p

或(对于特定情况N == 3)

echo "$x" | sed -n 3p

while read line; do echo LINE: "$line"; done <<< "$x" | sed -n ${N}p

while read line; do echo LINE: "$line"; done << EOF | sed -n ${N}p
$x
EOF

答案 2 :(得分:2)

如果您出于某种原因不想使用数组,并且希望在bash中执行此操作而不是通过生成sed之类的外部工具,则可以简单地计算行数:

[ghoti@pc ~]$ x=$'one\ntwo\nthree\nfour\nfive\n'
[ghoti@pc ~]$ n=3
[ghoti@pc ~]$ for (( c=0; c<n; c++ )); do read line; done <<< "$x"
[ghoti@pc ~]$ echo $line
three
[ghoti@pc ~]$ 

或使用少一个变量:

[ghoti@pc ~]$ n=2
[ghoti@pc ~]$ for (( ; n>0; n-- )); do read line; done <<< "$x"
[ghoti@pc ~]$ echo $line
two

这些方法使用有时称为“三个表达式循环”的方法。它是一种在许多语言中很常见的构造,从bash到awk,从perl到PHP再到C(但不是Python!)。了解它们将有助于您的编程。

虽然......你可能不想使用bash来学习“真正的”编程。 : - )