0

我有一个带有我想检查的 IP 列表的 txt fping,然后将 IP 转换为名称。

我的文件 ( hosts.txt) 如下所示:

192.168.1.1 服务器A
192.168.1.2 服务器B
192.168.1.3 服务器C

这是我写的脚本:

#! /bin/bash
N_Hosts=$(wc hosts.txt | awk {'print $1'})

typeset Nodos[$N_Hosts]

i=0;  
while read line  
do  
 Nodos[$i]=$(echo $line | awk {'print $1'})  
 i=$i+1  
done < hosts.txt

comando="fping "
comandoCompleto=$comando${Nodos[*]}

$comandoCompleto | sed 's/is alive/OK/g' | sed 's/is unreachable/down/g'

它的输出是这样的:

192.168.1.1 OK
192.168.1.2 下
192.168.1.3 OK

我希望它是:

serverA OK
serverB down
serverC OK

是否可以使用sedor更改输出awk

4

4 回答 4

3

如果您有两个文件,hosts.txt 和 output.txt(脚本输出),那么您可以执行以下操作:

awk 'NR==FNR{a[$1]=$2;next}{$1=a[$1]}1' hosts.txt output.txt
于 2013-06-18T16:26:43.143 回答
1

完全在 awk 中(我认为这需要 gawk)

gawk '
    { 
        name[$1] = $2 
        ips = ips " " $1
    }
    END {
        while ((("fping" ips) | getline) != 0) {
            if ($3 == "alive") 
                print name[$1] " OK"
            else if ($3 == "unreachable") 
                print name[$1] " down"
        } 
    }
' hosts.txt

或完全使用 bash 版本 4

declare -a ips
declare -A names

while read ip name; do
    ips+=($ip)
    names[$ip]=$name
done < hosts.txt

fping "${ips[@]}" |
while read ip _ status; do
    case $status in
        alive) echo ${names[$ip]} OK ;;
        unreachable) echo ${names[$ip]} down ;;
    esac
done
于 2013-06-18T17:16:12.413 回答
1

GNU sed

sed -r 's#(\S+)\s+(\S+)#/\1/s/(\\S+)\\s+(\\S+)/\2 \\2/#' hosts.txt|sed -rf - output.txt

..输出:

服务器A OK
服务器B宕机
服务器C OK
于 2013-06-18T18:11:22.010 回答
0

听起来您只需要:

while read ip name
do
    fping "$ip" |
    awk -v n="$name" '{print n, (/alive/?"OK":"down")}'
done < hosts.txt
于 2013-06-18T17:53:08.790 回答