grep 字符串的各个部分以形成新字符串

grep 字符串的各个部分以形成新字符串

我正在解析一些日志文件并找出错误。每行看起来像这样:

CreateOrder_hostname1.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_CreateOrder: [1443555726715] Error description [system]: Method1
ScheduleOrder_hostname2.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_ScheduleOrder: [1443555726715] Error description 2 [system]: Method2
ScheduleOrder_hostname2.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_ScheduleOrder: [1443555726715] Error description 3 [system]: Method3
ShipOrder_hostname3.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_ShipOrder: [1443555726715] Error description 4 [system]: Method4

我怎样才能把这条线读成这样呢?

CreateOrder: 2015-09-29 15:42:06: Error description
ScheduleOrder: 2015-09-29 15:42:06: Error description 2
ScheduleOrder: 2015-09-29 15:42:06: Error description 3
ShipOrder: 2015-09-29 15:42:06: Error description 4

答案1

sed

sed 's/^\([^_]*\)_[^:]*:\([^,]*\)[^]]*\]\([^[]*\).*/\1: \2:\3/'
  • ^\([^_]*\)匹配行的开头^。然后括号内的部分\(...\)保存到 sed 内部变量中\1
    • [^_]*匹配非下划线的任意字符_零次或多次*
  • [^:]*其后跟随任何不是 的字符:
  • \([^,]*\)再次放在括号内并保存到变量\2:直到,日期之后的每个字符。
  • [^]]*\]解析将继续,直到]出现 a(在错误描述之前)。
  • \([^[]*\)然后匹配所有内容直到下一个打开的方括号[并将其保存到\3
  • \1: \2:\3\1现在将 everyting 替换为格式化输出以及变量、\2和的值\3

输出:

CreateOrder: 2015-09-29 15:42:06: Error description 
ScheduleOrder: 2015-09-29 15:42:06: Error description 2 
ScheduleOrder: 2015-09-29 15:42:06: Error description 3 
ShipOrder: 2015-09-29 15:42:06: Error description 4 

答案2

这应该有效:

$ perl -pe 's/^(.+?)_.+?:(.+?),.*?\](.+?)\[.*/$1: $2:$3/' file 
CreateOrder: 2015-09-29 15:42:06: Error description 
ScheduleOrder: 2015-09-29 15:42:06: Error description 2 
ScheduleOrder: 2015-09-29 15:42:06: Error description 3 
ShipOrder: 2015-09-29 15:42:06: Error description 4 

解释

  • perl -pe:意思是“在应用由”-p给出的脚本后打印每一行-e
  • s/^(.+?)_.+?:(.+?),.*?\](.+?)\[.*/$1: $2:$3/:正则表达式查找第一个_( .+?_) 之前的所有内容并将其保存为$1.然后,直到第一个逗号 ( ) 之前的所有内容:以及此后直到第一个逗号 ( .+?,) 的所有内容都保存为$2.然后它会跳到第一个]( .*?\]) 并捕获此后直到第一个[( .+?\[) 之前的所有内容作为 $3。最后,它还匹配所有内容,直到行尾。这一切都被替换为$1: $2: $3.

答案3

另一种方法是删除不必要的模式而不是保留必要的模式

sed 's/_[^:]*:/: /;s/,[^]]*\]/:/;s/\[.*//'

输出:

CreateOrder: 2015-09-29 15:42:06: Error description 
ScheduleOrder: 2015-09-29 15:42:06: Error description 2 
ScheduleOrder: 2015-09-29 15:42:06: Error description 3 
ShipOrder: 2015-09-29 15:42:06: Error description 4

答案4

很难说出您在寻找什么,因为错误描述似乎只是说错误描述。这保留了它和它周围的识别内容:

sed 's/[_,][^:-]*:/ /g
' <<\IN
CreateOrder_hostname1.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_CreateOrder: [1443555726715] Error description [system]: Method1
ScheduleOrder_hostname2.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_ScheduleOrder: [1443555726715] Error description 2 [system]: Method2
ScheduleOrder_hostname2.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_ScheduleOrder: [1443555726715] Error description 3 [system]: Method3
ShipOrder_hostname3.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_ShipOrder: [1443555726715] Error description 4 [system]: Method4
IN

...打印...

CreateOrder 2015-09-29 15:42:06 ERROR  :Thread-26  [1443555726715] Error description [system]: Method1
ScheduleOrder 2015-09-29 15:42:06 ERROR  :Thread-26  [1443555726715] Error description 2 [system]: Method2
ScheduleOrder 2015-09-29 15:42:06 ERROR  :Thread-26  [1443555726715] Error description 3 [system]: Method3
ShipOrder 2015-09-29 15:42:06 ERROR  :Thread-26  [1443555726715] Error description 4 [system]: Method4

我不知道这是否太多或太少,或者是否在正确的轨道上。我也尝试过扔掉盒装的东西。

sed 's/[_,[][^]:-]*[]:]/ /g
' <<\IN
CreateOrder_hostname1.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_CreateOrder: [1443555726715] Error description [system]: Method1
ScheduleOrder_hostname2.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_ScheduleOrder: [1443555726715] Error description 2 [system]: Method2
ScheduleOrder_hostname2.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_ScheduleOrder: [1443555726715] Error description 3 [system]: Method3
ShipOrder_hostname3.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_ShipOrder: [1443555726715] Error description 4 [system]: Method4
IN

...打印...

CreateOrder 2015-09-29 15:42:06 ERROR  :Thread-26    Error description  : Method1
ScheduleOrder 2015-09-29 15:42:06 ERROR  :Thread-26    Error description 2  : Method2
ScheduleOrder 2015-09-29 15:42:06 ERROR  :Thread-26    Error description 3  : Method3
ShipOrder 2015-09-29 15:42:06 ERROR  :Thread-26    Error description 4  : Method4

……也许这看起来像是我想看到的东西。

这个掉落了描述有点完全,但也许仍然讲述着同样的故事?请记住,匹配您所说的字符串有点困难可以是任何东西这似乎也没有任何真正的目的。无论如何,这也很有趣。

sed 's/[_,][^-]*[^ ]:/ /g
' <<\IN
CreateOrder_hostname1.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_CreateOrder: [1443555726715] Error description [system]: Method1
ScheduleOrder_hostname2.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_ScheduleOrder: [1443555726715] Error description 2 [system]: Method2
ScheduleOrder_hostname2.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_ScheduleOrder: [1443555726715] Error description 3 [system]: Method3
ShipOrder_hostname3.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_ShipOrder: [1443555726715] Error description 4 [system]: Method4
IN

CreateOrder 2015-09-29 15:42:06 ERROR  :Thread-26  Method1
ScheduleOrder 2015-09-29 15:42:06 ERROR  :Thread-26  Method2
ScheduleOrder 2015-09-29 15:42:06 ERROR  :Thread-26  Method3
ShipOrder 2015-09-29 15:42:06 ERROR  :Thread-26  Method4

相关内容