我有一个包含以下文字的文件:
aaa.co
bbb.com
ccc.net
sss.co.uk
我需要提取*.co.*
和*.com.*
并将它们放在另一个文件中。我使用以下内容提取*.com.*
,但如何在一个命令中提取*.com.*
和*.co.*
而不是单独执行它们?
egrep -io '[a-z0-9\-]+\.com(\.[a-z]{2})?' input.txt | sed -e 's/www.//' | sort | uniq >output.txt
输入文件示例:
aaa.co
bbb.com
ccc.net
sss.co.uk
结果文件:
co
com
答案 0 :(得分:3)
只需将m设为可选
egrep -io '[a-z0-9\-]+\.co(m)?(\.[a-z]{2})?' input.txt | sed -e 's/www.//' | sort | uniq >output.txt
修改强> 你也可以放下sed和uniq
awk 'match($0, "(www\\.)?([a-z0-9\\-]+\\.com?(\\.[a-z]{2})?)", r) { print r[2] }' input.txt | sort -u
修改强> 松散sed和uniq的另一种方法
grep -oP '^(www\.)?\K[a-z0-9\-]+\.com?(\.[a-z]{2})?(?=)$' input.txt | sort -u
答案 1 :(得分:2)
grep
和egrep
问题中的命令行会保留.com
,.co
和.co.uk
。因此,在本节中,我将使用grep
和egrep
提供两个基本示例。这些命令行保持完整top-level domain (TLD),因为您的问题中的命令行是这样的:
grep -io 'com?(\.[a-z]{2})?$' input.txt | sort -u >output.txt
或更易理解:
egrep -io 'com$|co$|co[.][a-z]{2}$' input.txt | sort -u >output.txt
要获取您的信息,egrep "PATTERN1|PATTERN2"
与grep -E "PATTERN1|PATTERN2"
sed
以下sed
命令行未保留完整top-level domain (TLD),因为您的问题指定在处理co
时保留*.co.uk
sed -n '/[a-z.][.]com\?/s/.*[.]\(com\?\)\(.*\|$\)/\1/p' input.txt | sort -u >output.txt
-n
=>不要打印/[.]com?[.]/
的处理线s/.*[.]\(com?\)([.][a-z]{2})?/\1/
=>用com
或co
p
=>最后打印线 input.txt
:
aaa.co
bbb.com
ccc.net
sss.co.uk
www.zzz.co
www.yyy.com
www.xxx.co.tw
根据uniq -c
进行测试:
sed -n '/[a-z.][.]com\?/s/.*[.]\(com\?\)\(.*\|$\)/\1/p' input.txt | sort | uniq -c
结果:
4 co
2 com
答案 2 :(得分:1)
您可以为任何-e
grep
选项
egrep -e '\.com\.' -e '\.co\.' ...
或grep替代
egrep -io '[a-z0-9\-]+\.(com|co)(\.[a-z]{2})?' input.txt | ...
或在这种特殊情况下使“m”可选
egrep -io '[a-z0-9\-]+\.com?(\.[a-z]{2})?' input.txt | ...
答案 3 :(得分:0)
这可能适合你(GNU sed):
sed '/.*\.\(com\?\)\.\?.*/s//\1/p;d' file | sort -u