我需要将文件的第一行放入一个bash变量中。我想可以使用grep命令,但是否有任何方法可以限制行数?
head
命令从一个文件中获取前几行数据,-n
参数可以用来指定需要提取的行数:
line=$(head -n 1 filename)
要使用bash读取第一行,可以使用read
语句。例如:
read -r firstline<file
firstline
将是您的变量(无需分配给其他变量)
zsh
),因为管道中的每个组件将在单独的子 shell 中运行。这意味着 $VAR
将在子 shell 中设置(该子 shell 一旦管道执行完成就会停止存在),而不是在调用 shell 中设置。您可以通过 read VAR <<EOF\n$(cat ...)\nEOF
(其中每个 \n
表示一个换行符)来避免这种情况。 - zrajmcat
更复杂,那么可以使用 read -r var < <(otherprog ...)
。 - Charles Duffy这样就足够了,并且将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)
。
看一个示例,当我们使用seq 10
这个命令时,可以将其作为read
的输入,即一个从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 ^
(代码更少,但本质逻辑相同)。 (这不是对投票下降的询问的回复。) - Adam Katzgrep
的那个很聪明。当然,我们也可以使用head -n 1 file
。 - fedorquihead -n1
会更快(二进制文件较小,加载更快),而 read
是最快的(没有二进制文件需要加载,因为它是内置命令)。当我只需要打印第一行时,我特别喜欢使用 grep -m1 --color .
,因为它可以给这行加上颜色,非常适合用于表头。 - Adam Katz只需将源文件中的第一个列表使用echo
命令输出到目标文件中即可。
echo $(head -n 1 source.txt) > target.txt
head -n 1 source.txt > target.txt
将达到完全相同的效果。 - YoYoline=$(head -1 file)
会正常工作。 (如前面的答案)。 但是
line=$(read -r FIRSTLINE < filename)
使用内置的Bash命令read
将稍微更快。
read
不会打印任何内容(所以line
最终为空),而且在子 shell 中执行(所以FIRSTLINE
被设置为第一行,但仅在子 shell 中有效,因此之后不可用)。解决方法:只需使用 read -r line <filename>
。 - Gordon Davisson这个问题并没有询问哪一个是最快的,但是作为对 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
只读取文件的第一行并将其存储到变量中:
read var < file
echo $var # print only the first line of 'file'
n=4;
line=$(head -n $n file | tail -n 1)
head -n $n
命令列出文件中的前n
行,然后将head命令的输出传递给tail
命令,以提取最后一行。
line="$(head -1 FILENAME)"
- nikolayline=$(head -1 FILENAME)
- Shai Alonhead...
周围的符号是否像$()
一样打开一个子shell? - Jaime Hablutzel$()
语法更容易看到,并且重视清晰度而不是绝对简洁。http://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html - Joseph Sikorski