bash脚本带字符串匹配模式

时间:2014-09-07 16:14:46

标签: bash sed

在脚本中,我正在从dmesg系统日志中输出一行。在某些发行版上,记录的行也会在每行前面加上时间戳。

以此输出为例:

[   12.291091] BTRFS info (device sda2): disk space caching is enabled

在某些发行版上会显示[]时间戳,而在其他发行版上则只显示:

BTRFS info (device sda2): disk space caching is enabled

有人可以让我知道一个快速的方法来处理删除[时间]部分并在没有它的情况下显示该行吗? 我有一个棘手的部分是在一些发行版上它不存在,所以我不知道如何处理它。 谢谢!

3 个答案:

答案 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