[实践OK]sed给文件行尾加分号和删除一行/删除某行,删除Crontab里的ntpdate,测试如下.

jackxiang 2011-1-24 15:26 | |
背景:用sed进行删除一行时用@或#均不行,最后还得用斜杠,
sed -i '@^worker_cpu_affinity.*@d'  nginx.conf
sed: -e expression #1, char 1: unknown command: `@'
用@符号,即使没有提示啥错误,但实践发现其并没有被替换:
sed -s  "s@jenkins@@" /etc/hosts    

模糊匹配删一行:
sed -i "/.*bbs.mysql.*/d" /etc/hosts



用斜杠就对了,以行打头进行匹配:


比如删除Nginx里的nginx.conf里的    include vhosts/mini.conf,注意:如果有多个可能会删除多行;



用这个检查后加的|| /usr/sbin/ntpdate 10.70.36.233 && hwclock -w,就行,看看结果
Ansible的crontab模块批量修改:

是否修改成功:


通过vi的%s/$/;/g 来给一个100M的大文件进行替换,vim赶紧很吃力。
于是通过sed来实现该功能,如下:
sed -i "s/$/;/g" sqlcheckout.sql

或者删除某文件以某字符开头的行:

sed '/^FScoreDetailId/d'  sqlcheckoutResultTestResult.txt


删除Crontab里的ntpdate,测试如下:


下面这样能删除,但是能留下空行:



#Ansible: sync time from ntp server
40 4 * * * /usr/sbin/ntpdate 192.168.105.** || /usr/sbin/ntpdate 10.70.36.***
40 4 * * * /usr/sbin/ntpdate 192.168.105.**
删除步骤:
sed -i 's#^.*\/usr\/sbin\/ntpdate.*$##'  /var/spool/cron/root

sed -i '/^$/d'   /var/spool/cron/root


先修改,再一个一个干掉多余的比较靠谱稳妥:
ansible-playbook common.yml -t common_crontab_ntpdate -e h=jackX
看下有多少个重复的:
ansible itest -a"cat /var/spool/cron/root|grep  'ntpdate 10.70.36.***'"


=================================================================
一、sed 中的-i参数说明:直接删除文件里某行或某几行后保存回被删除文件,如下:
sed -i '1d'  nginx.conf   #直接删除文件第1行,删除结果后保存回被删除文件。
想删除最后几行,可以用tac反序输出文件,删除后面3行, 1-3行:

  tac nginx.conf | sed '1,3d'|tac > nginxnew.conf  #先按行颠倒一下文件内容,再把这个流给用Sed删除掉前3行,也就是原文件后面三行,然后再颠倒还原回去,再保存回新文件,一定要回新文件,否则原文件变空了。

tac :反序输出文件简介。

二、用Sed显示某一行:
[root@bogon diff]# sed -n '1p' A.txt    

111 21
[root@bogon diff]# sed -n '1p' A.txt


三、用sed来修改某一行的方法:
如有文件sedline.txt 内容如下:
jackxiang
lksjkdfs
xiangdong
xdy108

四、用Sed替换之替换某行里的内容?如:第4行有一个xdy108的串,如何用sed来修改这个xdy为jackcom呢?4s:
sed '4s/xdy/jackcom/' sedline.txt > sendlinemodified.txt
或者直接对该文件做修改:
sed  -i '4s/xdy/jackcom/' sedline.txt  
-i: 直接将修改这个sedline.txt文件。
模拟替换:-n p参数,这样不会真替换,而是将替换部分显示出来,很是方便测试:
sed  -n 's/xdy/jackcom/p' sedline.txt  

在某行后插入一行:下面是在第二行后插入SOME_CONTENT_Behind_3rdLine ,并回写回文件中,用到 -i就是这个意思。
sed -i '2 a SOME_CONTENT_Behind_3rdLine' sedline.txt

补充:
在b.txt的第2行之前插入“xxx”
    sed '2 i/xxx' b.txt
在b.txt的第2行之后插入“xxx”
    sed '2 a/xxx' b.txt
在b.txt的第2行和第3行之后插入“xxx”
    sed '2,3 a/xxx' b.txt
在b.txt的第2行和第3行之前插入“xxx”
    sed '2,3 i/xxx' b.txt
在b.txt的第2行至最后一行之前插入“xxx”
    sed '2,$ i/xxx' b.txt
总结
    在指定行之前插入使用的是“i”,而在指定行之后插入是使用“a”

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/3991/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2019-7-22 13:37
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]