我在文件中有以下日志行
2017-09-20 11:52:00 |警告| LEV-APPESB | 200 | 00:00:255 |尼克| 测试
我需要创建一个不同的正则表达式来提取由管道分隔的每个字段(|) 我似乎与正确的正则表达式在正确的道路上
^.*\|(.+?)\|.*$
正则表达式捕获字符串
缺口
这是我的文本的最后一次出现,由两个管道(|)
分隔所以这是我的问题,正则表达式用于:
修改
为了您的信息,正则表达式将用于日志分析系统,允许通过正则表达式创建自定义字段。通过代码拆分字符串不是一个选项
答案 0 :(得分:0)
使用非贪婪的算子:/^(.*?)\|/
抓住每一栏:/^(.*?)\|(.*?)\|(.*?)\|(.*?)\|(.*?)\|(.*?)\|/
贪婪的版本也有效:/^(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|/
再抓一个:/.*\|(.*)$/
我使用perl测试了所有三个:
#!/bin/perl
$str = "2017-09-20 11:52:00 | WARN | LEV-APPESB | 200 | 00:00:255 | nick | test";
$str =~ /^(.*?)\|/;
print "Column 1: ".$1."\n\n";
$str =~ /^(.*?)\|(.*?)\|(.*?)\|(.*?)\|(.*?)\|(.*?)\|/;
print "Column 1: ".$1."\n";
print "Column 2: ".$2."\n";
print "Column 3: ".$3."\n";
print "Column 4: ".$4."\n";
print "Column 5: ".$5."\n";
print "Column 6: ".$6."\n\n";
$str =~ /^(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|/;
print "Column 1: ".$1."\n";
print "Column 2: ".$2."\n";
print "Column 3: ".$3."\n";
print "Column 4: ".$4."\n";
print "Column 5: ".$5."\n";
print "Column 6: ".$6."\n\n";
$str =~ /^(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|(.*)$/;
print "Column 1: ".$1."\n";
print "Column 2: ".$2."\n";
print "Column 3: ".$3."\n";
print "Column 4: ".$4."\n";
print "Column 5: ".$5."\n";
print "Column 6: ".$6."\n";
print "Column 7: ".$7."\n\n";
$str =~ /.*\|(.*)$/;
print "Column 7: ".$1."\n";
该计划的输出是:
Column 1: 2017-09-20 11:52:00
Column 1: 2017-09-20 11:52:00
Column 2: WARN
Column 3: LEV-APPESB
Column 4: 200
Column 5: 00:00:255
Column 6: nick
Column 1: 2017-09-20 11:52:00
Column 2: WARN
Column 3: LEV-APPESB
Column 4: 200
Column 5: 00:00:255
Column 6: nick
Column 1: 2017-09-20 11:52:00
Column 2: WARN
Column 3: LEV-APPESB
Column 4: 200
Column 5: 00:00:255
Column 6: nick
Column 7: test
Column 7: test