如何使用 grep 匹配精确的子域而忽略其他子域

如何使用 grep 匹配精确的子域而忽略其他子域

我怎样才能匹配audio.itunes.apple.com并忽略http://streamingaudio.itunes.apple.com使用 grep 在日志文件中?

答案1

大多数grep实现都支持一个-w选项单词匹配:

grep -wF audio.itunes.apple.com

或者对于grep不能-w与以下组合使用的实现(如 Solaris) -F

grep -w 'audio\.itunes\.apple\.com'

只会找到包含的行,audio.itunes.apple.com前提是它之前或之后都没有单词字符grep(单词字符为字母数字或下划线(对于2.19 之前的GNU 版本仅限于单字节字符))。 Solaris 上的某些grep实现还限制匹配的字符串以单词字符开头(尽管不一定以单词字符结尾),除非该非单词字符位于行的开头(尽管在这种情况下,作为字符串的第一个字符,这没有什么区别)。匹配的部分始终是a,一个单词字符)。

因此,这里它会匹配 on,http://audio.itunes.apple.com因为/它是非单词字符,但不会匹配 on,http://streamingaudio.itunes.apple.com因为g前面的audio是单词字符。

POSIX 等效项是:

grep -E '(^[^[:alnum:]_])audio\.itunes\.apple\.com([^[:alnum:]_]|$)'

或者使用 BRE:

grep -x '\(.*[^[:alnum:]_]\)\{0,1\}audio\.itunes\.apple\.com\([^[:alnum:]_].*\)\{0,1\}'

一些grep实现,包括 GNUgrep支持\<正则表达式运算符,该运算符在非单词和单词之间的转换处进行匹配(Solarisgrep具有\<-w上面相同的奇数额外限制)。所以你可以使用:

grep '\<audio\.itunes\.apple\.com'

与这些grep实现。

答案2

请使用 -v, --invert-match

反转匹配的意义,以选择不匹配的行。 (-v 由 POSIX 指定。)

grep -vhttp://streamingaudio.itunes.apple.com

相关内容