从文本输入中删除每个x行

时间:2013-10-29 13:28:07

标签: unix sed grep

我希望用一些周围的行来grep一些日志文件,但是然后丢弃匹配中的垃圾行。更糟糕的是,愚蠢的代码输出相同的异常两次,所以我想破坏其他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行组,并在所有组中重复删除。

有什么想法吗?谢谢你的帮助。

5 个答案:

答案 0 :(得分:3)

awk可以进行模运算,因此按照读取模式8的行数进行打印应该允许您重复该模式。

awk 'NR%8 ~ /[134]/' file

答案 1 :(得分: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

答案 2 :(得分:0)

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

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

输出:

InterestingContext1
MatchExceptionText1
--
InterestingContext3
MatchExceptionText3
--

答案 3 :(得分:0)

这可能适合你(GNU sed):

sed -n 'p;n;n;p;n;p;n;n;n;n' file

答案 4 :(得分: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\}$/中的数字以获取其他相对行位置。

不要忘记重置周期的最后一个行号

  • 第一部分走线并准备相对线路计数器
  • 第二部分是
  • 的情况
  • 第三部分是治疗(这里是打印)
  • 如果需要,最后一部分是循环计数器的重置