首页 > 解决方案 > 如何仅提取包含子域的 URL

问题描述

我的原始文件包含:

mail.google.com
srv1.mail.google.com
google.com
facebook.com
yahoo.com
tt.twitter.com
yy.notexist

我想提取包含子域的行。哪个是:

mail.google.com
srv1.mail.google.com
tt.twitter.com

我试过这个正则表达式:

grep -P '^.[^.]+\.(.[^.])+\..[^.]+$' test.csv

但它只给出:

mail.google.com

我不知道为什么它看不到其余部分。我不确定我的正则表达式是否完美并捕获所有案例。我不知道如何表达(除了点以外的任何字符)我用^.[^.]正则表达式表达它。你能纠正我吗?

标签: regexlinuxsearchgrep

解决方案


基于给定样本输入/输出的答案,没有智能来区分什么是顶级域

$ awk -F. 'NF>2 || $NF!="com"' ip.txt
mail.google.com
srv1.mail.google.com
tt.twitter.com
yy.notexist

$ # any domain, not just .com
$ awk -F. 'NF>2' ip.txt
mail.google.com
srv1.mail.google.com
tt.twitter.com
  • -F.设置.为输入字段分隔符
    • 某些版本可能需要-F'[.]'而不是-F.
  • NF>2 || $NF!="com"如果它有超过 2 个字段或最后一个字段不是,则打印行com


grep

$ grep -xv '[^.]*\.com' ip.txt
mail.google.com
srv1.mail.google.com
tt.twitter.com
yy.notexist

$ # any domain, not just .com
$ grep -xv '[^.]*\.[^.]*' ip.txt
mail.google.com
srv1.mail.google.com
tt.twitter.com
  • -x仅匹配整行
  • -v打印与给定正则表达式不匹配的行
  • [^.]*.字符
  • \.com匹配.com

推荐阅读