Bash单行代码输出唯一值

时间:2017-08-10 12:18:11

标签: bash awk grep

我有这个命令输出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_RunningNo,则输出1.

     

如果仅Slave_SQL_RunningNo,则输出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

3 个答案:

答案 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_RunningNo匹配,我们将添加1.如果我们将Slave_SQL_RunningNo匹配我们将添加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 }
'

不需要grepcutsed,这会直接获取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