bash - Redis:当通过 awk 传递 llen 结果时,谁在吃我的字段?

标签 bash shell awk redis pipe

Redis: 2.0.4, 2.4.1, ...

我将编写一个 Nagios 插件来检查列表的长度。这是我的脚本:

#!/bin/sh

help()
{
    echo "Usage: $0 <host> <port> <key> -w <warning> -c <critical>"
}

case "$1" in
    --help)
        help 
        exit
        ;;
esac

if [ $# -eq 0 ]; then
    help
    exit 3
fi
if [ $# -ne "7" ]; then
    help
    exit 4
fi
if [ $4 !="-w" -o $6 !="-c" ]; then
    help
    exit 5
fi

REDIS_CLI="/usr/local/redis/bin/redis-cli"
LLEN=`$REDIS_CLI -h $1 -p $2 llen $3 | awk '{ print $2 }'`
if [ $LLEN -lt $5 ]; then
    echo "$3.llen:$2 OK - $LLEN | $3.llen:$2=$LLEN;$5;$7"
    exit 0
elif [ $LLEN -ge $5 -a $LLEN -lt $7 ]; then
    echo "$3.llen:$2 WARNING - $LLEN | $3.llen:$2=$LLEN;$5;$7"
    exit 1
elif [ $LLEN -ge "$7" ]; then   
    echo "$3.llen:$2 CRITICAL - $LLEN | $3.llen:$2=$LLEN;$5;$7"
    exit 2
fi

但是我在运行/usr/lib64/nagios/plugins/redis_llen.sh 192.168.5.201 2468 -w 90000 -c 100000时出现了以下错误:

/usr/lib64/nagios/plugins/redis_llen.sh: line 31: [: -lt: unary operator expected
/usr/lib64/nagios/plugins/redis_llen.sh: line 34: [: too many arguments
/usr/lib64/nagios/plugins/redis_llen.sh: line 37: [: -ge: unary operator expected

在 Debug模式下运行它,我发现 LLEN 的值是……空白。由于 llen queue_1 返回正确的结果:

# /usr/local/redis/bin/redis-cli -h 192.168.5.201 -p 2468 llen queue_1
(integer) 965

为什么管道会吞噬我的田地? (不仅是 awk,还有 echotee、...):

# /usr/local/redis/bin/redis-cli -h 192.168.5.201 -p 2468 llen queue_1 | \
awk '{ print $0 }'
961

我可以检查字段数并打印相应的解决方法:

| awk '{ if (NF == 2) print $2; else print $1 }'`

但我真的很想知道为什么会这样? (interger) 和数字之间是否有空字符或特殊字符?

PS:似乎其他一些 Redis 版本(例如:1.3.7)没有遇到这个问题。

最佳答案

您遇到的是 redis-cli 根据 STDOUT 是什么选择不同的输出。如果 STDOUT 是 TTY,redis-cli 将使用它的“标准”格式输出。否则,“原始”格式是默认格式:

--raw            Use raw formatting for replies (default when STDOUT is not a tty)

正如您从帮助或上面看到的那样,您可以指定 --raw 以始终输出“原始”格式(没有类型限定符等)。我为此挖掘了源代码,发现还有一个 CSV 模式,使用 redis-cli --csv

编辑:要强制“标准”输出,即使 STDOUT 不是 TTY,您也可以设置环境变量 FAKETTY:

FAKETTY=1 redis-cli llen some_list | awk '{ print $2 }'

或者

redis-cli --raw llen some_list | awk '{ print $1 }'

关于bash - Redis:当通过 awk 传递 llen 结果时,谁在吃我的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11098776/

相关文章:

awk - 附加文本 block 的副本

python - 删除重复项但保留序列的第一个和最后一个记录

c++ - 如何通过 bash shell cin a c++ 字符串 >= 1024 个字符?

linux - 如何在后台运行 eval spawn ssh 和 expect?

java - 从 java 调用 shell 脚本挂起

bash - 意外标记附近的语法错误 `echo'

python - 如何在 python 中运行 bash 脚本并使用该脚本中定义的变量

bash - 根据客户端请求发送响应

shell - 搜索多个字符串

regex - 如何根据时间间隔获取这些错误/不匹配字符串