获取迭代的最后一行 - UNIX

Get the last line of an iteration - UNIX

我创建了一个简单的脚本,运行s nslookup 用于配置的 IP。它将 运行 10x(根据要求)验证它是否指向活动 IP,然后如果它 returns 不活动则通过电子邮件发送警报。

脚本运行完美,但是,当它发出警报时,由于循环,它会执行 10 倍。如果不满足条件,如何只获取最后一行,以便每个 IP 只发送一封电子邮件?

代码如下:

CDC="456.22." 
PDC="123.11" 
ACTIVE_DC=$CDC 
#ACTIVE_DC=$PDC 



#ADD/REMOVE VIRTUAL IPs HERE
vIP="app1.app.com app2.app.com"
MAIL_FROM=app@app.com
subject="[TEST - - CRITICAL WARNING] NETWORK TRAFFIC POINTING TO INACTIVE DATA CENTER"
DATE=$(date '+%Y-%m-%d %H:%M:%S')

echo ""
echo "########################################################################"
echo "#################################START##################################"

for IP in $vIP; do
    echo""
    app_name=$(nslookup $IP | awk 'NR==4 {print NR,[=10=]}' | cut -c 9-50) #Prints each VIP
    echo "$app_name"
        for i in {1..10}; do #Runs nslookup 10x for each VIP
            current=$(nslookup $IP | awk 'NR==5 {print NR,[=10=]}' | cut -c 12-30)
            current2=$(echo "$current" | cut -c 1-6)
            echo "$current"
            if [[ "$current2" == "$ACTIVE_DC" ]]; then
                echo "Traffic is pointing to active DC"
            else
                echo "ERROR Traffic is pointing to INACTIVE DC"
                echo "$DATE - [TEST] CRITICAL - NETWORK TRAFFIC POINTING TO INACTIVE DATA CENTER
                CHECK $app_name
                TRAFFIC POINTING TO $current
                TRAFFIC SHOULD BE POINTING to $ACTIVE_DC ONLY!
                " | mailx -s "$subject" -r $MAIL_FROM appalert@app.com
            fi
        done
done
 

修改后的脚本:

#!/bin/bash

CDC="456.22." 
PDC="123.11" 
ACTIVE_DC=$CDC 
#ACTIVE_DC=$PDC 

#ADD/REMOVE VIRTUAL IPs HERE
vIP="app1.app.com app2.app.com"
MAIL_FROM=app@app.com
subject="[TEST - - CRITICAL WARNING] NETWORK TRAFFIC POINTING TO INACTIVE DATA CENTER"
DATE=$(date '+%Y-%m-%d %H:%M:%S')

echo ""
echo "########################################################################"
echo "#################################START##################################"

for IP in $vIP; do
    sendemail='false'
    echo ""
    app_name=$(nslookup "$IP" | awk 'NR==4 {print NR,[=10=]}' | cut -c 9-50) #Prints each VIP
    echo "$app_name"
    
    for i in {1..10}; do #Runs nslookup 10x for each VIP
        current=$(nslookup "$IP" | awk 'NR==5 {print NR,[=10=]}' | cut -c 12-30)
        current2=$(echo "$current" | cut -c 1-6)
        echo "$current"
        if [[ "$current2" == "$ACTIVE_DC" ]]; then
            echo "Traffic is pointing to active DC"
        else
            sendemail='true'
            echo "ERROR Traffic is pointing to INACTIVE DC"
            break
        fi
    done
    
    if [[ "$sendemail" == 'true' ]]
    then
        echo "$DATE - [TEST] CRITICAL - NETWORK TRAFFIC POINTING TO INACTIVE DATA CENTER
        CHECK $app_name
        TRAFFIC POINTING TO $current
        TRAFFIC SHOULD BE POINTING to $ACTIVE_DC ONLY!
        " | mailx -s "$subject" -r $MAIL_FROM appalert@app.com
    fi
done

我添加的是:

  • 变量 sendemail 在 IP 地址的每个 for 循环开始时设置为 false。
  • 如果出现错误,则必须发送电子邮件,因此将 sendemail 变量设置为 true 并在 for i ... 循环之外设置 break
  • 如果 sendemail 为真,请发送电子邮件。现在每个 IP 只会发生一次,因为电子邮件发送代码在 nslookup 10X 循环之外。