免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3167 | 回复: 11

[文本处理] 请教如何判断文件内容并决定是否替换或删除 [复制链接]

论坛徽章:
0
发表于 2018-06-11 20:58 |显示全部楼层
请教一下,我在linux下面有如下文件:
/var/spool/cron/root


有二个要求请教一下大家怎么完成呢?
1. 先做一个判断,先看看这个文件是否包含"1.42 4 1 * * root run-parts /etc/cron.monthly",如果有,则不需要做任何事。如果没有,则另外将这行内容加上去。
2. 检查这个文件是否有一行这样的内容:"1.22 4 * * 0 root run-parts /etc/cron.weekly" 如果有,则自动将它的整行删除。


请问用sed或awk如何实现呢? 谢谢了!!!!

论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
发表于 2018-06-12 11:16 |显示全部楼层
回复 1# yexingqi


  1. awk 'BEGIN{a="1.42 4 1 \\* \\* root run-parts /etc/cron.monthly";b="1.22 4 \\* \\* 0 root run-parts /etc/cron.weekly"}$0~a{f=1}$0~b{$0=""}1;END{if(!f){gsub("\\\\","",a);print a}}' /var/spool/cron/root
复制代码

论坛徽章:
24
申猴
日期:2014-10-10 15:56:39射手座
日期:2014-10-10 15:57:18黑曼巴
日期:2018-05-14 11:05:122016科比退役纪念章
日期:2018-05-14 11:05:0715-16赛季CBA联赛之北控
日期:2018-05-14 11:05:0015-16赛季CBA联赛之江苏
日期:2017-02-27 18:11:0715-16赛季CBA联赛之上海
日期:2018-08-15 09:48:5415-16赛季CBA联赛之佛山
日期:2018-07-20 17:14:2315-16赛季CBA联赛之佛山
日期:2019-09-10 18:08:4615-16赛季CBA联赛之山西
日期:2020-03-26 09:40:5115-16赛季CBA联赛之佛山
日期:2020-05-08 09:03:54
发表于 2018-06-12 16:15 |显示全部楼层
本帖最后由 chengchow 于 2018-06-14 13:42 编辑

line1="1.42 4 1 * * root run-parts /etc/cron.monthly"
line2="1.22 4 * * 0 root run-parts /etc/cron.weekly"
file=/var/spool/cron/root
grep "$line1" $file >/dev/null 2>&1 || echo -e "$line1" >> $file
sed "/$line2/d" $file

论坛徽章:
0
发表于 2018-06-12 18:17 |显示全部楼层
回复 2# wh7211

谢谢您的回复. 能不能再请教一下,这个命令能分开二条命令执行吗? 用二行awk怎么实现呢? 我看到屏幕输出了正确的信息,但实际文件并没有修改的. 这个可以从print改为实际修复内容吗?

再次感谢!!!

论坛徽章:
0
发表于 2018-06-12 18:21 |显示全部楼层
回复 3# chengchow

您这个脚本最后二行执行都有问题.
grep "$1" $file >/dev/null 2>&1 || echo -e "$1" >> $file 这里文件并没有变化

sed "/$2/d" $file 这里报错如下:
sed: -e expression #1, char 0: no previous regular expression

谢谢!!

论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
发表于 2018-06-12 18:44 |显示全部楼层
本帖最后由 wh7211 于 2018-06-12 18:48 编辑

回复 4# yexingqi


<<<1条命令
  1. awk 'BEGIN{a="1.42 4 1 \\* \\* root run-parts /etc/cron.monthly";b="1.22 4 \\* \\* 0 root run-parts /etc/cron.weekly"}$0~a{f=1}$0~b{$0=""}{print > "/var/spool/cron/root"};END{if(!f){gsub("\\\\","",a);print a > "/var/spool/cron/root"}}' /var/spool/cron/root
复制代码

<<<分开2条命令
1. 先做一个判断,先看看这个文件是否包含"1.42 4 1 * * root run-parts /etc/cron.monthly",如果有,则不需要做任何事。如果没有,则另外将这行内容加上去。
  1. awk 'BEGIN{a="1.42 4 1 \\* \\* root run-parts /etc/cron.monthly"}$0~a{f=1}{print > "/var/spool/cron/root"};END{if(!f){gsub("\\\\","",a);print a > "/var/spool/cron/root"}}' /var/spool/cron/root
复制代码
2. 检查这个文件是否有一行这样的内容:"1.22 4 * * 0 root run-parts /etc/cron.weekly" 如果有,则自动将它的整行删除。
  1. awk 'BEGIN{a="1.22 4 \\* \\* 0 root run-parts /etc/cron.weekly"}$0~a{$0=""}{print > "/var/spool/cron/root"}' /var/spool/cron/root
  2. sed -i '/1.22 4 \* \* 0 root run-parts \/etc\/cron.weekly/d' /var/spool/cron/root
复制代码

论坛徽章:
766
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
发表于 2018-06-13 15:25 |显示全部楼层
本帖最后由 Herowinter 于 2018-06-13 15:26 编辑

写着玩当作练习
1. 修改原文件加-i
  1. sed -n '/1\.42 4 1 \* \* root run-parts \/etc\/cron\.monthly/h;p;${g;s#.#.#;t;s#.*#1.42 4 1 * * root run-parts /etc/cron.monthly#;p}' /var/spool/cron/root
复制代码

论坛徽章:
766
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
发表于 2018-06-13 16:46 |显示全部楼层
本帖最后由 Herowinter 于 2018-06-13 16:50 编辑

直接修改原文件两个命令都加-i
1.
  1. sed -n '/1\.42 4 1 \* \* root run-parts \/etc\/cron\.monthly/h;p;${g;s#.#.#;t;s#.*#1.42 4 1 * * root run-parts /etc/cron.monthly#;p}' /var/spool/cron/root
复制代码

2.
  1. sed '/1\.22 4 \* \* 0 root run-parts \/etc\/cron\.weekly/d' /var/spool/cron/root
复制代码



论坛徽章:
0
发表于 2018-06-13 20:51 |显示全部楼层
回复 6# wh7211


谢谢您了!!! 测试可以正常运行,感谢!!

论坛徽章:
0
发表于 2018-06-14 09:23 |显示全部楼层
回复 8# Herowinter

也谢谢你啊. 但我不明白,${g;s#.#.#;t;s#.*# 这里代表什么啊?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP