如何从文件中检索一行?
file.txt
"aaaaaaa"
"bbbbbbb"
"ccccccc"
"ddddddd"
我需要检索第 3 行("ccccccc")谢谢。
sed
是你的朋友。 sed -n 3p
打印第三行(-n
:无自动打印,3p
:行号为 3 时打印)。您还可以使用更复杂的图案,例如sed -n 3,10p
打印第 3 行到第 10 行。
如果文件非常大,您可以考虑不循环浏览整个文件,而是在打印后退出。 sed -n '3{p;q}'
如果您知道需要第 3 行,一种方法是使用 head
获取前三行,tail
仅获取其中的最后一行:
varname="$(head -n 3 file.txt | tail -n 1)"
另一种仅使用 Bash 内置的方法是调用 read
三次:
{ read ; read ; IFS= read -r varname } < file.txt
这是使用awk
执行此操作的一种方法:
awk 'FNR==3 {print; exit}' file.txt
解释:
-
awk '...'
:调用 awk,一种用于逐行操作文件的工具。用单引号括起来的指令由awk执行。 -
FNR==3 {print; exit}
:FNR代表"文件编号记录";只需将其视为"到目前为止为此文件读取的行数"。在这里我们说,如果我们在文件的第三行,打印整行,然后立即退出awk,这样我们就不会浪费时间阅读大文件的其余部分。 -
file.txt
:将输入文件指定为 awk 的参数以保存猫。
有很多可能性: 试试看:
sed '3!d' test
这是一个非常快速的版本:
sed "1d; 2d; 3q"
是否允许使用bash 以外的其他工具? 在包含 bash 的系统上,您通常会找到sed
和awk
或其他基本工具:
$ 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"
有很多方法可以实现同一件事。 选择一个对您的任务有意义的。 下次,也许可以更好地解释您的整体需求,以便我们为您提供更适用于您情况的答案。
因为,像往常一样,所有其他答案都涉及琐碎和通常的东西(管道通过grep
然后awk
然后sed
然后cut
或you-name-it
),这里有一个非常不寻常的,(可悲的是)不是很出名的答案(所以,我特此声称我有最原始的答案):
mapfile -s2 -n3 -t < input.txt
echo "$MAPFILE"
我会说这是相当有效的(mapfile
非常有效,它是一个内置的bash)。
做!
快速 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 循环中。