wttr.in可以通过卷曲wttr.in来为你提供天气:
curl wttr.in/Amsterdam
我返回一个大的数据列表,我想将它用作tmux段,所以我把它缩小到第一次提到温度(这是当前的温度):
curl wttr.in/Amsterdam | grep -m 1 °C
有时会返回范围:
_ /"".-. 4 – 7 °C
有时只有一个温度:
_ /"".-. 13 °C
所以前面还有一些垃圾,它有时会返回一个范围而不是一个温度。有没有人知道如何缩小它以便总是返回一个温度(如果有两个值则平均)并且没有前面的文本?
答案 0 :(得分:5)
这样做的主要困难是服务返回终端转义码,这使得处理起来很麻烦。这就是你真正得到的:
$ curl -s wttr.in/Amsterdam | grep -m 1 '°C' | cat -A
^[[38;5;226m _ /""^[[38;5;250m.-. ^[[0m ^[[38;5;048m5^[[0m M-bM-^@M-^S ^[[38;5;046m8^[[0m M-BM-0C^[[0m $
呈现如下:
因此,我们不能从第一个数字中提取所有内容,因为由于转义序列,几乎包括整行。
幸运的是,我们可以告诉wttr.in不要使用T
查询字符串参数向我们发送颜色转义(帽子提示为keheliya以指出这一点):
$ curl -s wttr.in/Amsterdam?T | grep -m 1 '°C' | cat -A
_ /"".-. 5-8 M-BM-0C $
现在我们可以使用grep -o
(仅保留匹配项)从遇到的第一个数字中提取所有内容。这也考虑到负温度可能有负号:
curl -s wttr.in/Amsterdam?T | grep -m 1 '°C' | grep -Eo -e '-?[[:digit:]].*'
或者,在单个grep表达式中:
curl -s wttr.in/Amsterdam?T | grep -m 1 -Eo -e '-?[[:digit:]].*°C.*'
这是
的输出5–8 °C
现在,如果你只想获得一个范围的平均值,你可以写一个这样的函数:
cur_temp () {
# Get current temperature into variable
local cur=$(curl -s wttr.in/Amsterdam?T \
| grep -m 1 -Eo -e '-?[[:digit:]].*°C.*')
# Check if it is a range
if [[ $cur == *-* ]]; then
# Use regex to extract temperature values
local re='(-?[[:digit:]])+.*-.*(-?[[:digit:]]+)'
[[ $cur =~ $re ]]
local lower=${BASH_REMATCH[1]}
local upper=${BASH_REMATCH[2]}
# Calculate average (truncates to integers)
cur="$(( (lower + upper) / 2 )) °C"
fi
echo "$cur"
}
如果我们在先前返回范围的结果上调用此函数,我们现在只获得平均值(截断为整数):
$ cur_temp
6 °C
非范围与以前相同。
这可以针对位置进行参数化,就像您从wttr.in/:bash.function
获得的示例函数一样。
答案 1 :(得分:1)
我可以在我的i3block上用以下简单的行添加Temp,H,P和Wind:
[weather]
full_text=
command=curl wttr.in/-31.82,-60.52\?format\="%t%20|%20%h%20|%20%P%20|%20%w"
interval=1800
这是斯巴达的美女: