3

如何从文件中检索单行?

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

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

4

7 回答 7

4

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

如果文件很大,您可以考虑不循环遍历整个文件,而是在打印后退出。sed -n '3{p;q}'

于 2012-12-09T01:35:56.420 回答
1

如果您知道需要第 3 行,则一种方法是使用head获取前三行,并tail仅获取其中的最后一行:

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

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

{ read ; read ; IFS= read -r varname } < file.txt
于 2012-12-09T01:25:24.923 回答
1

这是一种方法awk

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

解释:

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

有很多可能性:试试这样:

sed '3!d' test

这是一个非常快的版本:

sed "1d; 2d; 3q"
于 2012-12-09T02:01:48.660 回答
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"

有很多方法可以实现相同的目标。选择一个对你的任务有意义的。下一次,也许能更好地解释你的整体需求,这样我们就可以给你更适合你情况的答案。

于 2012-12-09T03:59:56.833 回答
1

因为,像往常一样,所有其他答案都涉及琐碎和常见的东西(管道通过then thengrepawk),这是一个非常不寻常且(可悲)不太知名的答案(因此,我在此声明我有最原始的答案):sedcutyou-name-it

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

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

完毕!

于 2012-12-09T09:58:09.180 回答
0

快速 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++ ))-在每个循环中递增$i1
  • done < file.txt- 管道文件进入while循环。
于 2012-12-09T03:36:22.230 回答