根据模式输出特定行号

根据模式输出特定行号

我有一个 2760 行的文件,第 2740 行有一个 id。在结果中,我总是需要它从顶部输出第 7 行。有些文件包含更多行,有些文件包含较少行,但输出始终是第 7 行的值。

我使用的grep 'PATTERN' | sed -n '7p' yyyymmdd*.log似乎与模式匹配,但从目录中找到的第一个文件输出第 7 行。

如果有人能推动我朝正确的方向前进,我将不胜感激?

答案1

您需要每个输入文件的第 7 行匹配特定的文件名模式吗?

awk 'FNR==7' file*

awk变量FNR将是当前输入文件的行号。如果是 7,则打印该行。

或者,使用 GNU sed

sed -n -s '7p' file*

GNUsed选项-s将使内部行计数器在输入文件之间重置(这是标准的 GNU 扩展sed

如果您需要根据某些正则表达式过滤结果,只需通过grep 'PATTERN'or管道输出awk

awk 'FNR==7 && /PATTERN/' file*

或者,使用 GNU sed

sed -n -s '7{/PATTERN/p}' file*

您的命令:

grep 'PATTERN' | sed -n '7p' yyyymmdd*.log

一些问题:

  1. 没有输入grep,将等待其标准输入流上的输入。
  2. 只会sed从完整的输入文件集中选取第 7 行(即仅从第一个文件中选取)。它的行计数器不会在文件之间重置。如上所述,将 GNUsed与 一起使用可以解决此问题。-s
  3. 管道的两部分没有连接。sed不会从 读取grep
  4. 不需要grep。你只需要7号线。

答案2

我会尝试

awk '/PATTERN/ { c[FILENAME]++ ; if (c[FILENAME]==7) print ; } ' yyyymmdd*.log

在哪里

  • c[FILENAME]技巧将选择每个文件的第 7 行。

答案3

有了 GNU sed,这应该是可能的。例如,为了仅显示包含PATTERN文件中的行号yyyymmdd*.log,请尝试:

sed -n '2740s/PATTERN/PATTERN/p' yyyymmdd*.log

这将以指定的行号 (2740)search作为命令的前缀,并且除非匹配,否则将抑制输出。sed-np

相关内容