我的文件包含以下数据,我正在使用脚本来解析、执行 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
打印值Pinging
或NotPinging
。如果你想打印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")
)。