我有这个命令输出0,1或2.
这行代码是配置文件(zabbix)的一部分,只是单行代码的原因。
mysql -u root -e "show slave status\G" | \
grep -E 'Slave_IO_Running:|Slave_SQL_Running:' | cut -f2 -d':' | \
sed "s/No/0/;s/Yes/1/" | awk '{ SUM += $1} END { print SUM }'
但是我希望它输出值是这样的,所以我可以设置正确状态的警报:
如果仅
Slave_IO_Running
为No
,则输出1.如果仅
Slave_SQL_Running
为No
,则输出2.如果两者都是
Yes
,则输出3.如果两者都是
No
,则输出0。
所以类似于使用sed或awk修改No
的第一个条目并使用唯一值。第二个条目具有独特的价值等等。
显示从站状态\ G
的输出mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.10.10.10
Master_User: replicationslave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.009081
Read_Master_Log_Pos: 856648307
Relay_Log_File: mysqld-relay-bin.002513
Relay_Log_Pos: 1431694
Relay_Master_Log_File: mysql-bin.009081
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
答案 0 :(得分:2)
您可以在awk
:
mysql -u root -e "show slave status\G" | awk 'BEGIN {output=0} /Slave_IO_Running.*No/ {output+=1} /Slave_SQL_Running.*No/ {output +=2} END {if(output==3}{print 0} else {if(output==0} {print 3} else {print output}}'
这将在0
处启动输出计数器,如果我们将Slave_IO_Running
与No
匹配,我们将添加1.如果我们将Slave_SQL_Running
与No
匹配我们将添加2,然后最后我们将打印总数,如果两者都不匹配则为0,如果只有IO则为1,如果只有SQL则为2,如果两者为否,则为2,因为你想要打印0
如果两者都是,我们在最后反转我们的计数,如果我们得到3然后两者都是“否”所以打印0,否则如果它是0打印3,否则打印自己的值。
答案 1 :(得分:2)
如果您有这样的冲动,可以将以下awk代码压缩成一行:
awk -F: -v ret=0 '
/Slave_IO_Running:.*No/ { ret=1 }
/Slave_IO_Running:.*Yes/ { yes++ }
/Slave_SQL_Running:.*No/ { ret=(ret==1) ? 0 : 2 }
/Slave_SQL_Running:.*Yes/ { yes++ }
END { print (yes==2) ? 3 : ret }
'
不需要grep
或cut
或sed
,这会直接获取mysql命令的输出。它还假设Slave_IO_Running
将始终出现在命令输出中的Slave_SQL_Running
之前。
第三行和最后一行中的符号用作内嵌"如果"声明 - 如果ret
的值等于1
,请将ret
设置为0
;否则将ret
设置为2
。
答案 2 :(得分:2)
每当你在数据中有值对的名称时,通常最清楚,最简单和最容易增强,以便先创建一个数组,将名称映射到值,然后按名称访问这些值,例如:
awk '
{ f[$1]=$2 }
END {
if (f["Slave_10_Running:"] == "Yes")
rslt = (f["Slave_SQL_Running:"] == "Yes" ? 3 : 2)
else
rslt = (f["Slave_SQL_Running:"] == "Yes" ? 1 : 0)
print rslt
}
' file
1