我有一个带有一堆android令牌的.csv
文件。对于所有这些令牌,我想检查它们是否仍然有效。最后,我想要一个带有额外列的.csv
文件,该列称为“有效”,可以是0或1.(如果不是,则为0,如果不是,则为1)。
我想通过以下命令检查每个令牌:
curl --header "Authorization: key=[my API key]" --header Content-Type:"application/json" https://android.googleapis.com/gcm/send -d "{\"registration_ids\":[\"[my token]\"]}"
如果回复是
{
"multicast_id":[
id
],
"success":0,
"failure":1,
"canonical_ids":0,
"results":[
{
"error":"InvalidRegistration"
}
]
}
令牌无效,我希望将“有效”列设置为0。
如何设置一个脚本,分别自动检查.csv
中的每个标记,并使用正确的值更新“有效”列?
答案 0 :(得分:2)
假设您可以使用GNU $2
(即simplify CSV parsing),并且您的令牌存储在第二列中(注意awk
tokens.csv
1 {}}行#!/bin/bash
is_token_invalid() {
args=(
-s
-H 'Authorization: key=[my API key]'
-H 'Content-Type: application/json'
-d '{"registration_ids": ["'"$1"'"]}'
'https://android.googleapis.com/gcm/send'
)
curl "${args[@]}" | grep -q InvalidRegistration
}
awk -v FPAT='[^,]*|"[^"]+"' '{print $2}' tokens.csv |
while read token; do
is_token_invalid "$token" && echo 1 || echo 0
done | paste -d, tokens.csv -
:
/etc/hosts
答案 1 :(得分:1)
如果不了解CSV文件的格式,很难提供解决方案。使用带有4列的模拟CSV文件,你可以做一些非常粗暴的事情:
$ cat test.csv
blah,blah,token1,blah
blah,blah,token2,blah
blah,blah,token3,blah
$ ./test.sh < test.csv
blah,blah,token1,blah,1
blah,blah,token2,blah,1
blah,blah,token3,blah,1
代码:
#!/usr/bin/env bash
set -euo pipefail
invalid_response () {
cat << 'EOF'
{
"multicast_id":[
id
],
"success":0,
"failure":1,
"canonical_ids":0,
"results":[
{
"error":"InvalidRegistration"
}
]
}
EOF
}
is_invalid_token () {
declare token="${1:-}"
[[ "$(curl -sSL \
--header "Authorization: key=[my API key]" \
--header Content-Type:"application/json" \
https://android.googleapis.com/gcm/send \
-d "{\"registration_ids\":[\"$token\"]}")" == "$(invalid_response)" ]]
}
main () {
declare token="" valid=""
while IFS="," read -r col1 col2 token col4 valid ; do
valid=1
if is_invalid_token "$token" ; then
valid=0
fi
printf "$col1,$col2,$token,$col4,$valid\n"
done
}
main "$@"
这不是一个很好的解决方案,因为它完整地重构了每个CSV行,并且它将JSON响应与您的文字字符串示例进行比较。
最好准确地知道响应的哪个部分应该用来表示有效或无效,并使用像jq
这样的工具来解析您要测试的特定数据的响应。