我有一个内容类似于以下内容的文件:
mail.google.com
srv1.mail.google.com
google.com
facebook.com
yahoo.com
tt.twitter.com
我想搜索带有子域的行。我使用了这个命令:
grep -e '(.\.)*.\..$' test.txt
命令详细信息:
(.\.)*
: 对于任何字符后跟点一次或多次。.\..$
:任何字符后跟点,然后是任何字符
我希望找到的字符串模式示例:
mail.google.com
srv1.mail.google.com
但它没有找到任何东西。我正在寻找的输出应该是带有子域的行:
mail.google.com
srv1.mail.google.com
tt.twitter.com
答案1
请尝试以下操作:
grep -E '(.+\.)+.+\..+$' test.txt
输出:
mail.google.com
srv1.mail.google.com
tt.twitter.com
细节:
(.+\.)+
- 任何字符后跟点,搜索该分组一次或多次。.+\.
- 任何字符一次或多次后跟一个句点。.+$
- 任何字符一次或多次,后跟行尾。
您的正则表达式的问题是:
(.\.)*
- 匹配任何字符,然后是句点。但*
可能匹配零次或多次。你可能想要+
。.\.
- 完全匹配一字符,然后是句点。您希望+
第一个.
(.+
) 之后的字符匹配一个或多个字符。.$
- 完全匹配一字符,然后是行尾。您希望( )+
后面的1匹配一个或多个字符。.
.+
答案2
如果您愿意将标准简化为“至少有两个句点的行”,则可以使用简单的 grep:
grep -E '\.[^.]+\.' < file
这将启用扩展正则表达式,然后查找一个句点,后跟一个或多个非句点,后跟一个句点。您可以通过要求句点两侧出现一定数量的字符来进一步收紧它:
grep -E '.\.[^.]+\..' < file
上面的内容可以避免对输入的误报,例如:
foo.com.
或.com。
基于这个堆栈溢出答案从 2014 年开始,TLD 不能全部是数字,但可以(理论上)是单个字符,因此您可以使用:
grep -E '\.[^.]+\.[[:alpha:]]'