正则表达式在时间后匹配字符串
Regex to Match string after time
努力从日志消息中提取主机名,当日期从 2 位数字变为一位数字时,它会搞砸,比如从 10 月 31 日到 11 月 1 日,关键字的提取开始失败......这里有一些日志我需要提取主机名
- 11 月 1 日 00:00:21 akdcs20.ftc.abcd-ipsn AKDCS20 fpc0
LBCM-L2,brcm_port_learning_config(),1258:(brcm_port_learning_config:1258)设置L2学习unit:0,port_num:44,learn_flg5
11 月 1 日 01:27:16 spnztpm01.abcd-ipsn 553177:LC/0/0/CPU0:11 月 1 日
01:27:16.040:ifmgr[200]:%PKT_INFRA-LINEPROTO-5-UPDOWN:线
接口 TenGigE0/0/0/1.172153 上的协议,状态更改为 Up
10 月 31 日 23:59:56 akdcs19.ftc.abcd-ipsn AKDCS19 ufdd[1679]:
ufd_group_config_if_lookupifname ae4
对于以上所有三行我都想提取
- akdcs19.ftc.abcd-ipsn
- spnztpm01.abcd-ipsn
- akdcs20.ftc.abcd-ipsn
我目前使用的正则表达式是
^(?:[^ \n]* ){4}(?P<devicename1>[^ ]+)
您可以使用
\s\d{2}(?::\d{2}){2}\s+(?P<devicename1>\S+)
参见regex demo。
或者,更明确的模式:
^\w+\s+\d+\s+\d{2}(?::\d{2}){2}\s+(?P<devicename1>\S+)
参见 another demo。
详情
^\w+\s+\d+\s+
- 字符串开头,1+ 个单词字符,1+ 个空格,1+ 个数字,1+ 个空格(也就是说,确保我们得到正确的类似时间的子字符串)
\d{2}
- 两位数
(?::\d{2}){2}
- :
和两个数字 的两个序列
\s+
- 1+ 个空格
(?P<devicename1>\S+)
- 组 "devicename1":一个或多个非空白字符。
考虑到日期部分将始终是 3 个字符的月份,1-2 的日期和 HH:MM:ss 的时间:
^(?:\w{3}\s\d{1,2}\s\d{2}:\d{2}:\d{2}\s)(?P<devicename1>[^ ]+)
努力从日志消息中提取主机名,当日期从 2 位数字变为一位数字时,它会搞砸,比如从 10 月 31 日到 11 月 1 日,关键字的提取开始失败......这里有一些日志我需要提取主机名
- 11 月 1 日 00:00:21 akdcs20.ftc.abcd-ipsn AKDCS20 fpc0 LBCM-L2,brcm_port_learning_config(),1258:(brcm_port_learning_config:1258)设置L2学习unit:0,port_num:44,learn_flg5
11 月 1 日 01:27:16 spnztpm01.abcd-ipsn 553177:LC/0/0/CPU0:11 月 1 日 01:27:16.040:ifmgr[200]:%PKT_INFRA-LINEPROTO-5-UPDOWN:线 接口 TenGigE0/0/0/1.172153 上的协议,状态更改为 Up
10 月 31 日 23:59:56 akdcs19.ftc.abcd-ipsn AKDCS19 ufdd[1679]: ufd_group_config_if_lookupifname ae4
对于以上所有三行我都想提取
- akdcs19.ftc.abcd-ipsn
- spnztpm01.abcd-ipsn
- akdcs20.ftc.abcd-ipsn
我目前使用的正则表达式是
^(?:[^ \n]* ){4}(?P<devicename1>[^ ]+)
您可以使用
\s\d{2}(?::\d{2}){2}\s+(?P<devicename1>\S+)
参见regex demo。
或者,更明确的模式:
^\w+\s+\d+\s+\d{2}(?::\d{2}){2}\s+(?P<devicename1>\S+)
参见 another demo。
详情
^\w+\s+\d+\s+
- 字符串开头,1+ 个单词字符,1+ 个空格,1+ 个数字,1+ 个空格(也就是说,确保我们得到正确的类似时间的子字符串)\d{2}
- 两位数(?::\d{2}){2}
-:
和两个数字 的两个序列
\s+
- 1+ 个空格(?P<devicename1>\S+)
- 组 "devicename1":一个或多个非空白字符。
考虑到日期部分将始终是 3 个字符的月份,1-2 的日期和 HH:MM:ss 的时间:
^(?:\w{3}\s\d{1,2}\s\d{2}:\d{2}:\d{2}\s)(?P<devicename1>[^ ]+)