删除不包含特定文本的行

时间:2017-10-03 19:17:56

标签: linux bash shell command-line terminal

我有一个包含大量域名的文本文件。我想删除所有不属于以下扩展名的域名:

.com
.net
.org
.biz
.us

我尝试了几种方法,但似乎没有任何效果。我遇到的主要问题是某些线路没有被删除。

例如,以.com.br结尾的域名未被删除,因为该行中有.com,但实际上我希望将其删除...

如果这是文件:

test.com
example.com.br
testing.net

然后应该成为这个:

test.com
testing.net

似乎应该有一种方法可以使用sed执行此操作,但我无法使其正常工作:/

这是我尝试过的:

sed '/.com$\|.net$\|.org$\|.biz$\|.us$/!d' *.txt

任何帮助将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:0)

我发现你没有粘贴你正在使用的确切输入,但这应该可以正常使用。

ubuntu$ cat  text.txt
.com
.net
.org
.biz
.us
.com.br
.mlp
.grrr

ubuntu$ grep -E  '[.]com$|[.]net$|[.]org$|[.]biz$|[.]us$' text.txt
.com
.net
.org
.biz
.us

问候!

答案 1 :(得分:0)

使用grep

grep  '\.\(com\|net\|org\|biz\|us\)$'

如果版本支持,扩展正则表达式更具可读性:

grep  -E '\.(com|net|org|biz|us)$'

答案 2 :(得分:0)

不确定,您是否可以在您的环境中使用awk和实际数据,对于给定的输入,应该可以使用:

$ cat domain_ext_file 
.com
.net
.org
.biz
.us

$ cat site_list 
test.com
example.com.br
testing.net

$ awk -F'.' 'FNR==NR{a[$NF];next}$NF in a' domain_ext_file site_list 
test.com
testing.net

<强>解释

  • 将字段分隔符设置为点(.),将最后一个字段($NF)存储在domain_ext_file中,在数组a中,转到下一行
  • 在读取第二个文件(site_list)时,如果数组a的键/索引是第二个文件的最后一个字段($NF in a),则打印此类行/记录/ line