获取迭代的最后一行 - 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 循环之外。
我创建了一个简单的脚本,运行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 循环之外。