从mikrotik解析IP和Download-Total

时间:2015-06-18 06:04:25

标签: regex bash sed grep mikrotik

我想从mikrotik命令/queue simple print stat中提取IP和下载总数 以下是一些例子:

0    name="101" target=192.168.10.101/32 rate=0bps/0bps total-rate=0bps 
  packet-rate=0/0 total-packet-rate=0 queued-bytes=0/0 
  total-queued-bytes=0 queued-packets=0/0 total-queued-packets=0 
  bytes=17574842/389197663 total-bytes=0 packets=191226/308561 
  total-packets=0 dropped=9/5899 total-dropped=0 

1    name="102" target=192.168.10.102/32 rate=0bps/0bps total-rate=0bps 
  packet-rate=0/0 total-packet-rate=0 queued-bytes=0/0 
  total-queued-bytes=0 queued-packets=0/0 total-queued-packets=0 
  bytes=65593392/183786457 total-bytes=0 packets=163260/166022 
  total-packets=0 dropped=175/2403 total-dropped=0 

2    name="103" target=192.168.10.103/32 rate=0bps/0bps total-rate=0bps 
  packet-rate=0/0 total-packet-rate=0 queued-bytes=0/0 
  total-queued-bytes=0 queued-packets=0/0 total-queued-packets=0 
  bytes=3263234/67407044 total-bytes=0 packets=41437/52602 
  total-packets=0 dropped=0/546 total-dropped=0

我需要的只是:

192.168.10.101 389197663  
192.168.10.102 183786457
192.168.10.103 67407044  

但是我得到了

target=192.168.10.101/32
bytes=17574842/389197663
target=192.168.10.102/32
bytes=65593392/183786457
target=192.168.10.103/32
bytes=3263234/67407044

我用grep -oP 'target=.*?\ |[^\-]bytes=.*?\ ' | sed 's/^ //g'尝试。 那么,我该如何解析呢?抱歉英文不好..

2 个答案:

答案 0 :(得分:1)

继续使用其他管道进行解析(我认为最简单的方法)

grep -oP 'target=.*?\ |[^\-]bytes=.*?\ ' file | sed 's/^ //g' | sed -r 's/target=([^/]*)[/].*/\1/; s/bytes=[^/]*[/]//' | sed 'N; s/\n/ /'

输出

192.168.10.101 389197663 
192.168.10.102 183786457 
192.168.10.103 67407044 

答案 1 :(得分:1)

sed '/^[0-9]\{1,\}[[:blank:]]\{1,\}name/,/^[[:blank:]]*$/ {
   /^[0-9]/{ 
      s#.*target=\([^/]*\).*#\1#;h;d
      }
   \#^[[:blank:]]*bytes=[0-9]*/\([0-9]*\).*# !d
   s//\1/
   G
   s/\(.*\)\n\(.*\)/\2 \1/p
   }
   d
   ' YourFile

有点长但是在1 sed中完成工作

awk '{
   if ( $3 ~ /target=/ ) split( $3, aIP, "[=/]")
   if ( $1 ~ /^[[:blank:]]*bytes=[0-9]*/ ) {
      split( $1, aByt, "/")
      print aIP[2] " " aByt[2]
      }
   }' YourFile
在awk中

同样

如果总是完全相同的结构

awk 'BEGIN{ RS="" }
     { split( $3, aIP, "[=/]"); split( $12, aByt, "/")
       print aIP[2] " " aByt[2]
     }' YourFile