从 mikrotik 解析 IP 并下载总计

问题描述 投票:0回答:2

我想从 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'
尝试一下。 那么,我该如何解析它呢?抱歉英语不好..

regex sed grep
2个回答
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
投票
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
© www.soinside.com 2019 - 2024. All rights reserved.