我需要从日志文件中删除一些行。该文件包含一些包含9位数字的行,有时连续几行。我需要找到带有数字的连续行,并删除每个这样的组中除最后一行之外的每一行。
408732560
Error descrNo payment information available
408976296
Error descrNo payment information available
413128144
416192730
375139814
Error descrNo payment information available
处理完毕后,我也需要它:
408732560
Error descrNo payment information available
408976296
Error descrNo payment information available
375139814
Error descrNo payment information available
如果可能的话,我还希望使用以下文本行加入每个数字,如下所示:
408732560 Error descrNo payment information available
408976296 Error descrNo payment information available
375139814 Error descrNo payment information available
答案 0 :(得分:2)
这是一种非常简单的方法:
$ cat f
408732560
Error descrNo payment information available
408976296
Error descrNo payment information available
413128144
416192730
375139814
Error descrNo payment information available
$ cat f | awk '/^[0-9]{9}$/ { v=$0 } !/^[0-9]{9}$/ { print v " "$0; v="" } END { if (v) print v }'
408732560 Error descrNo payment information available
408976296 Error descrNo payment information available
375139814 Error descrNo payment information available
基本上,如果我们遇到一个由9位数组成的行,我们将该行存储在缓冲区中。当我们遇到非9位数行时,我们打印缓冲区中的所有内容,然后将其清空。
答案 1 :(得分:1)
以下是awk
的一种方式:
$ awk '$1=="Error"{print e,$0;next}{e=$1}' file
408732560 Error descrNo payment information available
408976296 Error descrNo payment information available
375139814 Error descrNo payment information available
如果行以Error
开头,则将其与存储的最后一个错误编号一起打印,如果它没有存储错误。
答案 2 :(得分:0)
sed -n 'h
$ {x
:cycle
s/\(\n[0-9]* \)[^[:cntrl:]]*\1/\1/g
t cycle
s/.//p
}' YourFile
将整个文件加载到缓冲区中,删除任何以与下一个文件相同的编号开头的行。循环此动作,直到不再出现,打印结果(只删除第一个动作添加的第一个\ n)