我有一个 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
一些问题:
- 没有输入
grep
,将等待其标准输入流上的输入。 - 只会
sed
从完整的输入文件集中选取第 7 行(即仅从第一个文件中选取)。它的行计数器不会在文件之间重置。如上所述,将 GNUsed
与 一起使用可以解决此问题。-s
- 管道的两部分没有连接。
sed
不会从 读取grep
。 - 不需要
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
-n
p