0

我有一个包含一些文本的文件,例如:

aaa.co
bbb.com
ccc.net
sss.co.uk

我需要提取*.co.*and*.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
4

4 回答 4

3

只需将 com 中的 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
于 2012-11-17T19:52:50.893 回答
2

grepegrep

您问题中的命令行保留.com,.co.co.uk. 因此,在本节中,我给出了两个使用grep和的基本示例egrep。这些命令行保留完整的顶级域 (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命令行不保留完整的顶级域 (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
于 2012-11-17T21:31:55.753 回答
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 | ...
于 2012-11-17T19:54:04.447 回答
0

这可能对您有用(GNU sed):

sed '/.*\.\(com\?\)\.\?.*/s//\1/p;d' file | sort -u
于 2012-11-18T00:13:52.323 回答