我正在尝试重新格式化日志文件,以便日期和时间出现在行的开头。我的日志如下所示:
blah, blah, blah, Friday, Mar 13,2015 16:59:42
yadi, yadi, yada, Friday, Mar 13,2015 16:51:11
Run Code Online (Sandbox Code Playgroud)
我希望它们看起来像这样:
Friday, Mar 13,2015 16:59:42 blah, blah, blah
Friday, Mar 13,2015 16:51:11 yadi, yadi, yada
Run Code Online (Sandbox Code Playgroud)
我已经找到了正确的 grep 模式grep -o -i -e '[a-zA-Z]*, [a-z][a-z][a-z] [0-9]*,[0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]' ~/log.txt
。
如何将这些模式结果移动到信息字符串的左侧?谢谢你的帮助。
尝试sed
使用以下正则表达式:
$ sed -i.bak 's_\(.*\),[[:blank:]]\([[:alpha:]]\+,[[:blank:]][[:alpha:]]\+[[:blank:]][[:digit:]]\+,[^,]\+$\)_\2 \1_' file.txt
Friday, Mar 13,2015 16:59:42 blah, blah, blah
Friday, Mar 13,2015 16:51:11 yadi, yadi, yada
Run Code Online (Sandbox Code Playgroud)
这里我们使用了sed
的组替换方法来获得所需的输出。
\(.*\)
将匹配到blah, blah, blah
因为我们必须在它之后,[[:blank:]]
匹配,
。\([[:alpha:]]\+,[[:blank:]][[:alpha:]]\+[[:blank:]][[:digit:]]\+,[^,]\+$\)
将匹配行的剩余部分(我们想放在开头的部分)。然后我们必须\2 \1
先放第二组,然后是一个空格,然后是第一组。
原始文件将备份为file.txt.bak
,如果您不希望使用它-i
代替-i.bak
.
**尽管您将获得所需的输出,但在这种情况下使用 Regex/sed 将不是最佳解决方案。
编辑:如果你有这样的行[Internet disconnected] Friday, Mar 13,2015 15:48:34
,试试这个:
$ sed -i.bak 's_\(.*[^,]\),*[[:blank:]]\([[:alpha:]]\+,[[:blank:]][[:alpha:]]\+[[:blank:]][[:digit:]]\+,[^,]\+$\)_\2 \1_' file.txt
Friday, Mar 13,2015 15:48:34 [Internet disconnected]
Friday, Mar 13,2015 16:59:42 blah, blah, blah
Friday, Mar 13,2015 16:51:11 yadi, yadi, yada
Run Code Online (Sandbox Code Playgroud)
在之前的正则表达式中\(.*\),[[:blank:]]
(在第一个匹配组之后有一个逗号和一个空格),现在为了在输出中包含新行,我们制作了第一个匹配组\(.*[^,]\)
以确保它不以逗号结尾,然后我们已经匹配,*
即一个或多个逗号。因此,新sed
命令将适用于所有提到的情况。