如何在shell中将一行拆分为数组

时间:2014-06-03 12:28:48

标签: shell

以下脚本用于在网络中删除ping时删除邮件

subject="Ping failed"
Email="test1@server.abc.com"
awk '{print $1}' < b.txt | while read ip;do
    CNT=$(ping -c 1 $ip  | grep 'received' | awk -F',' '{ print $2 }' | awk '{ print $1 }')
    if [ $CNT -eq 0 ]; then
        echo "Host : $ip is down (ping failed) at $(date)"|  mail -s "$subject" $Email
    fi
done

这个脚本运行正常。输入文件具有以下内容..

192.2.165.1 ttcn
192.3.4.23 dct
192.3.4.24 abc

我想将此文件的行拆分为0和1索引形式,如数组和邮件格式应为

Host : $ip ttcn is down (ping failed) at $(date)"

任何人都可以帮我搞定吗?

3 个答案:

答案 0 :(得分:1)

read提供多个参数,每列将被读入相应的变量:

while read ip name;do
    CNT=$(ping -c 1 $ip  | awk -F',' '/received/ { split($2, a, " "); print a[1]}')
    if [ $CNT -eq 0 ]; then
        echo "Host : $ip $name is down (ping failed) at $(date)"|  mail -s "$subject" $Email
    fi
done < b.txt

答案 1 :(得分:1)

要将一行读入数组,请使用read -a arr,然后使用${arr[0]}${arr[1]}等访问这些元素。

此外,您无需解析ping的输出以检查主机是否响应。只需使用退出状态。

以下是修订版:

while read -r -a arr
do
    ip="${arr[0]}"
    if ! ping -q -c 1 "$ip" > /dev/null
    then
        mail -s "$subject" "$email" <<< "Host $ip is down (ping failed) at $(date)"
    fi
done < b.txt

答案 2 :(得分:0)

您可以使用awk

 echo "192.2.165.1 ttcn" | awk ' { split($0,a,"");ip=a[1]; print $ip}'