BASH - 如何从文件中检索单行?

时间:2012-12-09 01:19:46

标签: bash

如何从文件中检索单行?

file.txt
"aaaaaaa"
"bbbbbbb"
"ccccccc"
"ddddddd"

我需要检索第3行(“ccccccc”) 谢谢。

7 个答案:

答案 0 :(得分:4)

sed是你的朋友。 sed -n 3p打印第三行(-n:无自动打印,3p:行号为3时打印。您还可以使用更复杂的模式,例如sed -n 3,10p来打印第3到第10行。

如果文件非常大,您可以考虑不循环浏览整个文件,但在打印后退出。 sed -n '3{p;q}'

答案 1 :(得分:1)

如果你知道你需要第3行,一种方法是使用head获取前三行,tail只获取最后一行:

varname="$(head -n 3 file.txt | tail -n 1)"

另一种仅使用Bash内置函数的方法是调用read三次:

{ read ; read ; IFS= read -r varname } < file.txt

答案 2 :(得分:1)

以下是使用awk

的方法
awk 'FNR==3 {print; exit}' file.txt

<强>解释

  • awk '...':调用awk,一种逐行操作文件的工具。由单引号括起的指令由awk执行。
  • FNR==3 {print; exit}:FNR代表“档案号记录”;只需将其视为“此文件到目前为止读取的行数”。我们在这里说,如果我们在文件的第3行,打印整行,然后立即退出awk,这样我们就不会浪费时间阅读大文件的其余部分。
  • file.txt:将输入文件指定为awk保存猫的参数。

答案 3 :(得分:1)

有很多可能性:尝试:

sed '3!d' test

这是一个非常快的版本:

sed "1d; 2d; 3q"

答案 4 :(得分:1)

是否允许使用除bash之外的其他工具?在包含bash的系统上,您通常会找到sedawk或其他基本工具:

$ line="$(sed -ne 3p input.txt)"
$ echo "$line"

$ read line < <(awk 'NR==3' input.txt)
$ echo "$line"

或者如果您想在读取第3行后退出来优化它:

$ read line < <(awk 'NR==3{print;nextfile}' input.txt)
$ echo "$line"

或者甚至更简单的工具(虽然不太优化):

$ line="`head -n 3 input.txt | tail -n 1`"
$ echo "$line"

当然,如果你真的想在bash中做到这一点,你仍然可以使它成为一个单行,而不使用任何外部工具。

$ for (( i=3 ; i-- ; )); do read line; done < input.txt
$ echo "$line"

有很多方法可以实现同样的目标。选择一个对你的任务有意义的。下一次,或许可以更好地解释您的整体需求,因此我们可以为您提供更适合您情况的答案。

答案 5 :(得分:1)

与往常一样,所有其他答案都涉及琐碎和平常的事情(通过grep然后awk然后sed然后cutyou-name-it ,这是一个非常不寻常的(可悲的)不是很有名的(因此,我声称我有最原始的答案):

mapfile -s2 -n3 -t < input.txt
echo "$MAPFILE"

我会说这是相当有效的(mapfile非常有效,而且它是内置的bash。)

完成!

答案 6 :(得分:0)

Fast bash版本;

while (( ${i:-1} <= 3 )); do
  (( $i == 3 )) && read -r line; (( i++ ))
done < file.txt

<强>输出

echo "$line" # Third line
"ccccccc"

<强>解释

  • while (( ${i:-1} <= 3 )) - 计算到$i等于3然后退出循环。
  • (( $i == 3 )) - 如果$i等于3执行读取行。
  • read -r line - 将文件行读入变量$line
  • (( i++ )) - 在每个循环中按$i递增1
  • done < file.txt - 将文件传输到while循环。