Regex grep正则表达式grep“;(?:(?!*bots.*)172\.168.*|abab)“;访问日志

Regex grep正则表达式grep“;(?:(?!*bots.*)172\.168.*|abab)“;访问日志,regex,grep,logfile,Regex,Grep,Logfile,我正在尝试筛选具有ip掩码“172.168”但没有子字符串“bots”的日志文件 grep错误: -bash:!。机器人程序:未找到事件 如何最好地解决这个问题?Bash默认解释将成为历史记录查找。可以通过在正则表达式周围使用单引号来避免这种情况;无论如何,这通常是一个好主意(双引号较弱,不能保护反斜杠、美元符号或反斜杠不被shell解释) 无论如何,您可以而且可能应该完全关闭Csh样式的历史扩展;看 标准grep不支持您尝试使用的Perl正则表达式结构。一些平台提供了grep-Pgrep-P,

我正在尝试筛选具有ip掩码“172.168”但没有子字符串“bots”的日志文件

grep错误:

-bash:!。机器人程序:未找到事件


如何最好地解决这个问题?

Bash默认解释
将成为历史记录查找。可以通过在正则表达式周围使用单引号来避免这种情况;无论如何,这通常是一个好主意(双引号较弱,不能保护反斜杠、美元符号或反斜杠不被shell解释)

无论如何,您可以而且可能应该完全关闭Csh样式的历史扩展;看

标准
grep
不支持您尝试使用的Perl正则表达式结构。一些平台提供了grep-P
grep-P
,它确实有这种支持,但它不可移植

一个简单、直接、可移植的解决方案是改用Awk

awk'/bots/&/^172.68.|abab/'访问日志

(或
\.168\.
如果这是您的意思)。

由@CinCout给出的正则表达式没有错误,但是要在GNU
grep
中使用PCRE正则表达式,您需要转义并指定选项。尝试:

grep-Po“172.68(?!*bots)。*”


您的正则表达式需要
-p
(perm regex)选项。使用
grep-P'..'
你说172.168,但是你的正则表达式看起来是172.68;是哪一个?
172.68.10.245 - - [16/Dec/2020:06:38:03 +0000] "GET /basket/add/36994 HTTP/1.1" 404 314 "http://site.ru/basket/add/36994" "Mozilla/5.0 (X11; OpenBSD i386) AppleWebKit/537.36 (KHTML, like G$
172.68.10.221 - - [16/Dec/2020:06:38:04 +0000] "GET /media/chain/rostelekom.png HTTP/1.1" 304 182 "https://firstmagazin.ru/moskva/tele2" "Mozilla/5.0 (Linux; Android 9; MI 6) AppleWebKit/537.36
172.68.11.72 - - [16/Dec/2020:06:38:08 +0000] "GET /chita/letual/103051 HTTP/1.1" 200 7852 "-" "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)"
172.68.11.60 - - [16/Dec/2020:06:38:09 +0000] "GET /kola/pikpoint/110562 HTTP/1.1" 200 6730 "-" "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)"


grep "(?:(?!.*?bots.*)172\.68.*|abab)" access_f.log