如何从单行grep

时间:2017-01-31 16:40:16

标签: bash api grep

我使用的是一个可以在一行中输出所有数据的天气API。如何使用grep获取" summary"的值?和" apparentTemperature"?我对正则表达式的命令基本上不存在,但我已经准备好学习了。

cmd=yourcomand;
n=0; for a in "$@"; do n=$((n +1)); cmd="$cmd \${$n+\"\$$n\"}"; done
eval $cmd

谢谢!

4 个答案:

答案 0 :(得分:2)

  

如何使用grep获取" summary"的值?和" apparentTemperature"?

您使用grep&#39} -o标记,这样只会输出匹配的部分。

由于您对正则表达式了解不多,我建议您学习使用JSON解析器,这更适合此任务。

例如,对于jq,以下命令将提取当前摘要:

<whatever is your JSON source> | jq '.currently.summary'

答案 1 :(得分:1)

假设您的单行数据包含在名为ConfigurationManager.AppSettings["ApiBaseEndpoint"].ToString() 的变量中。

如果您确定该字段仅在整行中出现一次,您可以在Bash中执行以下操作:

DATA_LINE

除非您构建一个假设字段按特定顺序排列的更复杂的匹配表达式,否则您必须为每个字段执行一次此操作。

作为注释,匹配表达式if [[ "$DATA_LINE" =~ \"summary\":\"([^\"]*)\" ]] then summary="${BASH_REMATCH[1]}" echo "Summary field is : $summary" else echo "Summary field not found" fi 在包含以下内容的子字符串的数据中找到第一个匹配项:

  • “summary”:“(包括双引号),后跟
  • ([^ \“] *)由双引号以外的零个或多个字符序列组成的子表达式:这是在括号中使其稍后可用作BASH_REMATCH数组中的元素,因为这是要提取的值
  • 最后是最终报价;这不是绝对必要的,但可以防止从截断的数据线读取。

对于\"summary\":\"([^\"]*)\",代码会有所不同,因为该字段的格式不同。

apparentTemperature

答案 2 :(得分:0)

如果你的技能有限,这很容易理解 - 比如我的!假设您的字符串位于名为$LINE的变量中:

summary=$(sed -e 's/.*summary":"//'  -e 's/".*//' <<< $LINE)

然后检查:

echo $summary
Clear

执行(-e)2 sed个命令。第一个替换为summary":"的所有内容,没有任何内容,第二个替换第一个剩余的双引号和随后的所有内容。

提取表观温度:

appTemp=$(sed -e 's/.*apparentTemperature"://'  -e 's/,.*//' <<< $LINE)

然后检查:

echo $appTemp
-3.34

答案 3 :(得分:0)

正如亚伦(Aaron)所言,像jq这样的json解析器是解决此问题的正确工具,但是由于问题是关于grep的,所以让我们来看看一种解决方法。

假设您的API返回值位于$json中:

json='{"latitude":59.433335,"longitude":24.750486,"timezone":"Europe/Tallinn","offset":2,"currently":{"time":1485880052,"summary":"Clear","icon":"clear-night","precipIntensity":0,"precipProbability":0,"temperature":0.76,"apparentTemperature":-3.34,"dewPoint":-0.13,"humidity":0.94,"windSpeed":3.99,"windBearing":262,"visibility":9.99,"cloudCover":0.11,"pressure":1017.72,"ozone":282.98}}'

您在括号中看到的模式为上下文匹配的回顾式和超前式断言。它们可以与-P Perl regex选项一起使用,并且不会在输出中捕获。

summary=$(<<< "$json" grep -oP '(?<="summary":").*?(?=",)')
apparentTemperature=$(<<< "$json" grep -oP '(?<="apparentTemperature":).*?(?=,)')