如何使用grep命令打印第一行?


17

我有一个名为的文件file.txt。如何仅使用grep命令打印第一行?


4
head -1 file.txt不行?
clk

@steeldriver,您需要使其成为答案,因为这是使用grep(为该工作选择的奇怪工具)完成此任务的方法。
MelBurslan '16

1
grep不是打印文件第一行的最佳工具。如果您只是想打印与匹配的第一行grep,或者如果您有特定的用途grep,请告诉我们这是什么。如果我们有更多的背景信息,也许我们可以给出一个可以更好地帮助您和社区的答案。
2013年

@MelBurslan在file.txt中,例如,我有三行内容:这是一个新文件。第二行:文件名是newFile第三行:我还没有创建新行。因此,通过使用grep命令,我如何仅打印第一行?另外,哪个命令将帮助我同时打印第一行和最后一行?你们能告诉我这两个问题的命令吗?
Nithin Santhosh

如果有任何现有的答案可以解决您的问题,请考虑通过选中标记接受它。谢谢!
杰夫·谢勒

Answers:


38

尽管这是grep的非常规应用程序,但是您可以使用

grep -m1 "" file.txt

之所以有效,是因为空表达式匹配任何内容,而-m1导致grep在第一次匹配后退出

-m NUM, --max-count=NUM
       Stop reading a file after NUM matching lines.

+1表示巧克力包裹的香蕉在这里并不是我想的那样没用。
卡米尔Maciorowski

4
这可能在某些系统上有效,但它不是可移植的:grep: unknown option -- m
Kusalananda

1
注意“第一行”和“第一行匹配”之间的区别
Charles

13

这不是什么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 Nsed 'Nq',即“打印每一行,但在每一行退出” 大致相同Nhead完全包含在标准中的原因是由于与之对称tail(以及与现有Unix实现的向后兼容性)。


这是最有启发性的答案,第一个答案是奇怪的破解。我知道有些奇怪,谢谢您向我展示了grep和ed的历史。这下全说通了。
Tomas Zubiri

6

除非第一行具有唯一的字符串,否则不能仅使用grep来执行此操作。 head -n 1 file.txt会代替它工作。

如果您只想打印出与模式匹配的第一行,则将管头插入grep

head -n 1 * | grep [pattern]


2

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或...等),并不意味着您应该这样做 -可能有更好的工具可以完成这项工作。sedsed 1qsed -n 1p)和headhead -n 1)是用于从文件中打印第一行的更合适的工具。要打印文件的最后一行,您具有tail -n 1sed -n '$p'。这些工具不仅是单个命令(而不是上述功能中的3+),而且对于将来的读者(也许您自己)也更加清晰。-他们所使用的脚本中的一个。虽然我不是问题的投票者(目前是3个),但您坚持使用任意工具(无任何支持理由)可能是导致问题的原因。下注。这是非常不可能的,有一个系统grep不也有headtailsed

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.