在Linux命令行上通过Regex获取主机名的一部分

时间:2014-02-04 12:32:28

标签: regex linux shell command-line

我有各种域名列表,类似于:

sssss.stackoverflow.com
111_111.224fr-f222.com
ddssd.dd.dd.england.co.uk
england.co.uk
problematic.co.uk
problematic.yy.ru
yy.ru

我希望以上内容将TLD和子域名切断,以便输出如下所示:

stackoverflow
224fr-f222
england
england
problematic
yy
yy

我希望在Linux命令行中完成此操作。

3 个答案:

答案 0 :(得分:1)

这是为PHP写的,它是实现你想要的东西的一个例子!

下面的正则表达式是一个我从未完成过的玩具(ikea没有发送所有组件hehe),所以会有很多错误让我感到震惊,因为我发布了这样一个不完整的正则表达式,但是愚蠢的光让我们试试。

您想要的是第一个捕获的群组$1

接下来不要在家里/生产/任何重要的地方尝试这个,除非你正确修复正则表达式。

最后它不适用于problematic.yy.ru,因为yy.ru不是注册/有效的tld:

让我们玩:

([a-z0-9_-]+)\.(?:aero|asia|biz|cat|cn|com?|coop|info|int|jobs|mobi|museum|name|net|org|post|pro|tel|travel|xxx|edu|gov|mil|ru)(?:\.(?>a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnorsuvxyz]|d[dejkmoz]|e[ecghrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|o[m]|p[aefghklmnrstwy]|q[a]|r[eosuw]|s[abcdeghij]|u[agkmsyz]))?$

输出

stackoverflow
224fr-f222
england
england
problematic
yy
yy

是的,你可以将yy.ru添加到混音中,我想不会因为它不是vaild,我认为。

希望它是你的一个起点,让你意识到它并不像它看起来那么容易。这会尝试验证,而不仅仅是匹配预设模式。

祝你好运并回复结果,我明天会有更多时间来回顾:)

答案 1 :(得分:0)

我有点老了,但我通常使用sed和awk的组合。

例如:

$ echo "sss.stackoverflow.com"  | sed  's/\./ /g' |awk '{print $2;}'

stackoverflow

或者您可以用sed替换.com或.co.uk并仅打印最后一个字段,如下所示:

echo "sss.stackoverflow.com" | sed 's/.com/ /g' | sed  's/\./ /g' |awk '{print $NF;}' 

答案 2 :(得分:0)

知道了!

这将通过linux命令行切断子域和TLD:

echo "world.hello.com" |
sed -r "s/^.*\.([^\.]+)\.co\.[a-z]{2}$/\1/" |
sed -r "s/^([^\.]+)\.co\.[a-z]{2}$/\1/" |
sed -r "s/^.*\.([^\.]+)\.com\.[a-z]{2}$/\1/" |
sed -r "s/^([^\.]+)\.com\.[a-z]{2}$/\1/" |
sed -r "s/^.*\.([^\.]+)\.[a-z]{2}$/\1/" |
sed -r "s/^.*\.([^\.]+)\.[a-z]+$/\1/" |
sed -r "s/^([^\.]+)\.[a-z]+$/\1/"

如果要捕获主机名的其他部分,请将括号移动到主机名的该部分。它肯定会更好,但它很快,而且

适用于:

sssss.ddddd.com
sss.ddddd.com
ss.ddddd.com
s.ddddd.com
sssss.dd.com
sss.dd.com
ss.dd.com
s.dd.com
sssss.d.com
sss.d.com
ss.d.com
s.d.com
ddddd.com
dd.com
d.com

111111.22222.com
111.222.com
11.22.com
1.2.com
11111.22222.com
111.222.com
11.22.com
1.2.com
11111.22222.com
111.222.com
11.22.com
1.2.com
22222.com
22.com
2.com

sssss.ddddd.co.uk
sss.ddddd.co.uk
ss.ddddd.co.uk
s.ddddd.co.uk
sssss.dd.co.uk
sss.dd.co.uk
ss.dd.co.uk
s.dd.co.uk
sssss.d.co.uk
sss.d.co.uk
ss.d.co.uk
s.d.co.uk
ddddd.co.uk
dd.co.uk
d.co.uk

111111.22222.co.uk
111.22222.co.uk
11.22222.co.uk
1.22222.co.uk
11111.22222.co.uk
111.222.co.uk
11.22.co.uk
1.2.co.uk
11111.22222.co.uk
111.222.co.uk
11.22.co.uk
1.2.co.uk
22222.co.uk
22.co.uk
2.co.uk

sssss.ddddd.ru
sss.ddddd.ru
ss.ddddd.ru
s.ddddd.ru
sssss.dd.ru
sss.dd.ru
ss.dd.ru
s.dd.ru
sssss.d.ru
sss.d.ru
ss.d.ru
s.d.ru
ddddd.ru
dd.ru
d.ru

111111.22222.ru
111.22222.ru
11.22222.ru
1.22222.ru
11111.22222.ru
111.222.ru
11.22.ru
1.2.ru
11111.22222.ru
111.222.ru
11.22.ru
1.2.ru
22222.ru
22.ru
2.ru

sssss.ddddd.info
sss.ddddd.info
ss.ddddd.info
s.ddddd.info
sssss.dd.info
sss.dd.info
ss.dd.info
s.dd.info
sssss.d.info
sss.d.info
ss.d.info
s.d.info
ddddd.info
dd.info
d.info

111111.22222.info
111.22222.info
11.22222.info
1.22222.info
11111.22222.info
111.222.info
11.22.info
1.2.info
11111.22222.info
111.222.info
11.22.info
1.2.info
22222.info
22.info
2.info

sssss.ddddd.information
sss.ddddd.information
ss.ddddd.information
s.ddddd.information
sssss.dd.information
sss.dd.information
ss.dd.information
s.dd.information
sssss.d.information
sss.d.information
ss.d.information
s.d.information
ddddd.information
dd.information
d.information

111111.22222.information
111.222.information
11.22.information
1.2.information
11111.22222.information
111.222.information
11.22.information
1.2.information
11111.22222.information
111.222.information
11.22.information
1.2.information
22222.information
22.information
2.information

sssss.ddddd.i
sss.ddddd.i
ss.ddddd.i
s.ddddd.i
sssss.dd.i
sss.dd.i
ss.dd.i
s.dd.i
sssss.d.i
sss.d.i
ss.d.i
s.d.i
ddddd.i
dd.i
d.i

111111.22222.i
111.22222.i
11.22222.i
1.22222.i
11111.22222.i
111.22.i
11.22.i
1.2.i
11111.22222.i
111.222.i
11.22.i
1.2.i
22222.i
22.i
2.i

sss_dd-main.ddddd.i
sss_ddddd.dd-main.i 

将该列表弹出到名为urls.txt的文件中,然后将cat urls.txt传递到该序列的seds中,您就可以自己测试这个了。我讨厌stackoverflow。 : - /