我正在尝试使用正则表达式扫描一些日志文件。特别是,我希望选择符合这种格式的行:
IP地址或随机数“禁止。”,例如,“111.111.111.111禁止”。或“0320932禁止。”等。
应该只有2组字符(数字/ IP地址和“禁止”。字之间或之前可能有多个空格),字符串也不应包含“client”,“[私人]“,或”请求“。在大多数情况下,我只是对如何检测字符组和避免包含这些字的字符串感到困惑。
感谢您提供的任何帮助
答案 0 :(得分:1)
我假设在以下输入数据行1和3应该被删除:
111.111.111.111 banned. 2.2.2.2 wibble 0320932 banned 1434324 wobble
您可以使用此grep
表达式删除它们:
$ grep -E -v "[0-9.]+ +banned" logfile.log
2.2.2.2 wibble
1434324 wobble
$
此正则表达式匹配1个或多个数字和句点,后跟1个或多个空格,后跟单词“banned”。将-v
传递给grep会使其显示不与正则表达式匹配的所有行。将-i
添加到grep
命令以使其不区分大小写。
答案 1 :(得分:1)
试试这个RegExp
String regex = "\\d+.\\d+.\\d+.\\d+ banned.";
在这里你可以过滤你的两种字符串。
示例:强>
public static void main(String[] args) {
System.out.println("start");
String src = "657 hi tis is 111.111.111.111 banned. 57 happy i9";
//String src = "87 working is 0320932 banned. Its ending str 08";
String regex = "\\d+.\\d+.\\d+.\\d+ banned.";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(src);
while(matcher.find()){
System.out.println(matcher.start() + " : " + matcher.group());
}
}
如果它不适合你,请告诉我。
答案 2 :(得分:1)
你想要一个否定的匹配,看起来像:
/^((?!([\d.\s]+banned\.)).)*$/
查看实际操作:http://regex101.com/r/bY7pK4
注意您的示例显示banned
之后的一段时间。如果您不需要,请从表达式中删除\.
。
答案 3 :(得分:1)
egrep -v '^ *[0-9]+((\.[0-9]+){3})? +banned\.$'
-v
选项确保只返回与正则表达式不匹配的行。 有了这些限制,您无需担心排除其他词语,例如“客户”。
答案 4 :(得分:1)
尝试匹配
IP address or random number "banned."
此egrep
适合您:
egrep '(([0-9]{1,3}\.){3}[0-9]{1,3}|[0-9]+) +banned' logfile
答案 5 :(得分:-1)
以下内容可行:
\s*\d\d\d\.\d\d\d\.\d\d\d\.\d\d\d\s*banned\s*