忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
12下一页
最近访问板块 发新帖
查看: 1056 | 回复: 10

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

论坛徽章:
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如何实现呢? 谢谢了!!!!

论坛徽章:
13
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之青岛
日期:2018-06-08 13:45:2815-16赛季CBA联赛之同曦
日期:2018-06-04 19:42:2015-16赛季CBA联赛之山东
日期:2018-05-30 12:44:59CU十四周年纪念徽章
日期:2018-05-15 11:36:3815-16赛季CBA联赛之广东
日期:2018-05-14 09:52:4215-16赛季CBA联赛之深圳
日期:2018-05-04 21:53:0815-16赛季CBA联赛之辽宁
日期:2018-04-02 14:03:3915-16赛季CBA联赛之北京
日期:2018-03-23 15:24:07CU十四周年纪念徽章
日期:2018-03-16 13:09:532016科比退役纪念章
日期:2018-01-19 12:45:5915-16赛季CBA联赛之同曦
日期:2017-09-11 14:39:48
发表于 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
复制代码

论坛徽章:
17
申猴
日期: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:07
发表于 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

谢谢!!

论坛徽章:
13
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之青岛
日期:2018-06-08 13:45:2815-16赛季CBA联赛之同曦
日期:2018-06-04 19:42:2015-16赛季CBA联赛之山东
日期:2018-05-30 12:44:59CU十四周年纪念徽章
日期:2018-05-15 11:36:3815-16赛季CBA联赛之广东
日期:2018-05-14 09:52:4215-16赛季CBA联赛之深圳
日期:2018-05-04 21:53:0815-16赛季CBA联赛之辽宁
日期:2018-04-02 14:03:3915-16赛季CBA联赛之北京
日期:2018-03-23 15:24:07CU十四周年纪念徽章
日期:2018-03-16 13:09:532016科比退役纪念章
日期:2018-01-19 12:45:5915-16赛季CBA联赛之同曦
日期:2017-09-11 14:39:48
发表于 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
复制代码

论坛徽章:
398
金牛座
日期: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
复制代码

论坛徽章:
398
金牛座
日期: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号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP