获取shell命令输出的第一行


96

尝试读取的版本号时vim,我得到了很多其他行,需要忽略。我尝试阅读的手册,head并尝试了以下命令:

vim --version | head -n 1

我想知道这是否正确吗?


4
它是怎么失败的?这个对我有用。
choroba

1
语法正确。错误是什么?
Kaushik Nayak

1
这对我有用,但是也许您正在使用将版本信息写入stderr的vim版本。试试vim --version 2>&1 | sed 1q
William Pursell '17

我也可以使用-所以,是的,您的方法是正确的。:)请检查您的软件包是否在stderr@WilliamPursell上提供了该信息的输出以进行检查。
David C. Rankin

Answers:


132

是的,这是从命令获取第一行输出的一种方法。

如果命令以相同的方式将任何要捕获的错误输出到标准错误,则需要将命令的标准错误重定向到标准输出流:

utility 2>&1 | head -n 1

捕获第一行的方法还有很多,包括sed 1q(在第一行之后退出),sed -n 1p(仅打印第一行,但读取所有内容),awk 'FNR == 1'(仅打印第一行,但再次读取所有内容)等。


4

我会用:

awk 'FNR <= 1' file_*.txt

正如@Kusalananda指出的那样,有许多种方法可以捕获命令行中的第一行,但是head -n 1使用通配符时可能不是最好的选择,因为它会打印其他信息。更改'FNR == i''FNR <= i'可获得前i行。

例如,如果您有n个名为file_1.txt的文件,... file_n.txt:

awk 'FNR <= 1' file_*.txt

hello
...
bye

但是使用head通配符可以打印文件名:

head -1 file_*.txt

==> file_1.csv <==
hello
...
==> file_n.csv <==
bye

1
head -qn1 file_*.txt
F. Hauri
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.