grep(或 sed?):在查找匹配项之前跳过指定的行数

grep(或 sed?):在查找匹配项之前跳过指定的行数

我正在处理日积月累的巨大日志文件,我无法截断/旋转但需要每小时解析新条目。

我一直用来grep抓取具有特定字符串的条目,然后计算得到的条目数,然后扔掉第一个NN条目数在哪里

我已经摄取了所有先前的循环,但这当然意味着每个循环都无法有效地 grep 整个文件。我对unix比较幼稚,但我觉得有更有效的方法来做到这一点吗?我认为tail不会起作用,因为我不知道自上次解析以来已经写入了多少新行。这个帖子谈论跳过,但使用搜索字符串来确定要跳过多少行,而我希望提供跳过编号作为参数。这个谈到在每行上跳过指定数量的字符,但我希望跳过指定数量的行。

有什么建议么?

答案1

在写Q的时候弄清楚了,发布给后代:

tail -n+N file | grep ...

其中 N 是要跳过的行数减 1。

答案2

sed可用于跳过初始行数。命令

sed '1,200d'

将删除前 200 行并保留所有其他行不变。

同样,awk可以以类似的方式使用:

awk 'FNR > 200'

上面的命令将打印第 201 行及其之后的行,但丢弃前面的行。该FNR变量是从当前文件读取的记录数(默认为行数)。

您可以轻松参数化它以从命令行获取数字:

awk -v n=200 'FNR > n'

您还可以将其与(替换withgrep的功能)结合使用:grepawk

awk -v n=200 'FNR > n && /pattern/' somefile

...哪里pattern有一些扩展的正则表达式。

或者,要从命令行上的某个值获取模式,

awk -v n=200 -v p='pattern' 'FNR > n && $0 ~ p'

或者,更安全的是,使用环境变量,

pattern='pattern' awk -v n=200 'FNR > n && $0 ~ ENVIRON["pattern"]' somefile

相关内容