![如何使用 grep 匹配精确的子域而忽略其他子域](https://linux22.com/image/95766/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20grep%20%E5%8C%B9%E9%85%8D%E7%B2%BE%E7%A1%AE%E7%9A%84%E5%AD%90%E5%9F%9F%E8%80%8C%E5%BF%BD%E7%95%A5%E5%85%B6%E4%BB%96%E5%AD%90%E5%9F%9F.png)
我怎样才能匹配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 指定。)