【发布时间】:2020-05-18 16:55:53
【问题描述】:
我正在运行此命令(将输出保存到文本文件:
netstat -ntp | grep tcp | grep EST | grep 34341
假设它有下面的输出(可以是单行或多行):
tcp 593 0 10.10.1.11:43856 10.10.2.14:3434 ESTABLISHED 146597/daemon-
tcp 417 0 10.10.1.11:43859 10.10.2.15:3434 ESTABLISHED 146567/daemon-
tcp 317 0 10.10.1.11:43121 10.10.2.16:3434 ESTABLISHED 146582/daemon-
这是我到目前为止的想法(在阅读了您的 cmets 之后):
#! /bin/bash
SLEEP=5
COUNTER=0
recvq()
{
while read -r proto recvq x local remote state x
do
if [[ "$proto" == tcp && "$state" == ESTABLISHED && "$remote" =~ .*:3434 ]]
then
printf "%d\n" "$recvq"
fi
done < "$1"
}
while true; do
(( COUNTER++ ))
# measure recvq value
declare -A first
while read -r socket recvq
do
first[$socket]=$recvq
done < <(recvq netstat1.txt)
# sleep
sleep "$SLEEP"
# measure recvq value after sleep
declare -A second
while read -r socket recvq
do
second[$socket]=$recvq
done < <(recvq netstat2.txt)
[ ${#first[*]} != ${#second[*]} ] && { echo "Arrays are different size"; }
for ii in ${!first[*]}; do
[ "${first[$ii]}" == "${second[$ii]}" ] || { echo different element $ii; exit 1; }
done
echo "Arrays are identical"
done
现在我需要比较文件中每一行的 recvq 值(睡眠前)和 recvq 值(睡眠后)。如果任何初始 recvq 值与最终 recvq 值相同,则执行某些操作。
问题是我总是得到相同的数组,即使它们不是!
【问题讨论】:
-
不要写论文。缩小你的问题。减少到实际问题。 minimal reproducible example
-
我已经创建了单行输出所需的脚本,但我无法弄清楚多行输出这是否意味着循环输出还不够?它是上下文敏感的吗?您的实际问题在哪里(预期与观察到的行为)?
-
对于单行输出,它工作正常。我想让它适用于任何输出,我的意思是单行、2 行或任意行数的输出
-
@BogdanStoica :首先,我将删除
grep 3434,因为稍后您将再次检查此端口。然后我会扔掉两个标题行。这将为您提供表格形式的数据,以空格分隔。然后,您可以使用 awk 选择正确的行并收集 recv-Q 值并将它们写入标准输出 - 如果需要,您可以将其捕获到 bash 数组中。 -
感谢您的信息,这就是我想做的事情,但没有成功;(