使用bash脚本从字符串中获取主机名

时间:2013-03-18 19:18:02

标签: bash sed awk

在我的bash脚本中,我需要从命令输出中提取所有主机名以进一步ping:

for host in `echo $MXrecords | awk '{ printf "%s", $0; }'` ; do
    ping -c1 $host 2> /dev/null > /dev/null
    if [ "$?" -eq "0" ] ; then
        answ="OK"
    else
        answ="BAD"
    fi

    echo "\t$host [$answ]" 
done

但我有一些额外的字符串:

40 [BAD]
alt2.aspmx.l.google.com. [OK]
30 [BAD]
alt3.aspmx.l.google.com. [OK]

我通过dig得到了var MXrecords:

MXrecords=`dig @$DNSserver $domainName IN MX +short +multiline | awk '{ printf "\t%s\n", $0; }'`

2 个答案:

答案 0 :(得分:1)

从输出看起来$MXrecords包含MX记录,包括其优先级:

40 alt2.aspmx.l.google.com.
30 alt3.aspmx.l.google.com.

尝试替换它:

`echo $MXrecords | awk '{ printf "%s", $0; }'`

用这个:

$(echo "$MXrecords" | awk '{print $2}')

答案 1 :(得分:0)

请改为尝试:

for host in ${MXrecords##* }; do
    if ping -c1 $host &>/dev/null; then
        answ="OK"
    else
        answ="BAD"
    fi

    echo "\t$host [$answ]" 
done

注意

  • ${MXrecords##* }parameter expansion bash技巧(建筑物)
  • &>/dev/null>/dev/null 2>&1
  • 的bash简写
  • 反引号(`)用于旧式命令替换。建议使用foo=$(command)语法。 $()内的反斜杠处理不那么令人惊讶,$()更容易嵌套。请参阅http://mywiki.wooledge.org/BashFAQ/082
  • 无需测试特殊变量$?,您可以像我在我的代码段中一样使用布尔逻辑