Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在Bash中使用正则表达式拆分大块文本_Regex_Bash_Logging_Split - Fatal编程技术网

Regex 在Bash中使用正则表达式拆分大块文本

Regex 在Bash中使用正则表达式拆分大块文本,regex,bash,logging,split,Regex,Bash,Logging,Split,我有很多要拆分的文本。这很难,因为从技术上讲,这都是一条线。文本是来自网络设备的未格式化日志消息-判断一条消息开始和结束位置的唯一方法是消息始终以.{5}\d{7}'开头,例如1093281。我如何读入这个字符串,保存在一个名为“textLog”的文件中,并基于该正则表达式将其拆分,以形成一个新的字符串/数组,从而获得干净的输出 输入示例: <189>795307: Aug 8 11:41:38 EDT: %ILPOWER-5-POWER_GRANTED: Interface Gi

我有很多要拆分的文本。这很难,因为从技术上讲,这都是一条线。文本是来自网络设备的未格式化日志消息-判断一条消息开始和结束位置的唯一方法是消息始终以
.{5}\d{7}'
开头,例如
1093281
。我如何读入这个字符串,保存在一个名为“textLog”的文件中,并基于该正则表达式将其拆分,以形成一个新的字符串/数组,从而获得干净的输出

输入示例:

<189>795307: Aug  8 11:41:38 EDT: %ILPOWER-5-POWER_GRANTED: Interface Gi1/0/8: Power granted<189>795308: Aug  8 11:41:39 EDT: %ILPOWER-5-IEEE_DISCONNECT: Interface Gi1/0/8: PD removed<189>795309: Aug  8 11:41:45 EDT: %ILPOWER-5-POWER_GRANTED: Interface Gi1/0/8: Power granted<189>795310: Aug  8 11:41:46 EDT: %ILPOWER-5-IEEE_DISCONNECT: Interface Gi1/0/8: PD removed<189>795311: Aug  8 11:41:52 EDT: %ILPOWER-5-POWER_GRANTED: Interface Gi1/0/8: Power granted<189>795312: Aug  8 11:41:53 EDT: %ILPOWER-5-IEEE_DISCONNECT: Interface Gi1/0/8: PD removed<189>795313: Aug  8 11:41:59 EDT: %ILPOWER-5-IEEE_DISCONNECT: Interface Gi1/0/8: PD removed<189>795314: Aug  8 11:42:05 EDT: %ILPOWER-5-POWER_GRANTED: Interface Gi1/0/8: Power granted
795307:Aug 8 11:41:38 EDT:%ILPOWER-5-POWER\u授予:接口Gi1/0/8:POWER授予795308:Aug 8 11:41:39 EDT:%ILPOWER-5-IEEE\u断开:接口Gi1/0/8:PD移除795309:Aug 8 11:41:45 EDT:%ILPOWER-5-POWER\u授予:接口Gi1/0/8:POWER授予795310:Aug 8 11:41:46 EDT:%ILPOWER-5-IEEE断开:接口Gi1/0/8:PD移除795311:Aug 8 11:41:52 EDT:%ILPOWER-5-POWER\u授予:接口Gi1/0/8:POWER授予795312:Aug 8 11:41:53 EDT:%ILPOWER-5-IEEE\u断开连接:接口Gi1/0/8:PD移除795313:Aug 8 11:41:59 EDT:%ILPOWER-5-IEEE\u断开连接:接口Gi1/0/8:PD移除795314:Aug 8 11:42:05 EDT:%ILPOWER-5-POWER-POWER授予:接口Gi1/0/8:电源授予
(它被格式化为一个长字符串,而不是多行。)

所需输出:包含

arr[0]=<189>795307: Aug  8 11:41:38 EDT: %ILPOWER-5-POWER_GRANTED: Interface Gi1/0/8: Power granted
arr[1]=<189>795308: Aug  8 11:41:39 EDT: %ILPOWER-5-IEEE_DISCONNECT: Interface Gi1/0/8: PD removed
arr[2]=<189>795309: Aug  8 11:41:45 EDT: %ILPOWER-5-POWER_GRANTED: Interface Gi1/0/8: Power granted
...
arr[7]=<189>795314: Aug  8 11:42:05 EDT: %ILPOWER-5-POWER_GRANTED: Interface Gi1/0/8: Power granted 
arr[0]=795307:Aug 8 11:41:38美国东部夏令时:%ILPOWER-5-POWER\u授权:接口Gi1/0/8:POWER授权
arr[1]=795308:Aug 8 11:41:39美国东部时间:%ILPOWER-5-IEEE\u断开连接:接口Gi1/0/8:PD已删除
arr[2]=795309:Aug 8 11:41:45美国东部夏令时:%ILPOWER-5-POWER\u授权:接口Gi1/0/8:授权
...
arr[7]=795314:Aug 8 11:42:05美国东部夏令时:%ILPOWER-5-POWER\u授权:接口Gi1/0/8:POWER授权

它不必是数组或存储在数据结构中,我最关心的是基于正则表达式进行拆分的方法,用于输出或保存子字符串。

使用GNU sed和Bash 4.0或更新版本:

$ mapfile -t arr < <(sed -E 's/(.)(.{5}[[:digit:]]{6})/\1\n\2/g' infile)
$ printf '%s\n' "${arr[@]}"
<189>795307: Aug  8 11:41:38 EDT: %ILPOWER-5-POWER_GRANTED: Interface Gi1/0/8: Power granted
<189>795308: Aug  8 11:41:39 EDT: %ILPOWER-5-IEEE_DISCONNECT: Interface Gi1/0/8: PD removed
<189>795309: Aug  8 11:41:45 EDT: %ILPOWER-5-POWER_GRANTED: Interface Gi1/0/8: Power granted
<189>795310: Aug  8 11:41:46 EDT: %ILPOWER-5-IEEE_DISCONNECT: Interface Gi1/0/8: PD removed
<189>795311: Aug  8 11:41:52 EDT: %ILPOWER-5-POWER_GRANTED: Interface Gi1/0/8: Power granted
<189>795312: Aug  8 11:41:53 EDT: %ILPOWER-5-IEEE_DISCONNECT: Interface Gi1/0/8: PD removed
<189>795313: Aug  8 11:41:59 EDT: %ILPOWER-5-IEEE_DISCONNECT: Interface Gi1/0/8: PD removed
<189>795314: Aug  8 11:42:05 EDT: %ILPOWER-5-POWER_GRANTED: Interface Gi1/0/8: Power granted

这假设每次出现
时,消息实际上都是以
\d{7}
开头的,如您的示例所示,而不是更一般的
{5}\d{7}
?预期的输出是什么?你能添加一个吗?@blhsing你是对的,我只是无法让更具体的一个在grep(有点新手)中为我工作,所以我选择了更宽松的版本。@BenjaminW。谢谢你,本杰明。我试着添加一个更完整的例子。太棒了!谢谢
grep -o '<[^<]*' infile