Answers:
head
从文件中获取第一行,该-n
参数可用于指定应提取多少行:
line=$(head -n 1 filename)
line="$(head -1 FILENAME)"
line=`head -1 FILENAME`
head...
打开子壳一样$()
?
$()
语法更容易看清,并且比绝对简洁更重视清晰度。gnu.org/software/bash/manual/html_node/...
要使用bash读取第一行,请使用read
语句。例如
read -r firstline<file
firstline
将是您的变量(无需分配给另一个)
cat ... | read VAR
在大多数外壳程序中都会失败(zsh
据我所知,所有外壳程序都将失败),因为管道中的每个组件都将在单独的子外壳程序中运行。这意味着$VAR
将在子外壳程序中设置(一旦管道完成执行,该子外壳程序将不存在),而不是在调用外壳程序中设置。您可以使用read VAR <<EOF\n$(cat ...)\nEOF
(每个\n
都是换行符)解决此问题。
cat
,那么read -r var < <(otherprog ...)
这足以将的第一行存储filename
在变量中$line
:
read -r line < filename
我也喜欢awk
这个:
awk 'NR==1 {print; exit}' file
要存储行本身,请使用var=$(command)
语法。在这种情况下,line=$(awk 'NR==1 {print; exit}' file)
。
甚至sed
:
sed -n '1p' file
与之等效line=$(sed -n '1p' file)
。
当我们read
使用时seq 10
,请参阅样本,即1到10的数字序列:
$ read -r line < <(seq 10)
$ echo "$line"
1
$ line=$(awk 'NR==1 {print; exit}' <(seq 10))
$ echo "$line"
1
sed '1!d;q'
(或sed -n '1p;q'
)将模仿您的awk
逻辑并阻止进一步读取文件。因为我们只需要第一行中,我们可以可替换地用欺骗sed q
或awk '1;{exit}'
或甚至grep -m1 ^
(更少的代码,相同的基本逻辑)。(这不是对downvote查询的答复。)
grep
非常聪明的人。我们当然也可以说head -n 1 file
。
head -n1
将会更快(要加载较小的二进制文件)并且read
最快(没有要加载的二进制文件,这是内置的)。grep -m1 --color .
当我仅打印第一行时,我尤其喜欢它,因为它也会为该行上色,因此非常适合表标题。
line=$(head -1 file)
将正常工作。(作为以前的答案)。但
line=$(read -r FIRSTLINE < filename)
会比read
内置的bash命令快一些。
read
它不会打印任何内容(因此会变成line
空白),并且还在子shell中执行(因此FIRSTLINE
设置为第一行,但只能在子shell中使用,因此以后将无法使用)。解决方案:只需使用read -r line <filename
read
方法的开销大得多。$()
叉关闭子外壳,并使用外部命令(任何外部命令)指你调用execve()
,调用链接器和加载器(如果它是一个使用共享库,这通常是这种情况)等