Ping 文件中的 IP

Ping 文件中的 IP

我的文件包含以下数据,我正在使用脚本来解析、执行 ping 并显示输出,我在脚本中遇到一些问题,请协助。

File.txt 包含以下数据:

Server          ProdTerminalA   192.168.132.10
Server          ProdTerminalB   192.168.132.11
Server          ProdTerminalC   192.168.132.12
Server          ProdTerminalD   192.168.132.13
Server          DevTerminalA    192.168.131.10
Server          DevTerminalB    192.168.131.11
Server          DevTerminalC    192.168.131.12
Server          DevTerminalD    192.168.131.13
Server          TestTerminalA   192.168.133.10
Server          TestTerminalB   192.168.133.11 
Server          TestTerminalC   192.168.133.12
Server          TestTerminalD   192.168.133.13

我正在解析 DevTerminal 并通过解析数据 ping IP,但没有得到预期的输出。

grep "Dev" file.txt | while read ip; do ping -c2 $ip > /dev/null 2>&1 && echo -en "\t Pinging\n"  || echo -en "\t NotPinging\n"; done

预期结果应显示:

DevTerminalA    192.168.131.10  Status (Pinging or NotPinging)
DevTerminalB    192.168.131.11  Status (Pinging or NotPinging)
DevTerminalC    192.168.131.12  Status (Pinging or NotPinging)
DevTerminalD    192.168.131.13  Status (Pinging or NotPinging)

答案1

您可以将read每个空白分隔字段读入其自己的变量中:

#!/bin/bash

while read -r class name addr; do
        if [[ $name != Dev* ]]; then
                continue
        fi

        if ping -c 2 "$addr" >/dev/null 2>&1; then
                status=Pinging
        else
                status=NotPinging
        fi

        printf '%s\t%s\tStatus %s\n' "$name" "$addr" "$status"
done

该脚本从其标准输入流读取列表。您可以按照您想要的方式调整输出格式。

在我的局域网上测试:

$ ./script <File.txt
DevTerminalA  192.168.131.10  Status NotPinging
DevTerminalB  192.168.131.11  Status NotPinging
DevTerminalC  192.168.131.12  Status NotPinging
DevTerminalD  192.168.131.13  Status NotPinging

同样的事情,但使用awk

BEGIN { OFS="\t" }

$2 ~ /^Dev/ {
        if (!system("ping -c 2 " $3 ">/dev/null 2>&1"))
                status="Pinging"
        else
                status="NotPinging"

        print $2, $3, "Status " status
}

请注意,这在技术上包含一个代码注入漏洞,因为第三个字段中的字符串可能被设计为执行任意代码(通过简单地包含一个;和另一个 shell 命令)。

测试:

$ awk -f script File.txt
DevTerminalA  192.168.131.10  Status NotPinging
DevTerminalB  192.168.131.11  Status NotPinging
DevTerminalC  192.168.131.12  Status NotPinging
DevTerminalD  192.168.131.13  Status NotPinging

答案2

我想这就是您正在寻找的:

#!/bin/bash

grep "Dev" file.txt | while read data; do
   ip=$(awk '{print $3}' <<< "$data")
   name=$(awk '{print $2}' <<< "$data")
   echo -en "$name\t$ip"
   ping -c2 $ip > /dev/null 2>&1 && echo -en "\t Pinging\n"  || echo -en "\t NotPinging\n"; 
done

我不打印值而是Status打印值PingingNotPinging。如果你想打印Status之前你应该在行中使用它echo -en "$name\t$ip"

echo -en "$name\t$ip\tStatus"

您的主要问题是$ip变量,因为它不仅包含 ip,还包含如下内容:

Server          DevTerminalA    192.168.131.10

所以你正在使用:ping Server DevTerminalA 192.168.131.10

awk得到了开发终端A$(awk '{print $2}' <<< "$data")) 和192.168.131.10( $(awk '{print $3}' <<< "$data"))。

相关内容