使用redis-cli将Hash数据输出为csv文件
总结
我想要列出 Redis 的 Hash。如果不考虑其他方法,需要先执行 keys 命令,然后逐个执行 hgetall 或 hmget。
出现的贝壳
#!/bin/sh
export REDIS_CLI_PATH=src/redis-cli
export HASH_NAME=$1
export FIELD_NAMES=${@:2:($#-1)}
if [ -z "${HASH_NAME}" ]; then
echo "Usage: redisHashToCsv.sh [HASH_NAME] ([FIELD_NAMES])"
echo "ex1) redisHashToCsv.sh people"
echo "ex2) redisHashToCsv.sh people name address"
exit 1
fi
if [ -z "${FIELD_NAMES}" ]; then
# Print all keys
${REDIS_CLI_PATH} keys "${HASH_NAME}:*" | cut -f 2 | head -1 | awk '{system("${REDIS_CLI_PATH} --csv hkeys " $0)}'
${REDIS_CLI_PATH} keys "${HASH_NAME}:*" | cut -f 2 | awk '{system("${REDIS_CLI_PATH} --csv hvals " $0)}'
else
# Print keys specified by args
echo ${FIELD_NAMES} | tr " " ","
${REDIS_CLI_PATH} keys "${HASH_NAME}:*" | cut -f 2 | awk '{system("${REDIS_CLI_PATH} --csv hmget " $0 " ${FIELD_NAMES}")}'
fi
由于xargs无法正确处理换行符,我使用awk粗暴地解决了这个问题。
示例1:只指定哈希键(不推荐)
[ec2-user@ip-172-30-2-184 redis-5.0.8]$ ./redisHashToCsv.sh people
"_class","name","age","address"
"redisreposample.Person","hoge","20",""
"redisreposample.Person","moge","35","2-2-2"
"redisreposample.Person","toge","3-3-3"
[ec2-user@ip-172-30-2-184 redis-5.0.8]$
因为第三行的age字段为nil,所以会显示堵塞。
另外,希望hkeys和hvals的键的顺序始终保持一致。
选项一:
建议指定哈希键+字段列表的示例2
[ec2-user@ip-172-30-2-184 redis-5.0.8]$ ./redisHashToCsv.sh people name age address
name,age,address
"hoge","20",""
"moge","35","2-2-2"
"toge",NIL,"3-3-3"
[ec2-user@ip-172-30-2-184 redis-5.0.8]$
如果使用这种模式,nil将显示为”NIL”,没有偏移,感觉很好。
确认操作环境
[ec2-user@ip-172-30-2-184 redis-5.0.8]$ uname -a
Linux ip-172-30-2-184.ap-northeast-1.compute.internal 4.14.177-139.254.amzn2.x86_64 #1 SMP Thu May 7 18:48:23 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
[ec2-user@ip-172-30-2-184 redis-5.0.8]$ src/redis-cli -v
redis-cli 5.0.8
[ec2-user@ip-172-30-2-184 redis-5.0.8]$
参考是通过查阅资料或借鉴他人观点等方式获取信息或灵感的行为。
redis-cliの使い方 – Qiita
この記事で–csvオプションを知りました。この記事で得たアイデアのおかげで、本記事が出来ました。感謝いたします。
シェルスクリプトで、ある順番以降の引数を取得する – Qiita
第2引数以降をまとめて処理するやり方。
シェルスクリプトで変数が空文字であるか調べる | ex1-lab
覚える気がないので、毎回ググってます。