帮助理解 sed 命令

帮助理解 sed 命令

有人能帮助我理解这个 sed 命令的作用吗:

sed -n '/\(^[^:]*[eE]xception\):.*/s//\1/p' $LOGFILE | uniq -c

这是搜索$LOGFILE单词Exceptionexception,计算有多少行包含这个单词并报告计数吗?

我知道这-n意味着抑制输出,并uniq -c报告匹配的数量,但我不明白这'/\(^[^:]*[eE]xception\):.*/s//\1/p'在做什么。

非常感谢大家。

答案1

这里有几个奇怪的事情。首先,正如我刚刚尝试回答你的问题时学到的(谢谢!),sed有一个很酷的技巧:

/foo/s//bar/

这意味着“如果此行与 匹配foo,则用 替换 匹配的内容foobar我不太明白它的意义,说实话,你可以用一个简单的 做同样的事情s/foo/bar/,但你就这样了。

至于正则表达式:

  • ^:匹配行的开头。
  • [^:]*:当^位于方括号内时,即为负字符集。因此,虽然[abc]表示abc[^abc]表示任何内容除了 abc。因此,[^:]*将匹配 0 个或多个非:
  • [eE]xception:这匹配exceptionException
  • :.*: 匹配 a:然后匹配其他所有内容直到行尾。
  • 最后,第一部分在转义括号 ( \( \)) 中,这意味着匹配的内容都会被捕获,并可在以后引用\1

下一位是替换运算符,此处为s//\1/p。这意味着用捕获的内容 ( ) 替换之前匹配的内容(包括未捕获的部分,即整行)\1。结果是,只有行中直到单词expression(或Expression)的内容才会被打印。并且,由于-n抑制输出,p末尾的 表示“如果替换成功,则打印此行”。

最后,uniq -c将给出与文件中找到的模式匹配的行数。请注意,这不是单词在文件中出现的次数exception。如果同一行中有多个单词exception:,则将其算作一个。

相关内容