如何在bash脚本中获取文件的第一行?

Neu*_*ino 217 bash

我必须在文件的第一行放入一个bash变量.我想这是用grep命令,但它是否有任何限制行数的方法?

sth*_*sth 354

head获取文件中的第一行,该-n参数可用于指定应提取的行数:

line=$(head -n 1 filename)
Run Code Online (Sandbox Code Playgroud)

  • 还有:`line = \`head -1 FILENAME \`` (3认同)
  • 比"读取"方法明显更多的开销.`$()`分支子shell,并使用外部命令(*any*external命令)意味着你正在调用`execve()`,调用链接器和加载器(如果它使用共享库,通常就是这种情况) )等 (2认同)
  • 它可能更短:`line ="$(head -1 FILENAME)"` (2认同)

gho*_*g74 55

使用bash读取第一行,使用read语句.例如

read -r firstline<file
Run Code Online (Sandbox Code Playgroud)

firstline 将是你的变量(不需要分配给另一个)


fed*_*qui 12

这足以存储filename变量的第一行$line:

read -r line < filename
Run Code Online (Sandbox Code Playgroud)

我也喜欢awk这个:

awk 'NR==1 {print; exit}' file
Run Code Online (Sandbox Code Playgroud)

要存储行本身,请使用var=$(command)语法.在这种情况下,line=$(awk 'NR==1 {print; exit}' file).

甚至sed:

sed -n '1p' file
Run Code Online (Sandbox Code Playgroud)

与之相当line=$(sed -n '1p' file).


看到的样品,当我们喂readseq 10,即,数字1到10的序列:

$ read -r line < <(seq 10) 
$ echo "$line"
1

$ line=$(awk 'NR==1 {print; exit}' <(seq 10))
$ echo "$line"
1
Run Code Online (Sandbox Code Playgroud)

  • `sed '1!d;q'`(或 `sed -n '1p;q'`)会模仿你的 `awk` 逻辑并阻止进一步读取文件。因为我们只想要第一行,我们可以选择使用 `sed q` 或 `awk '1;{exit}'` 甚至 `grep -m1 ^`(更少的代码,相同的基本逻辑)来作弊。(这不是对downvote查询的回复。) (2认同)

jac*_*bot 10

line=$(head -1 file)
Run Code Online (Sandbox Code Playgroud)

会工作得很好.(如前所述).但

line=$(read -r FIRSTLINE < filename)
Run Code Online (Sandbox Code Playgroud)

read内置的bash命令会稍快一些.

  • 第二种方法不能像写的一样工作,因为`read`不打印任何东西(所以`line`结束空白),并且也在子shell中执行(所以`FIRSTLINE`设置为第一行,但仅限于子shell,因此以后不可用).解决方案:只需使用`read -r line <filename` (20认同)
  • line=$(read -r &lt; 文件名 ;printf %s "$REPLY") 应该可以工作,或者 line=$(read -r &lt; &lt;(some command); printf %s "$REPLY") (2认同)

Nei*_*ill 5

问题没有问哪个最快,但要添加到 sed 答案中, -n '1p' 表现不佳,因为仍然在大文件上扫描模式空间。出于好奇,我发现 'head' 以微弱优势胜过 sed:

# best:
head -n1 $bigfile >/dev/null

# a bit slower than head (I saw about 10% difference):
sed '1q' $bigfile >/dev/null

# VERY slow:
sed -n '1p' $bigfile >/dev/null
Run Code Online (Sandbox Code Playgroud)


ope*_*onk 5

只是echo源文件的第一个列表到目标文件中。

echo $(head -n 1 source.txt) > target.txt
Run Code Online (Sandbox Code Playgroud)

  • 对于哪个“ head -n 1 source.txt&gt; target.txt”将完全相同。 (3认同)