免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1756 | 回复: 5
打印 上一主题 下一主题

[文本处理] 关于sed的删除行命令 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-04-21 06:21 来自手机 |只看该作者 |倒序浏览
大家好!
我是一个初学者,请指教!
我想请教一下各位前辈大佬。
我要编辑删除hosts.txt文件里包含dnsmasq.conf文件里所有域名的行,该如何写命令呢?
比如说,dnsmasq.conf文件里
address=/.cnzz.com/0.0.0.0
address=/.umeng.com/0.0.0.0
address=/.umengcloud.com/0.0.0.0
address=/.doubleclick.net/0.0.0.0
...
读取dnsmasq.conf这里面的所有域名,再到hosts.txt文件里删除包含这些域名的行,请问如何写命令?

论坛徽章:
0
2 [报告]
发表于 2017-04-21 08:44 |只看该作者
本帖最后由 shiqiq_123 于 2017-04-21 09:44 编辑

主思路
  1. 1 #!/bin/bash
  2.   2 ###################################################3
  3.   3 for abc in $(cat /tmp/host.txt)
  4.   4 do
  5.   5     sed "/$abc/d" /etc/hosts
  6.   6 done   
复制代码


但是有个问题:dnsmasq.conf中的'.'是特殊字符,可以用
  1. cat /tmp/host.txt|cut -d '/' -f 2| sed 's#\.#\\\.#g'
复制代码
替换代码中的
  1. cat /tmp/host.txt
复制代码
根据你自己的情况 ,再改一改


论坛徽章:
0
3 [报告]
发表于 2017-04-21 08:49 |只看该作者
根据你自己的情况 ,再改一改

论坛徽章:
0
4 [报告]
发表于 2017-04-21 16:48 来自手机 |只看该作者
本帖最后由 xx669 于 2017-04-21 16:57 编辑

已经成功了,感谢@shiqiq_123 的帮助。
我使用了比较笨的方法:

#先提取dnsmasq.conf文件里的域名
cd /storage/sdcard1/test
awk -F/ '{print $2}' dnsmasq.conf > domain
sed -i 's#^\.#\\\.#g' domain
#再到变量删除hosts里包含domain的行。
for abc in $(cat domain)
do
sed -i "/$abc/d" hosts
done

确实能够解决问题!但我发现这个处理法效率不高,如果dnsmasq或hosts文件比较大的话,会跑很久,这是正常的吗?是否可以通过其他命令来更快的处理呢,不局限于sed。

论坛徽章:
0
5 [报告]
发表于 2017-04-22 10:09 |只看该作者
本帖最后由 shiqiq_123 于 2017-04-22 10:15 编辑

哦哦  你可以考虑一下shell的多线程   &符号  但是我不确定 因为文件是顺序读写的  我怕出错  不确定能不能多线程
或者把文件分段存放多个文件,分别处理  ,最后再汇总  这样效率高 这样能多线程

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
6 [报告]
发表于 2017-04-22 21:21 |只看该作者
回复 1# xx669

$ cat dnsmasq.conf
address=/.cnzz.com/0.0.0.0
address=/.umeng.com/0.0.0.0
address=/.umengcloud.com/0.0.0.0
address=/.doubleclick.net/0.0.0.0

$ cat hosts.txt
http://xxx.cnzz.com
http://bbs.chinaunix.net

$ awk -F/ 'FNR==NR{a[$2];next}{for(n in a)if($0~n)next;print}' dnsmasq.conf hosts.txt
http://bbs.chinaunix.net

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP