免费注册 查看新帖 |

Chinaunix

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

[系统安装] 怎么在linux中用正则过滤文本 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-08-05 14:55 |只看该作者 |倒序浏览
rt,if我知道可以 =~ 但是如果我要用正则过滤怎么破,sed似乎有的正则识别不全,尤其是+,该怎么解决

论坛徽章:
0
2 [报告]
发表于 2016-08-05 15:11 |只看该作者
顶一下,别沉

论坛徽章:
9
操作系统版块每日发帖之星
日期:2016-01-08 06:20:00操作系统版块每日发帖之星
日期:2016-01-28 06:20:0015-16赛季CBA联赛之四川
日期:2016-05-17 17:50:32操作系统版块每日发帖之星
日期:2016-08-01 06:20:0015-16赛季CBA联赛之广东
日期:2016-08-01 16:01:57操作系统版块每日发帖之星
日期:2016-08-04 06:20:00IT运维版块每日发帖之星
日期:2016-08-07 06:20:00操作系统版块每日发帖之星
日期:2016-08-07 06:20:0015-16赛季CBA联赛之福建
日期:2017-03-07 17:14:27
3 [报告]
发表于 2016-08-05 15:20 |只看该作者
你的问题就犹如 我想做菜 请问我该怎么做

但谁知道你是要做炒白菜,还是要炖排骨?

楼主肯定会说 我说了啊 我要做菜。

那我只能说 就按正则表达式的规则来。

论坛徽章:
0
4 [报告]
发表于 2016-08-05 15:35 |只看该作者
回复 3# Riet


  ll | sed -n "/^-.+/p" 这个命令为例吧,我记得正则里.是代表任意字符+是代表一次或多次,但是放到这个命令里没有输出任何结果,是怎么回事。。

论坛徽章:
9
操作系统版块每日发帖之星
日期:2016-01-08 06:20:00操作系统版块每日发帖之星
日期:2016-01-28 06:20:0015-16赛季CBA联赛之四川
日期:2016-05-17 17:50:32操作系统版块每日发帖之星
日期:2016-08-01 06:20:0015-16赛季CBA联赛之广东
日期:2016-08-01 16:01:57操作系统版块每日发帖之星
日期:2016-08-04 06:20:00IT运维版块每日发帖之星
日期:2016-08-07 06:20:00操作系统版块每日发帖之星
日期:2016-08-07 06:20:0015-16赛季CBA联赛之福建
日期:2017-03-07 17:14:27
5 [报告]
发表于 2016-08-05 15:44 |只看该作者
ll | sed -rn "/^-.+/p"

论坛徽章:
0
6 [报告]
发表于 2016-08-05 16:10 |只看该作者
回复 5# Riet


    谢谢

求职 : Linux运维
论坛徽章:
203
拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:57:092015小元宵徽章
日期:2015-03-06 15:58:182015年亚洲杯之约旦
日期:2015-04-05 20:08:292015年亚洲杯之澳大利亚
日期:2015-04-09 09:25:552015年亚洲杯之约旦
日期:2015-04-10 17:34:102015年亚洲杯之巴勒斯坦
日期:2015-04-10 17:35:342015年亚洲杯之日本
日期:2015-04-16 16:28:552015年亚洲杯纪念徽章
日期:2015-04-27 23:29:17操作系统版块每日发帖之星
日期:2015-06-06 22:20:00操作系统版块每日发帖之星
日期:2015-06-09 22:20:00
7 [报告]
发表于 2016-08-05 22:17 |只看该作者
-r 选项是脱义

sed

注意:p写在单引号里面和单引号外面都可以!

[root@steven ~]# sed '10'p -n /etc/passwd
uucp:10:14:uucp:/var/spool/uucp:/sbin/nologin
[root@steven ~]# sed '10p' -n /etc/passwd
uucp:10:14:uucp:/var/spool/uucp:/sbin/nologin
d写在单引号里面和单引号外面都可以!

复制代码
root@steven ~]# sed '1,30'd  /etc/passwd
user1:502:502::/home/user1:/bin/bash
xp:503:503::/home/xp:/bin/bash
wrg:504:504::/home/wrg:/bin/bash
lct:505:505::/home/lct:/bin/bash
apache:48:48:Apache:/var/www:/sbin/nologin
hua:506:506::/home/hua:/bin/bash
user3:507:507::/home/user3:/bin/bash
user4:508:508::/home/user4:/bin/bash
[root@steven ~]# sed '1,30d'  /etc/passwd
user1:x:502:502::/home/user1:/bin/bash
xp:x:503:503::/home/xp:/bin/bash
wrg:x:504:504::/home/wrg:/bin/bash
lct:x:505:505::/home/lct:/bin/bash
apache:x:48:48:Apache:/var/www:/sbin/nologin
hua:x:506:506::/home/hua:/bin/bash
user3:x:507:507::/home/user3:/bin/bash
user4:x:508:508::/home/user4:/bin/bash
复制代码




