有人能帮助我理解这个 sed 命令的作用吗:
sed -n '/\(^[^:]*[eE]xception\):.*/s//\1/p' $LOGFILE | uniq -c
这是搜索$LOGFILE
单词Exception
或exception
,计算有多少行包含这个单词并报告计数吗?
我知道这-n
意味着抑制输出,并uniq -c
报告匹配的数量,但我不明白这'/\(^[^:]*[eE]xception\):.*/s//\1/p'
在做什么。
非常感谢大家。
答案1
这里有几个奇怪的事情。首先,正如我刚刚尝试回答你的问题时学到的(谢谢!),sed
有一个很酷的技巧:
/foo/s//bar/
这意味着“如果此行与 匹配foo
,则用 替换 匹配的内容foo
。bar
我不太明白它的意义,说实话,你可以用一个简单的 做同样的事情s/foo/bar/
,但你就这样了。
至于正则表达式:
^
:匹配行的开头。[^:]*
:当^
位于方括号内时,即为负字符集。因此,虽然[abc]
表示a
或b
或c
,[^abc]
表示任何内容除了a
,b
或c
。因此,[^:]*
将匹配 0 个或多个非:
。[eE]xception
:这匹配exception
或Exception
。:.*
: 匹配 a:
然后匹配其他所有内容直到行尾。- 最后,第一部分在转义括号 (
\( \)
) 中,这意味着匹配的内容都会被捕获,并可在以后引用\1
。
下一位是替换运算符,此处为s//\1/p
。这意味着用捕获的内容 ( ) 替换之前匹配的内容(包括未捕获的部分,即整行)\1
。结果是,只有行中直到单词expression
(或Expression
)的内容才会被打印。并且,由于-n
抑制输出,p
末尾的 表示“如果替换成功,则打印此行”。
最后,uniq -c
将给出与文件中找到的模式匹配的行数。请注意,这不是单词在文件中出现的次数exception
。如果同一行中有多个单词exception:
,则将其算作一个。