从 mikrotik 解析 IP 和 Download-Total

Parse IP and Download-Total from mikrotik

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

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' 试试。 那么,我该如何解析呢?对不起英语不好..

用另一个管道继续你的解析线(我认为最简单的方法)

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

输出

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

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

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

awk 中相同

如果总是完全相同的结构

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