sed (用在  查找/替换 's///g'  和 删除 d  -i , 如果单纯只是查找 完全可以用grep代替 ,sed无法用颜色标记)

p:print 打印,-n:只打印特定行 -n和p连用:  sed '1,4'p -n 1.txt; sed '5,$'p -n 1.txt





打印包含某个字符串的行,可以使用 ^ . * $等特殊符号  sed -n '/ro*t/'p 1.txt  ;o,|,t 三选一 没有特别意思  sed -r -n '/ro[o|t]/p' 1.txt  
脱义 -r:  sed -r -n '/ro?t/'p 1.txt  
root或者mysql:  sed -r -n '/root|mysql/p' 1.txt  
-e 可以实现同时进行多个任务 并且,就像传送带:  sed -e '/root/p' -e '/body/p' -n 1.txt  也可以用;实现  sed '/root/p; /body/p' -n 1.txt  
删除行 :  sed '/root/d' 1.txt  ;  sed '1d' 1.txt  ;  sed '10,$d' 1.txt  
替换,其中s就是替换的意思,g为全局替换,否则只替换第一次的,/也可以为 #, @ 等: sed '1,2s/ot/to/g' 1.txt  ;  sed '1,$s/ot/to/g' 1.txt  等价于  sed 's/ot/to/g' 1.txt  
大小写替换: 大写 sed -i 's/[a-z]/\u&/g' 1.txt  ;小写 sed -i 's/[a-z]/\l&/g' 1.txt  
删除所有数字:  sed 's/[0-9]//g' 1.txt  
删除所有非数字:  sed 's/[^0-9]//g' 1.txt  



\1 代表第一个括号
调换两个字符串位置,\1\2\3 分段,可以用aa:bb:cc做一下练习 :  head -n2 1.txt |sed 's/\(root\)\(.*\)\(bash\)/\3\2\1/'  

在文件中某一行例如root行最后添加一个数字     sed -r 's/(^root.*)/\1 12/' /etc/passwd       \1表示(^a.*)

或者去除某个分段: echo aaa_bbb_ccc_01_022615.trig_02262015|sed "s/\(aaa\)\(.*\)\($n\)/\1\2/"
直接修改文件内容 :  sed -i 's/ot/to/g' 1.txt



跟vim的末行模式替换是一样的   :6,10s/iptables/IP/g   等同于  sed -i '6,10s/iptables/IP/g' 22.txt  



替换的时候顺便进行备份 -i.bak : sed -i.bak 's/enabled/disabled/' /etc/selinux/config

修改selinux为disabled: sed -i 's/enabled/disabled/' /etc/selinux/config





sed练习题:
把/etc/passwd 复制到/root/test.txt,用sed打印所有行
打印test.txt的3到10行
打印test.txt 中包含 'root' 的行
删除test.txt 的15行以及以后所有行
删除test.txt中包含 'bash' 的行
替换test.txt 中 'root' 为 'toor'
替换test.txt中 '/sbin/nologin' 为 '/bin/login'
删除test.txt中5到10行中所有的数字
删除test.txt 中所有特殊字符(除了数字以及大小写字母)
把test.txt中第一个单词和最后一个单词调换位置
把test.txt中出现的第一个数字和最后一个单词替换位置
把test.txt 中第一个数字移动到行末尾
在test.txt 20行到末行最前面加 'aaa:',& 表示的是要被替换的部分 aaa:&:  sed '20,$s/.*/aaa:&/' test.txt

在test.txt 的每行后面加空格 12   sed 's/.*/& 12/' test.txt
比如大小写替换:大小写替换: 大写  sed -i 's/[a-z]/\u&/g' 1.txt  ;小写  sed -i 's/[a-z]/\l&/g' 1.txt

使用sed 过滤一段时间范围内的nginx日志: sed -n '/01\/Mar\/2016:20:52/,/01\/Mar\/2016:21:14:2/'p www.log |wc -l

在/etc/passwd文件中在以第一个mail开头的行到以一个ftp开头的行的后面添加abc,并在abc前面加一个空格

sed '/^www\>/,/^www1\>/s/$/ abc/' /etc/passwd
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP