Grepping 字符串片段以形成新字符串

Mat*_*att 2 grep sed text-processing

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

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
Run Code Online (Sandbox Code Playgroud)

我怎样才能使用这条线并让它读到这样的东西?

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
Run Code Online (Sandbox Code Playgroud)

cha*_*aos 6

sed

sed 's/^\([^_]*\)_[^:]*:\([^,]*\)[^]]*\]\([^[]*\).*/\1: \2:\3/'
Run Code Online (Sandbox Code Playgroud)
  • ^\([^_]*\)匹配行的开头^。然后括号内的部分\(...\)保存到 sed 内部变量\1
    • [^_]*匹配任何不是下划线的字符_零次或多次*
  • [^:]*this 后跟任何不是:.
  • \([^,]*\)再次放在方括号内并保存到变量\2:直到,日期之后的每个字符。
  • [^]]*\]解析一直持续到 a]出现(在错误描述之前)。
  • \([^[]*\)然后匹配所有内容,直到下一个开口方括号[并将其保存到\3.
  • \1: \2:\3现在用格式化的输出和变量的值替换 everyting \1\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 
Run Code Online (Sandbox Code Playgroud)


ter*_*don 5

这应该有效:

$ 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 
Run Code Online (Sandbox Code Playgroud)

解释

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