在脚本中,我正在从dmesg系统日志中输出一行。在某些发行版上,记录的行也会在每行前面加上时间戳。
以此输出为例:
[ 12.291091] BTRFS info (device sda2): disk space caching is enabled
在某些发行版上会显示[]时间戳,而在其他发行版上则只显示:
BTRFS info (device sda2): disk space caching is enabled
有人可以让我知道一个快速的方法来处理删除[时间]部分并在没有它的情况下显示该行吗? 我有一个棘手的部分是在一些发行版上它不存在,所以我不知道如何处理它。 谢谢!
答案 0 :(得分:4)
此sed命令可以执行您想要的操作:
sed 's/^\[[^]]*] *//'
它匹配行首的[
,后跟任意数量的不是]
的字符,后跟任意数量的空格。
您也可以使用grep并启用Perl样式的正则表达式来执行类似的操作:
grep -Po '^(\[[^]]*] *)?\K.*'
?
表示匹配的第一部分是可选的。这使用\K
删除匹配的开头(如果存在)。
测试出来:
$ cat file
[ 12.291091] BTRFS info (device sda2): disk space caching is enabled
BTRFS info (device sda2): disk space caching is enabled
$ sed 's/^\[[^]]*] *//' file
BTRFS info (device sda2): disk space caching is enabled
BTRFS info (device sda2): disk space caching is enabled
$ grep -Po '^(\[[^]]*] *)?\K.*' file
BTRFS info (device sda2): disk space caching is enabled
BTRFS info (device sda2): disk space caching is enabled
答案 1 :(得分:3)
您可以尝试以下sed命令。无论第一个[]
是否存在,它都有效。
$ echo '[ 12.291091] BTRFS info (device sda2): disk space caching is enabled' | sed 's/^\[[^]]*\] *//'
BTRFS info (device sda2): disk space caching is enabled
$ echo 'BTRFS info (device sda2): disk space caching is enabled' | sed 's/^\[[^]]*\] *//'
BTRFS info (device sda2): disk space caching is enabled
答案 2 :(得分:1)
我会用这个:
sed -E 's/^[ \t]*\[[^]]*\][ \t]*//'
[....]
[...]
某些sed
需要-E
来\t
作为<tab>
进行插入
直接从日志中grep包含BTRFS
的行:
grep -oP '\A(\s*\[[^]]*\])?\s*\K(?=BTRFS).*' <<EOF
[ 12.291091] BTRFS [info] (device sda2): disk space caching is enabled
[ 12.291091] BTRFS [info] (device sda2): disk space caching is enabled
BTRFS [info] (device sda2): disk space caching is enabled
EOF
打印
BTRFS [info] (device sda2): disk space caching is enabled
BTRFS [info] (device sda2): disk space caching is enabled
BTRFS [info] (device sda2): disk space caching is enabled