如何在linux中搜索两个不同的表达式

时间:2012-11-17 19:49:14

标签: regex linux sed grep

我有一个包含以下文字的文件:

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

4 个答案:

答案 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)

grepegrep

问题中的命令行会保留.com.co.co.uk。因此,在本节中,我将使用grepegrep提供两个基本示例。这些命令行保持完整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/ =>用comco
  • 替换该行
  • 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