通过学习如何操作我正在编写的 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