我希望用一些周围的行来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行组,并在所有组中重复删除。
有什么想法吗?谢谢你的帮助。
答案 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\}$/
中的数字以获取其他相对行位置。
不要忘记重置周期的最后一个行号