Chinaunix

标题: 求一文本处理SHELL [打印本页]

作者: softiger    时间: 2014-12-08 12:30
标题: 求一文本处理SHELL
本帖最后由 softiger 于 2014-12-08 13:11 编辑

有如下的文本:

num;allip
1,192.168.27.1-192.168.28.1-15.2.5.79-23.4.33.11
2,192.168.27.2-15.2.104.108-192.168.28.2-15.2.5.78-23.4.33.12
3,15.2.105.186-15.2.13.60-15.2.13.60
4,15.2.105.187-15.2.13.61-15.2.13.61
5,15.2.105.180-fe80::250:56ff:fe85:e71-15.2.13.54-fe80::250:56ff:fe85:1a6a-15.2.13.54-192.168.0.2


....

该文本由两列组成,一列是序号,二列是IP清单,IP清单一“-”号分割。
需要删除IP列表中的包含192的IP数据或者是IPV6的数据

删除后的效果是:
num;allip
1,15.2.5.79-23.4.33.11
2,15.2.104.108-15.2.5.78-23.4.33.12
3,15.2.105.186-15.2.13.60-15.2.13.60
4,15.2.105.187-15.2.13.61-15.2.13.61
5,15.2.105.180-15.2.13.54-15.2.13.54
作者: kaede_1    时间: 2014-12-08 12:57
ip列表第一列都是192开头的吗?还是在任意列?
作者: zxy877298415    时间: 2014-12-08 12:58
awk -F '[,-]' '{print $1","$3"-"$4}' file


   
作者: softiger    时间: 2014-12-08 12:58
回复 2# kaede_1


    是随意的,并且不止是192开头,还要删除其他字符,只是起个例子
作者: ly5066113    时间: 2014-12-08 13:01
回复 1# softiger
  1. sed 's/,[^-]*-/,/' file
复制代码

作者: softiger    时间: 2014-12-08 13:20
回复 5# ly5066113


    这个方法不对啊
作者: zxy877298415    时间: 2014-12-08 13:32
本帖最后由 zxy877298415 于 2014-12-08 13:42 编辑

awk -F, '{for (i=2;i<=NF;i++) {printf  $1",";split($2,a,"-");for (j=1;j<=length(a);j++) {if ((a[j]~/^192|^fe/)) {a[j]=""} else {printf a[j]"-"}}print "";delete a;}}' file | sed 's/-$//g'


   
作者: Buring__    时间: 2014-12-08 14:08
回复 1# softiger
  1. sed 's/192[^-]\+-\?\|fe[^-]\+-\?//g;s/-$//' urfile
复制代码

作者: Looiml    时间: 2014-12-08 14:30
本帖最后由 Looiml 于 2014-12-08 14:35 编辑

考虑到192可能出现在IP的2,3,4段的可能性
  1. sed -r -e 's/([,-])(192[0-9.]+|([0-9a-f]*:){5}[0-9a-f]*)-?/\1/g' -e 's/-$//' a.txt
复制代码

作者: jason680    时间: 2014-12-08 21:42
回复 1# softiger

$ awk -F'[,-]' -vOFS="-" 'NF>1{c=0;N=$1",";for(n=2;n<=NF;n++){if($n!~/^192\./&&$n!~/:/){$(++c)=N$n;N=""}}NF=c}1' FILE
num;allip
1,15.2.5.79-23.4.33.11
2,15.2.104.108-15.2.5.78-23.4.33.12
3,15.2.105.186-15.2.13.60-15.2.13.60
4,15.2.105.187-15.2.13.61-15.2.13.61
5,15.2.105.180-15.2.13.54-15.2.13.54

作者: Buring__    时间: 2014-12-08 22:56
回复 9# Looiml


    貌似需要价格标签,不然对于这样的
1,192.168.27.1-192.168.28.1-15.2.192.79-23.4.33.11
不能完全替换
  1. sed -r -e ':a;s/([,-])(192[0-9.]+|([0-9a-f]*:){5}[0-9a-f]*)-?/\1/g;ta' -e 's/-$//' urfile
复制代码

作者: 聆雨淋夜    时间: 2014-12-09 00:04
  1. sed -r 's/192.([0-9]{1,3}\.){2}[0-9]{1,3}-//g;s/[^-]*::[^-]*-//g' file
复制代码

作者: Looiml    时间: 2014-12-09 08:14
回复 11# Buring__
还真是,疏忽了,前一个192地址替换掉后,下一个192地址就匹配不到前面的[,-]了。感谢提醒。
   
作者: weiwenman    时间: 2014-12-09 12:10
awk -F'[,-]' '{for(i=1;i<=NF;i++)if(! ($i ~ "192.*" || $i ~ ":")){if(i==1)printf "%s,",$i;else if(i!=NF&&i>1) printf "%s-",$i;else printf "%s",$i}printf "\n"}' text.txt  | sed 's/[^0-9]$//'

作者: klainogn    时间: 2014-12-09 13:23
  1. sed -r 's/[^-]+:[^-]+-?|192(\.[0-9]+){3}-?//g;s/-$//' file
  2. num;allip
  3. 1,15.2.5.79-23.4.33.11
  4. 2,15.2.104.108-15.2.5.78-23.4.33.12
  5. 3,15.2.105.186-15.2.13.60-15.2.13.60
  6. 4,15.2.105.187-15.2.13.61-15.2.13.61
  7. 5,15.2.105.180-15.2.13.54-15.2.13.54
复制代码





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