【问题标题】:Bash regex to grab subdomain from list of urlsBash 正则表达式从 url 列表中获取子域
【发布时间】:2021-06-05 09:20:24
【问题描述】:

我有一个包含 URL 列表的文件,我想从中获取子域。

网址列表是:

https://www.google.com [match www]
https://www.something.random-name.domain.com [match www, something, and random-name]
https://facebook.com [don't match anything]
http://test.prod-op.bpo.yahoo.com [match test, prod-op and bpo]

我一直在使用“sed”命令放弃 https 和 http 前缀,然后使用“awk”命令获取子域,但问题是我只能匹配第一个子域,例如: https://www.something.random-name.domain.com

在上面的例子中,我的方法只匹配“www”,但我希望它匹配“www”以及“something”和“random-name”。

输入将是:

https://www.google.com 
https://www.something.random-name.domain.com 
https://facebook.com
http://test.prod-op.bpo.yahoo.com 

输出将是:

www
www something random-name
null
test prod-op bpo

请解释我应该做什么,以便我可以匹配和提取子域。

谢谢!

【问题讨论】:

  • cat domainnames | sed -E 's/^\s*.*:\/\///g' | awk -F"." '{print $1}' 这是我一直在使用的。

标签: regex bash awk sed


【解决方案1】:

这是您的示例文件,以及如何使用 sed 获取所有子域:

$ cat test.txt
https://www.google.com
https://www.something.random-name.domain.com
https://facebook.com
http://test.prod-op.bpo.yahoo.com
$ cat test.txt | sed -e 's/https*:\/\///; s/\.*[^\.]*\.[^\.]*$//; s/^$/null/; s/\./ /g'
www
www something random-name
null
test prod-op bpo
$

解释:

  • s/https*:\/\///; - 删除协议
  • s/\.*[^\.]*\.[^\.]*$//; - 删除域名和 TLD
  • s/^$/null/; - 将空行更改为 null
  • s/\./ /g - 将所有点改为空格

【讨论】:

    【解决方案2】:

    有两个 GNU awk:

    awk -F '/' '{$0=$NF}1' file | awk -F '.' '{NF=NF-2}; NF<1{$0="null"}1'
    

    $NF: 包含最后一列

    NF=NF-2: 删除当前行的最后两列

    输出:

    万维网 www 一些随机名称 空值 测试产品操作 bpo

    见:8 Powerful Awk Built-in Variables – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

    【讨论】:

      【解决方案3】:

      这个awk 可以在一个命令中完成:

      awk -F. '{gsub(/^https?:\/\/|\.?[^.]+\.[^.]+$/, ""); $1=$1; print (/./ ? $0 : "null")}' file
      
      www
      www something random-name
      null
      test prod-op bpo
      

      【讨论】:

        【解决方案4】:

        这可能对你有用(GNU sed):

        sed -E 's#^https?://(.*)(\.[^.]+){2}#\1#;y/./ /;t;cnull' file
        

        url 上的模式匹配,删除除必需部分之外的所有内容。

        将该部分处理为所需的格式并打印结果。

        否则,将现有行更改为null

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多