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
我不明白为什么它看不到其余的。我不确定我的正则表达式是否完美,是否能够捕获所有案例。我不知道如何表达(除了点以外的任何字符),我使用
^.[^.]
在正则表达式中表达它。您能纠正我吗?您可以使用以下表达式:
正则表达式细分:
字符串的开头^
非捕获组。(?:
非捕获组,匹配小写字母或数字,后跟句号。该模式重复2次或以上。之后匹配(?:[a-z0-9]+\){2,}com
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
可以使用以下表达式: 正则表达式细分:
字符串的开头^
非捕获组。(?:
非捕获组,匹配小写字母或数字,后跟句号。该模式重复2次或以上。之后匹配(?:[a-z0-9]+\){2,}com
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
srv1.mail.google.com
google.com
facebook.com
yahoo.com
您无法匹配tt.twitter.com
,因为这一部分将捕获一个组,该组重复一次或多次匹配单个字符,后跟一个点,而不是一个每次重复匹配两个字符,后跟一个文字点的点
例如,这可能与twitter不匹配。,因为它包含7个字符和一个点,并且重复次数为每2次,所以twitter。
将匹配
看起来您希望匹配的不是一个由至少两个点分隔的点。如果要使模式[^.]+
与点不匹配,可以使用:
grep-p'^[^.]+(?:\[^.]+){2,}$'test.csv
这将匹配:
断言字符串的开头^
一次或多次不匹配点[^.]+
非捕获组,该组至少重复2次,且与一个文字点后跟一个或多个非点匹配(?:\..[^.]+){2,}
断言字符串的结尾$
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 '^[^.]+\.([^.]+\.)+[^.]+'
这是一个简单的命令