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
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
sed 's/192[^-]\+-\?\|fe[^-]\+-\?//g;s/-$//' urfile
复制代码
作者:
Looiml
时间:
2014-12-08 14:30
本帖最后由 Looiml 于 2014-12-08 14:35 编辑
考虑到192可能出现在IP的2,3,4段的可能性
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
不能完全替换
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
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
sed -r 's/[^-]+:[^-]+-?|192(\.[0-9]+){3}-?//g;s/-$//' 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
复制代码
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2