Chinaunix

标题: sed截取字段问题 [打印本页]

作者: 芬达7402    时间: 2012-01-19 14:44
标题: sed截取字段问题
请教各位,有个文件内容看起来如下:
["check_ssh",ok],["check_eth",ok],["check_disk",ok],["check_swap",ok],["check_mem",ok],["check_hardware",false],["check_filesystem",false],["check_port",ok],["check_redis-server",ok],["check_login",ok]
现在我想用sed截取这些字段中含有false的部分,比如说我想截取check_hardware和check_filesystem,请问应该如何用sed来做到?
作者: yinyuemi    时间: 2012-01-19 14:58
回复 1# 芬达7402
  1. echo  '["check_ssh",ok],["check_eth",ok],["check_disk",ok],["check_swap",ok],["check_mem",ok],["check_hardware",false],["check_filesystem",false],["check_port",ok],["check_redis-server",ok],["check_login",ok]' |grep -Po '(?<=")([^"]+)(?=",false)'
  2. check_hardware
  3. check_filesystem
复制代码

作者: 芬达7402    时间: 2012-01-19 15:03
达人啊,太强了!grep就能实现?我好好研究一下!
作者: 芬达7402    时间: 2012-01-19 15:10
查了下,-P参数是指使用perl的表达式,-o是只显示符合表达式部分的内容。
作者: yinyuemi    时间: 2012-01-19 15:12
回复 4# 芬达7402
有一种正则匹配用法叫“零宽断言”
   
作者: 芬达7402    时间: 2012-01-19 15:14
2楼的朋友能大致解释下'(?<=")([^"]+)(?=",false)'的意思吗?
作者: 芬达7402    时间: 2012-01-19 15:18
http://blogt.chinaunix.net/space ... blog&id=3017242
不得不再次说下,你们都是强人。。膜拜。。
作者: ywlscpl    时间: 2012-01-19 15:27
回复 6# 芬达7402


(?<=")([^"]+)(?=",false)  分成三块应该好理解了吧
?<="           开始
[^"]+          你要的东西
?=",false     结束
作者: 芬达7402    时间: 2012-01-19 17:37
ywlscpl 发表于 2012-01-19 15:27
回复 6# 芬达7402

看了零宽断言的介绍后,理解了!
作者: dn833    时间: 2012-01-19 18:45
sed 's/\],\[/\n/g' 文件 |awk -F "\"|," '$NF ~ /false/ {print $2}'

比沙发的效率差很多,但是理解起来更容易些。
作者: Linux9253    时间: 2012-01-28 15:31
  1. sed -n ':a;s/\([^["]]*\),/\1\n/gp' a|sed -n 's/^\["\(.*\)",false\]/\1/p'
复制代码
这个可以但是是两句、一句是把,号换成换行、另一句是匹配字符、怎么才能把他们写在一句上呢?
就是说执行完第一句之后在执行第二句、我用跳转试了好长时间、出不来、呵呵、水平问题、所以请大家帮忙、
把这两句组合在一起
作者: yangkyo821    时间: 2012-01-28 16:48
本帖最后由 yangkyo821 于 2012-01-28 16:49 编辑
Linux9253 发表于 2012-01-28 15:31
这个可以但是是两句、一句是把,号换成换行、另一句是匹配字符、怎么才能把他们写在一句上呢?
就是说执行 ...
  1. sed -n 's/],/]\n/g;/^[^\n]*false/{s/^\["\([^"]*\)",false\]\n/\1\n/;P};D'
复制代码

作者: Linux9253    时间: 2012-01-29 12:27
回复 12# yangkyo821


    万分感谢、我用sedsed调试了下、思路非常的清晰、
作者: winway1988    时间: 2012-01-29 12:47
本帖最后由 winway1988 于 2012-01-29 13:16 编辑
  1. awk 'BEGIN{RS="\",false]";FS="\""} $NF !~ /]/{print $NF}'
复制代码
  1. sed -n '/false/{s/false/\n/; s/[^\n]*\["\([^\n]*\)",/\1/;P ;D}'
复制代码

作者: Linux9253    时间: 2012-02-01 15:48
  1. grep -oP '[^"]+(?=",false)' file
复制代码





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2