我现在的公司日志查看体验太差了。我想在特定时间段内修剪的日志中添加新行。我想在每个约会时间后换一条新线。
日期时间格式是这样的。
2023-10-03 15:34:37
我知道tr
可以做到这一点,但我不确定如何做到。我会选择最好的答案,任何人都可以告诉我如何将新内容写入新文件。因为性能原因。我不喜欢使用 vi,我较少使用它作为日志阅读器。
答案1
在 中vim
,你可以这样做:
:%s/\v^\d{4}(-\d{2}){2} \d{2}(:\d{2}){2}.*/&\r
注意\v
对于非常神奇所以你不需要在每个之前添加反斜杠{}()
。
是的,\r
在替换中添加换行符 (将线分成两部分使用 ) 处的措辞:help s/\r
,而不是人们所期望的回车符。
在标准vi
(\d
, \v
, \r
,norm
都是vim
扩展名),等价的看起来像:
:%s/^[[:digit:]]\{4\}\(-[[:digit:]]\{2\}\)\{2\} [[:digit:]]\{2\}\(:[[:digit:]]\{2\}\)\{2\}.*/&^M/
^M
通过按Ctrl+V后输入Enter(并再次插入 LF 又名换行符 aka ^J
,而不是 CR 又名回车符 aka ^M
)。
但vi
CentOS 上的实现是vim
(并且至少早在 CentOS 4 就已经实现了),因此您应该能够依赖其中的vim
扩展vi
。
无论如何tr
是一个音译、用其他字符替换字符或者删除或挤压它们的工具,它不能在这里使用。
sed
,awk
或者perl
可以使用(AFAIK,\d
作为源自 perl 的正则表达式运算符):
perl -pi -e '$_ .= "\n" if /^\d{4}(-\d{2}){2} \d{2}(:\d{2}){2}/' your-file
编辑文件i
n处。或者:
perl -p -e '$_ .= "\n" if /^\d{4}(-\d{2}){2} \d{2}(:\d{2}){2}/' < your-file > new-file
将结果放入新文件中。
或者在这里,假设该Regex::Common::time
模块可用:
perl -MRegexp::Common=time -p -e '
$_ .= "\n" if m{^$RE{time}{strftime}{-pat=>"%Y-%m-%d %H:%M:%S"}}
' < your-file > new-file
2023-13-00 25:61:62
这将进行更严格的匹配(例如不匹配)。还有一个$RE{time}{iso}
将匹配这些日期,但也有 ISO8601 日期的许多其他变体,包括一些没有日期或时间组件的变体,因此不能在此处使用。
您可以使用以下命令查看实际的正则表达式:
$ perl -MRegexp::Common=time -le 'print $RE{time}{strftime}{-pat=>"%Y-%m-%d %H:%M:%S"}'
(?:(?:\d{4})-(?:(?:(?=[01])(?:0[1-9]|1[012])))-(?:(?:(?=[0123])(?:0[1-9]|[12]\d|3[01]))) (?:(?:(?=[012])(?:[01]\d|2[0123]))):(?:(?:[0-5]\d)):(?:(?:(?=[0-6])(?:[0-5]\d|6[01]))))
答案2
这个命令:
按:并输入
g/\v\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/normal o
解释:
g
:全局的缩写,在与正则表达式匹配的所有行上执行命令\v
:制作正则表达式“非常神奇”(它的真实名称)。意味着你不必转义特殊字符/^\d\{4\}-\d\{2\}-\d\{2\} \d\{2\}:\d\{2\}:\d\{2\}/
: 是正则表达式。将其放入类似的工具中https://regexr.com/或者https://regex101.com/,他们解释得很好normal o
:普通命令执行参数正常模式。在这种情况下,按下它o
会打开一个新行
阅读官方文档的解释:
:help global
, :help \v
,:help normal