1

我正在寻找一些带有一些周围行的日志文件,然后从匹配项中丢弃垃圾行。更糟糕的是,愚蠢的代码两次输出相同的异常,所以我想每隔一个 grep 匹配就丢弃。我不知道当还包括周围的行时,是否有跳过所有其他 grep 匹配的好方法,所以我很高兴一次完成。

假设我们从 grep 得到以下结果:

InterestingContext1
lkjsdf
MatchExceptionText1
--
kjslkj
lskjlk
MatchExceptionText2
--
InterestingContext3
lkjsdf
MatchExceptionText3
--
kjslkj
lskjlk
MatchExceptionText4
--

显然,grep 匹配是“MatchExceptionText”(当然是简化的)。因此,我想将其通过管道传输到可以删除第 2、5、6、7、8 行的地方,然后重复该模式,因此结果如下所示:

InterestingContext1
MatchExceptionText1
--
InterestingContext3
MatchExceptionText3
--

重复是事情对我来说变得棘手的地方。我知道 sed 可以只删除某些行号,但我不知道如何将它们分组为 8 行组并在所有组中重复该剪切。

有任何想法吗?谢谢你的帮助。

4

5 回答 5

3

awk可以进行模块化算术,因此以读取 mod 8 的行数为条件进行打印应该允许您重复该模式。

awk 'NR%8 ~ /[134]/' file
于 2013-10-29T13:36:26.783 回答
1

Sed 可以做到:

sed -n 'N;s/\n.*//;N;N;p;N;N;N;N' filename

编辑:

想一想,这更好一点:

sed -n 'p;n;n;N;p;n;n;n;n' filename
于 2013-10-29T13:38:33.600 回答
0

使用 GNU awk,您可以在适当的记录分隔符处拆分输入并打印所需的输出,例如:

awk 'NR%2 {print $1, $3}' RS='--\n' ORS='\n--\n' OFS='\n' infile

输出:

InterestingContext1
MatchExceptionText1
--
InterestingContext3
MatchExceptionText3
--
于 2013-10-29T14:12:44.397 回答
0

这可能对您有用(GNU sed):

sed -n 'p;n;n;p;n;p;n;n;n;n' file
于 2013-10-29T14:14:30.010 回答
0
sed -n "s/^.*\n//;x;s/^/²/

/^²\{1\}$/ b print
/^²\{3\}$/ b print
/^²\{4\}$/ b print
/^²\{7\}$/ b print
/^²\{8\}$/ b print

b cycle

: print
x;
# your treatment begin
p
# your treatment stop
x

: cycle
/^²\{8\}$/ s/.*//
x
" YourFile

主要用于参考具有相对行号的“案例”,只需更改数字以/^²\{YourLineNumber\}$/获取其他相对行位置。

不要忘记重置循环的最后一个行号

  • 第一部分走线并准备相对线计数器
  • 第二部分是案例
  • 第三部分是治疗(这里是印刷品)
  • 最后一部分是循环计数器的重置(如果需要)
于 2013-10-29T17:47:18.503 回答