Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何仅提取包含子域的URL_Regex_Linux_Search_Grep - Fatal编程技术网

Regex 如何仅提取包含子域的URL

Regex 如何仅提取包含子域的URL,regex,linux,search,grep,Regex,Linux,Search,Grep,我的原始文件包含: 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.g

我的原始文件包含:

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

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

您可以使用以下表达式:

正则表达式细分:

  • ^
    字符串的开头
  • (?:
    非捕获组。
    • (?:[a-z0-9]+\){2,}com
      非捕获组,匹配小写字母或数字,后跟句号。该模式重复2次或以上。之后匹配
      com
    • |
      交替,或
    • [a-z0-9]+(?!\.com)\[a-z]+
      小写字母或数字,不后跟
      .com
      ,后跟
      和字母字符
  • 关闭非捕获组
  • $
    字符串结尾

命令:

grep -P '^(?:(?:[a-z0-9]+\.){2,}com|[a-z0-9]+(?!\.com)\.[a-z]+)$' test.csv
印刷品:

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

编辑:

根据您的编辑,使用:

命令:

grep -P '^(?:[a-z0-9]+\.){2,}com$' test.csv
印刷品:

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

可以使用以下表达式:

正则表达式细分:

  • ^
    字符串的开头
  • (?:
    非捕获组。
    • (?:[a-z0-9]+\){2,}com
      非捕获组,匹配小写字母或数字,后跟句号。该模式重复2次或以上。之后匹配
      com
    • |
      交替,或
    • [a-z0-9]+(?!\.com)\[a-z]+
      小写字母或数字,不后跟
      .com
      ,后跟
      和字母字符
  • 关闭非捕获组
  • $
    字符串结尾

命令:

grep -P '^(?:(?:[a-z0-9]+\.){2,}com|[a-z0-9]+(?!\.com)\.[a-z]+)$' test.csv
印刷品:

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

编辑:

根据您的编辑,使用:

命令:

grep -P '^(?:[a-z0-9]+\.){2,}com$' test.csv
印刷品:

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

基于给定样本输入/输出的答案,不具备区分顶级域与否的智能

$ 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”
    如果有两个以上的字段或最后一个字段不是
    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

基于给定样本输入/输出的答案不具备区分顶级域与否的智能

$ 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”
    如果有两个以上的字段或最后一个字段不是
    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

您只能得到1个匹配项,因为您的正则表达式将匹配由2个点分隔的3个部分,因此不匹配:

srv1.mail.google.com
google.com
facebook.com
yahoo.com
您无法匹配
tt.twitter.com
,因为这一部分将捕获一个组,该组重复一次或多次匹配单个字符,后跟一个点,而不是一个每次重复匹配两个字符,后跟一个文字点的点

例如,这可能与twitter不匹配。
,因为它包含7个字符和一个点,并且重复次数为每2次,所以
twitter。
将匹配

看起来您希望匹配的不是一个由至少两个点分隔的点。如果要使模式
[^.]+
与点不匹配,可以使用:

grep-p'^[^.]+(?:\[^.]+){2,}$'test.csv

这将匹配:

  • ^
    断言字符串的开头
  • [^.]+
    一次或多次不匹配点
  • (?:\..[^.]+){2,}
    非捕获组,该组至少重复2次,且与一个文字点后跟一个或多个非点匹配
  • $
    断言字符串的结尾

您只能得到1个匹配项,因为您的正则表达式将匹配由2个点分隔的3个部分,因此不匹配:

srv1.mail.google.com
google.com
facebook.com
yahoo.com
您无法匹配
tt.twitter.com
,因为这一部分将捕获一个组,该组重复一次或多次匹配单个字符,后跟一个点,而不是一个每次重复匹配两个字符,后跟一个文字点的点

例如,这可能与twitter不匹配。
,因为它包含7个字符和一个点,并且重复次数为每2次,所以
twitter。
将匹配

看起来您希望匹配的不是一个由至少两个点分隔的点。如果要使模式
[^.]+
与点不匹配,可以使用:

grep-p'^[^.]+(?:\[^.]+){2,}$'test.csv

这将匹配:

  • ^
    断言字符串的开头
  • [^.]+
    一次或多次不匹配点
  • (?:\..[^.]+){2,}
    非捕获组,该组至少重复2次,且与一个文字点后跟一个或多个非点匹配
  • $
    断言字符串的结尾

我可以通过以下命令实现我的问题发布的要求:

grep -P '^[^.]+\.([^.]+\.)+[^.]+'
这是一个简单的命令