使用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

覚える気がないので、毎回ググってます。

广告
将在 10 秒后关闭
bannerAds