刚刚在cu上看到这样一个帖子,比较感兴趣,先列在这里。
知道文件中的一行 含有“-d”或"“--dst-range" 但是不能确定它在一行中的哪一个域, 我想把“-d”域或“--dst-range ” 域后边的域打印出来!
file:
iptables -A APP -m set --set app10000 src -p tcp -m multiport --dports
1,2,3,4,5,6,7,8 -d 1.1.1.1 -m time --weektime 111111100002359
-j DROP
iptables -A APP -m set --set app10000 src -p tcp -m multiport -d 1.1.1.1 -m time --weektime 111111100002359 -j DROP
iptables -A APP -m set --set app10000 -d 1.1.1.1 -m time --weektime 111111100002359 -j DROP
iptables -A APP -m set --set app10002 src -p tcp -m multiport --dports -m iprange --dst-range 2.2.2.2-3 -m time --weektime
iptables -A APP -m set --set app10000 src -p tcp -m multiport --dports
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 -m iprange --dst-range
2.2.2.2-3 -m time --weektime
iptables -A APP -m set --set app10002 src -p tcp -m multiport --dports
1,2,3,4,5,6,7,8 -d 1.1.1.1 -m time --weektime 111111100002359
-j DROP
请不要以“-d” 或“--dst-range ”为分隔符,应为选行还有一些别的条件!
实现方法:
1》
along@along-laptop:~/code/shell/shell$ grep -oP '(?<=-d\s)[^\s]+|(?<=--dst-range\s)[^\s]+' file
1.1.1.1
1.1.1.1
1.1.1.1
2.2.2.2-3
2.2.2.2-3
1.1.1.1
2》
along@along-laptop:~/code/shell/shell$ awk '{for(i=1;i<=NF;i++)if($i=="-d"||$i=="--dst-range")printf $(i+1)"";print ""}' file
1.1.1.1
1.1.1.1
1.1.1.1
2.2.2.2-3
2.2.2.2-3
1.1.1.1
第二种方法很容易可以看出来。第一种方法还有点迷糊,不过现写在这里。
-P, --perl-regexp
Interpret PATTERN as a Perl regular expression. This is highly experimental and grep -P may warn
of unimplemented features.
-o, --only-matching
Print only the matched (non-empty) parts of a matching line, with each such part on a separate
output line.
阅读(2726) | 评论(0) | 转发(0) |