使用 grep 搜索带有子域的 URL

使用 grep 搜索带有子域的 URL

我有一个内容类似于以下内容的文件:

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:]]'

相关内容