Linux 使用正则表达式删除grep中的点数

Linux 使用正则表达式删除grep中的点数,linux,bash,Linux,Bash,如何删除包含超过5”或少于5个点的行(简单地说:每行5个点)? 我如何编写一个正则表达式来使用grep在bash中检测它 输入: yGEtfWYBCBKtvxTbHxMK,126.221.42.321.0.147.30,10,Bad stuff is happening,http://mystuff.com/file.json yGEtfWYBCBKtvxTbHxwK,126.221.42.21,10,Bad stuff is happening,http://mystuff.com/file.

如何删除包含超过5”或少于5个点的行(简单地说:每行5个点)? 我如何编写一个正则表达式来使用grep在bash中检测它

输入:

yGEtfWYBCBKtvxTbHxMK,126.221.42.321.0.147.30,10,Bad stuff is happening,http://mystuff.com/file.json
yGEtfWYBCBKtvxTbHxwK,126.221.42.21,10,Bad stuff is happening,http://mystuff.com/file.json
预期产出:

yGEtfWYBCBKtvxTbHxwK,176.221.42.21,10,Bad stuff is happening,http://mystuff.com/file.json
尝试:

grep -P '[.]{5}' stuff.txt
grep -P '[\.]{5}' stuff.txt
grep -P '([\.]{5})' stuff.txt
grep -P '\.{5}' stuff.txt
grep -E '([\.]{5}' stuff.txt

只能显示正好包含5个点的线,如下所示:

grep '^[^.]*\.[^.]*\.[^.]*\.[^.]*\.[^.]*\.[^.]*$' stuff.txt
或者,如果您想将其考虑在内:

grep -E '^([^.]*\.){5}[^.]*$' stuff.txt
在第二个中使用
-E
RE有助于避免在第一个
grep
中使用
\(\)
\{\}
的默认BRE正则表达式

^
$
是分别表示线的起点和终点的锚定,确保我们匹配整条线,而不仅仅是包含5个点的部分

[^.]
是一个否定字符类,它将匹配除点以外的任何字符。
它们通过
*
进行量化,以便每个点之间可以出现任意数量的非点字符(如果不应匹配连续点,您可能希望将其更改为
+


\.
匹配文字点(而不是字符类之外的元字符
将匹配的任何字符)。

专门检测错误的IP地址

您是否可以确定IP地址始终由逗号包围,并且不包含空格,即永远不是第一个或最后一个字段

然后,您可能会逃脱:

grep -E ',\w+((\.\w+){2,3}|(\.\w+){5,}),'

如果没有,则很难区分带空格的损坏IP表单和普通句子,因此您可能必须指定列。

仅当“.”的数量超过5时,才使用Perl one liner打印

> cat five_dots.txt
yGEtfWYBCBKtvxTbHxMK,126.221.42.321.0.147.30,10,Bad stuff is happening,http://mystuff.com/file.json
yGEtfWYBCBKtvxTbHxwK,126.221.42.21,10,Bad stuff is happening,http://mystuff.com/file.json
> perl -ne '{ while(/\./g){$count++} print if $count > 5; $count=0 } ' five_dots.txt
yGEtfWYBCBKtvxTbHxMK,126.221.42.321.0.147.30,10,Bad stuff is happening,http://mystuff.com/file.json
> 

您的所有尝试都会查找五个相邻的匹配项。
[\.]{5}
查找五个相邻的反斜杠或点字符,即
\.\.
\...
等。最后一个缺少右括号,因此这是正则表达式语法错误。最近的一个是
\.{5}
,但是的,它只匹配连续字符,没有表示在点之间找到的字符。如果您的目标是筛选出无效行,则更明智的做法是将错误的IP地址、错误的URL等作为单独的项目查找。计算整行中的点数会让您陷入麻烦。如果“坏东西正在发生”消息包含一个点?最好尽可能具体,以避免不必要的副作用。URL总是相同的,因此计数点似乎是一个非常可靠的想法,正如我所知道的预期(总是)点字符数。我不控制插入的IP地址,也不控制提供此数据的源代码。它不多,10k IP地址,因此bash作为基本脚本的开发花费了我10分钟。感谢您的评论。这就是我正在尝试做的。第一阶段解析:grep-P'(?)?!(10)10(10)岁以下(10)岁以下(10)岁以下(10)岁以下(10)岁以下(10)岁以下(10)岁以下(10)岁以下(10)岁以下(10 10)岁以下(10 10)岁以下(1[6-9-9)5-9存存存存存存存10.17.17岁以下(1[6-9)存存10-9)存3[1[1[1-9)存3[1-3[1-9存存存存3[1)存10.12.12.12.12.16.16.168存存存存存10.168存存存存存存10.168岁以下以下以下以下.........1919 19 19.168岁以下::::::::::::::::))((((((?!!255!255!255.255.255.255.255.255.255.255.255.255.255.255.255.{6}[^]*$,但为了使它非常健壮,我必须覆盖所有可能的异常,或者使用不同的语言。对于基本自动化,它完成了这项工作,我通过发送电子邮件/创建Jira票证来报告异常。