Awk 命令 - 组合两个命令

Awk 命令 - 组合两个命令

通过学习如何操作我正在编写的 bash 脚本的变量,我慢慢地摸索着。我正在尝试使用 AWK(尝试过 Grep 但我认为不够精细)从 iftop 中提取源和目标。

我使用的基本 iftop 命令是:

sudo iftop -t -L1 -s1 -f "dst host 10.0.0"

我可以将 dst 切换到 src 以获得相反的结果。所以上面命令的示例输出是:

interface: eth0
IP address is: 10.0.0.104
MAC address is: b8:27:eb:6a:26:84
Listening on eth0
   # Host name (port/service if enabled)            last 2s   last 10s  last 40s cumulative
--------------------------------------------------------------------------------------------
   1 10.0.0.255                               =>         0b         0b         0b         0B
     10.0.0.15                                <=     1.14Kb     1.14Kb     1.14Kb       291B
--------------------------------------------------------------------------------------------
Total send rate:                                       480b       480b       480b
Total receive rate:                                  1.29Kb     1.29Kb     1.29Kb
Total send and receive rate:                         1.76Kb     1.76Kb     1.76Kb
--------------------------------------------------------------------------------------------
Peak rate (sent/received/total):                       480b     1.29Kb     1.76Kb
Cumulative (sent/received/total):                      120B       331B       451B
============================================================================================

我正在尝试使用 AWK 将两个 IP 地址(或者可能是域)输出到变量,然后我可以在 bash 中执行某些操作。

如果我使用如下命令:

 sudo iftop -t -L1 -s1 -f "dst host 10.0.0" 2> /dev/null | awk '/^   1 / {print $2}'

这给了我第一个 IP 或域,但我现在需要第二行。我尝试使用类似的东西:

 sudo iftop -t -L1 -s1 -f "dst host 10.0.0" 2> /dev/null | awk '/^   1 /{c=2} c&&c-- {print $2}'

这几乎可以工作,但是由于第二行上的白色间距,AWK 将第一行中的第 2 列计算为第二行中的第 1 列,因此我得到的输出是:

10.0.0.255
<=

我觉得我已经很接近了,但我不知道如何使用单个 AWK 命令来吐出正确的两个数字。

我无法轻松地对第二个数字运行第二个模式比较,因为 IP 或域之前的空格不足以继续下去,所以理想情况下,我想匹配第一个数字,然后移动到下一行,但选择第 1 列而不是第 2 列。

我还想避免运行第二个 iftop 命令,因为结果可能与第一个不同。

然后我需要知道如何将它们转换为 bash 脚本的变量,而不是将它们打印到屏幕上。

有任何想法吗?

答案1

尝试

 ... | awk '$1 == "1" {print $2 ; l=NR+1 ; } NR == l { print $1 ;}'

在哪里

  • $1 == "1" 选择第一个字段为 1 的行
  • {print $2 打印它的值
  • l=NR+1 ; }记住下一行
  • NR == l选择第二行
  • { print $1 ;}打印第一个字段

请记住 awk 不考虑列,而只考虑字段。

这两行等效于使用$1 $2

 hello world
       hello              world

分配给 var

... | awk '$1 == "1" {printf "A=%s\n",$2 ; l=NR+1 ; } NR == l { printf "B=%s\n",$1 ;}' > /tmp/.var
. /tmp/.var

最后一行是一个点 ( .) 一个空格 ( ) 和/tmp/.var

  • awk 中的 printf 需要在参数后加一个逗号。

答案2

你可以用这个:

sudo iftop -t -L1 -s1 -f "dst host 10.0.0" | grep -E '=>|<=' | cut -c 5- | awk '{ print $1 }'

返回:

10.0.0.255
10.0.0.15

问题在于以下两行的“列”数不同。上面的命令cut用于删除前5个字符,因此删除了“1”。

 1 10.0.0.255                         =>         0b         0b         0b         0B
   10.0.0.15                          <=     1.14Kb     1.14Kb     1.14Kb       291B

答案3

grep

... | grep -oP '^\s+\d* \K(\d+\.){3}\d+'
10.0.0.255
10.0.0.15

相关内容