如何使用 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

相關內容