我想使用 curl 将给定行号后的文件内容发送到 Slack。我希望它在一些消息后被格式化为代码。 ChatGPT 在这里无法提供帮助。我使用的代码是:
log_text=$(awk -v n="$some_number" 'NR >= n' "$log_file" )
# Handle line breaks and special characters:
#log_text=$(printf '%s' "$log_text" | jq -Rs .) # Doesn't work
#log_text=$(printf '%s' "$log_text" | sed 's/"/\\"/g; s/$/\\n/' | tr -d '\n') # Also doesn't work
log_text=$(echo "$log_text" | jq -R -s -c) # Doesn't work as well
echo "============================"
echo "$log_text"
echo "============================"
curl -s -f --retry 2 -X POST -H 'Content-type: application/json' --data "{\"text\": \" some text here \`\`\`$log_text\`\`\` \"}" \
"$slack_hook" || echo "Failed to send message"
这样总是发送消息失败。如果我设置
log_text=""
那么它就可以正常工作,所以我假设 log_text
中的内容格式存在一些问题。该文件有几个特殊字符换行符等,但我想在 json 上整齐地发送它,以便可以在 Slack 上读取它。这是怎么回事?
我建议避免在 curl 命令中使用模板生成器,而是使用单个参数。
代替:
curl -s -f --retry 2 -X POST -H 'Content-type: application/json' --data "{\"text\": \" some text here \`\`\`$log_text\`\`\` \"}"
你可以这样做:
curl -s -f --retry 2 -X POST -H 'Content-type: application/json' --data "$log_text_2"
在这种情况下,您可以打印
$log_text_2
以获得对问题所在的一些见解。我认为可能有一些转义字符导致了这个问题。
什么最终起作用了(不知道为什么):
首先复制斜杠,然后将所有换行符替换为' ':
log_text="$(printf '%s' "$log_text" | sed 's/\\/\\\\/g' | sed ':a;N;$!ba;s/\n/\\n/g' )"
然后使用一个变量来创建整个payload,这样更容易调试:
json_string="{\"text\": \" some text \\n \`\`\`$log_text\`\`\` \"}"
最后发消息:
curl -s -f --retry 2 -X POST -H 'Content-type: application/json' --data "$json_string"
ChatGPT 永远不会为您做的是编写带有解释的工作代码,以便您学到一些东西
cat sendlog.sh
:
#!/usr/bin/env sh
SLACK_API=https://example.com/
start_line=${1:-0}
start_line=${start_line##[^[:digit:]]}
{
# Print markdown start code block with no syntax highlight
printf '```none\n'
# Insert content of input file starting at line
tail "-n+${start_line}"
# Print markdown end code block
printf '```\n'
} |
# Get all of it piped to jq and handled as Raw text
# and inserted in a JSON object
jq -sR '{"file":.}' |
# Send the piped-in JSON data
curl -s -f --retry 2 \
-X POST -H 'Content-type: application/json' \
--data-binary @- "$SLACK_API"
从第42行开始发送
somefile.log
内容的例子:
bash sendlog.sh 42 < somefile.log