我有一个名为的文件file.txt
。如何仅使用grep
命令打印第一行?
grep
不是打印文件第一行的最佳工具。如果您只是想打印与匹配的第一行grep
,或者如果您有特定的用途grep
,请告诉我们这是什么。如果我们有更多的背景信息,也许我们可以给出一个可以更好地帮助您和社区的答案。
我有一个名为的文件file.txt
。如何仅使用grep
命令打印第一行?
grep
不是打印文件第一行的最佳工具。如果您只是想打印与匹配的第一行grep
,或者如果您有特定的用途grep
,请告诉我们这是什么。如果我们有更多的背景信息,也许我们可以给出一个可以更好地帮助您和社区的答案。
Answers:
尽管这是grep的非常规应用程序,但是您可以使用
grep -m1 "" file.txt
之所以有效,是因为空表达式匹配任何内容,而-m1
导致grep在第一次匹配后退出
-m NUM, --max-count=NUM
Stop reading a file after NUM matching lines.
grep: unknown option -- m
这不是什么grep
。名称“ grep”本身是“ 全局搜索正则表达式并打印” 的缩写,这是ed
命令g/re/p
(对于给定的正则表达式re
)执行的操作。
ed
是1969年的交互式行编辑器,但尽管如此,它仍然很可能已安装在您的系统上。我们得到了grep
来自ed
,它可以被看作是一个快捷方式或别名的特定功能ed
,并且sed
,这是“于流ed
”,即(非交互式)流编辑器。
让我们sed
改为使用:
$ sed -n '1p' file.txt
该1p
字符串是一个很小的sed
“脚本”,它打印(p
)与给定地址相对应的行(1
第一行)。顺便说一句,编辑命令1p
(在ed
编辑器中)会做同样的事情。
该-n
抑制将禁止脚本未显式打印的任何内容的输出,因此我们得到的只是文件的第一行file.txt
。
或者:
$ sed '1q' file.txt
这将打印文件的所有行,但是q
在打印后在第1行退出()。这完全等同于head -n 1 file.txt
。
在POSIX标准中,它说(概括)head -n N
与sed 'Nq'
,即“打印每一行,但在每一行退出” 大致相同N
。head
完全包含在标准中的原因是由于与之对称tail
(以及与现有Unix实现的向后兼容性)。
Grep的另一种非常规用法-Schwartzian 变换,它经过多次旋转来对行编号,然后使用grep查找行号,然后剥去行号:
function grep1() (
nlines=$(wc -l < "$1")
nlw=$(printf "%d" "$nlines" | wc -c)
nl -d '\n' -ba -n ln -w "$nlw" -s ' ' "$1" | grep '^1 ' | sed 's/^1 *//'
)
function greplast() (
nlines=$(wc -l < "$1")
nlines=$((nlines + 0))
nlw=$(printf "%d" "$nlines" | wc -c)
nl -d '\n' -ba -n ln -w "$nlw" -s ' ' "$1" | grep "^$nlines " | sed "s/^$nlines *//"
)
我在这里以“答案”为例说明这个想法,因为仅仅因为您可以执行某些操作(grep或bash或...等),并不意味着您应该这样做 -可能有更好的工具可以完成这项工作。sed(sed 1q
或sed -n 1p
)和head(head -n 1
)是用于从文件中打印第一行的更合适的工具。要打印文件的最后一行,您具有tail -n 1
或sed -n '$p'
。这些工具不仅是单个命令(而不是上述功能中的3+),而且对于将来的读者(也许您自己)也更加清晰。-他们所使用的脚本中的一个。虽然我不是问题的投票者(目前是3个),但您坚持使用任意工具(无任何支持理由)可能是导致问题的原因。下注。这是非常不可能的,有一个系统grep
不也有head
,tail
和sed
。
head -1 file.txt
不行?