cfy*_*e14 9 command-line bash scripts curl
我希望将curl数据输入到 shell 脚本变量中,然后使用cat或awk操作该变量,就好像它是一个文件一样。
这是可能的,还是有解决方法?我必须将curl命令保存到文件中吗?
curl对于我想要执行的每一位字符串格式,我是否必须运行几次?
我在curlipinfo.io 中,想输出“city”和“region”的匹配行。我知道如何根据需要使用awk和sed格式化输出。
例如,尝试获取curl ipinfo.io/"8.8.8.8"Google DNS IP 地址的结果。
我想只打印“Mountain View”和“California”,最好在同一行,使用一些通用格式,例如“Mountain View, California”。
kos*_*kos 12
一般来说,解析 JSON 对象有更合适的方法,但由于在这种情况下 JSON 对象非常简单,您可以将curl的输出存储在一个变量中(这是可能的)并只使用 AWK:
var="$(curl ipinfo.io/"8.8.8.8" 2>/dev/null)"
<<<"$var" awk -F'"' '$2=="city"{printf("%s, ", $4)}$2=="region"{print $4}'
Run Code Online (Sandbox Code Playgroud)
% var="$(curl ipinfo.io/"8.8.8.8" 2>/dev/null)"
% <<<"$var" awk -F'"' '$2=="city"{printf("%s, ", $4)}$2=="region"{print $4}'
Mountain View, California
Run Code Online (Sandbox Code Playgroud)
但是,除非您想curl多次使用的输出,否则您可以只使用管道:
curl ipinfo.io/"8.8.8.8" 2>/dev/null | awk -F'"' '$2=="city"{printf("%s, ", $4)}$2=="region"{print $4}'
Run Code Online (Sandbox Code Playgroud)
curl ipinfo.io/"8.8.8.8" 2>/dev/null | awk -F'"' '$2=="city"{printf("%s, ", $4)}$2=="region"{print $4}'
Mountain View, California
Run Code Online (Sandbox Code Playgroud)
<<<是一种称为“here string”的输入重定向形式;它将命令的 STDIN 从终端重定向到字符串。
这里发生的是$var在双引号之间展开的;AWK 命令的 STDIN 从终端重定向到扩展的字符串,因此 AWK 读取字符串作为其输入文件。
我希望将数据卷曲到 shell 脚本变量中,然后使用 cat 或 awk 对该变量进行操作,就好像它是一个文件一样。这是可能的,还是有解决方法?
你当然可以。如果内容不是太大,并且想要运行多个命令来解析内容,那么最好将其缓存在内存中,而不是每次都重新下载。
要将结果存储curl在变量中:
ipinfo=$(curl ipinfo.io/8.8.8.8)
Run Code Online (Sandbox Code Playgroud)
要在其上运行命令:
<<< "$ipinfo" awk ...
<<< "$ipinfo" sed ...
Run Code Online (Sandbox Code Playgroud)
双引号 no `"$ipinfo" 对于保留所有空白字符很重要。
不将内容保存在变量中的“解决方法”是找出一种在单个管道中处理内容的方法,就像@kos所做的那样。
| 归档时间: |
|
| 查看次数: |
82997 次 |
| 最近记录: |