我的日志文件中有以下内容:
[2.09 10:23:56]
[23.09 10:3:56]
[23.09 10:23:56] Some other thing
[23.09 10:23:56]
[23.09 10:23:56]
[23.09 10:23:5]
[23.09 10:23:56] Something
[23.09 10:23:56]
并想使用 sed 删除“空”行(仅包含时间戳的行)。我尝试过以下方法:
sed -i '/\[\d{1,2}\.\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}\] ($|\R)/d' file
sed -i '/\[[0-9][0-9]?\.[0-9][0-9]? [0-9][0-9]?:[0-9][0-9]?:[0-9][0-9]?\] \n/d' file
sed -i '/\[[0-9][0-9]?\.[0-9][0-9]? [0-9][0-9]?:[0-9][0-9]?:[0-9][0-9]?\] ($|\R)/d' file
但似乎没有任何效果。
任何帮助表示赞赏!
答案1
据我所知,不需要创建与行开头括号内的日期字符串匹配的表达式。
$ grep -v -x '\[[^]]*\][[:blank:]]*' file
[23.09 10:23:56] Some other thing
[23.09 10:23:56] Something
上面删除了以括号字符串 ( [like this]
) 开头且仅包含可选尾随空格的行。
有了sed
,这看起来像
$ sed '/^\[[^]]*\][[:blank:]]*$/ d' file
[23.09 10:23:56] Some other thing
[23.09 10:23:56] Something
表达式的起始位\[[^]]*\]
是一个文字,[
后跟零个或多个非]
字符,最后是文字]
。
使用awk
,我们可以将字段分隔符设置为][[:blank:]]*
,这意味着]
时间戳末尾的 (以及后面的任何空格)将是两个字段之间的分隔符。如果第二个字段为空,我们不会打印当前行。
$ awk -F '][[:blank:]]*' '$2 != ""' file
[23.09 10:23:56] Some other thing
[23.09 10:23:56] Something
作为卡西莫多在评论中指出(现已删除),使用awk 'NF > 2' file
也适用于问题中提供的示例数据。此方法依赖于awk
默认情况下将行拆分为空白字段的事实。此变体不关心每行的细节,并删除除具有两个以上空格分隔字段的行之外的所有行。
答案2
sed '/^\[[0-9]\{1,2\}\.[0-9]\{1,2\} [0-9]\{1,2\}:[0-9]\{1,2\}:[0-9]\{1,2\}\] $/ d'
- sed 不支持
\d
. - 量词
{...}
必须用反斜杠(除非您使用-E
) - 替代方案
|
必须是反斜杠(除非您使用-E
) - 可选符号
?
必须是反斜杠(除非您使用-E
)