我需要解析curl
命令的输出:
curl --user test:test http://192.168.1.1/security/pkm.html | egrep '@company|config.pkm.password'
这将返回:
<input type="text" id="config.pkm.dentity" name="config.pkm.identity" value="[email protected]" maxlength="64" />
<input type="text" id="config.pkm.inner_identity" name="config.pkm.inner_identity" value="[email protected]" maxlength="64" />
<input type="password" id="config.pkm.password" name="config.pkm.password" value="382738" maxlength="64" />
我想搜索name="config.pkm.identity"
并打印[email protected]
、搜索name="config.pkm.inner_identity"
并打印[email protected]
、搜索name="config.pkm.password"
并打印382738
Grep 只输出[email protected]
,[email protected]
和382738
。
答案1
您确实应该为此使用 HTML 解析器,但(脆弱的)Awk 解决方案是:
awk -F'"' '/pkm.identity/ {id = $8}; /inner_/ {inner = $8}; /password/ {pass = $8} END {print id" "inner" "pass}' file
[email protected] [email protected] 382738
答案2
要以查询的方式获取信息,您应该使用正则表达式捕获组中不存在哪些grep
。因此,尝试curl
使用sed
(或awk
) 命令过滤掉输出:
sed -n 's/.*name="config.pkm.identity" value="\(.[^"]*\)".*$/\1/p'
其中字段的值价值被捕获在\1
(正则表达式捕获组#1)中。这将输出的值姓名场是config.pkm.identity
.
为了姓名是config.pkm.password
使用:
sed -n 's/.*name="config.pkm.password" value="\(.[^"]*\)".*$/\1/p'
等等。
要显示相应名称的所有可用值,只需使用:
sed -n 's/.*name=".*" value="\(.[^"]*\)".*$/\1</p'
更新供评论
要在 sed 查询中选择匹配值,请使用以下方案:使用带有|
管道符号(表示OR
语句)的附加正则表达式分组。这允许sed
从给定的一组变体中进行选择以匹配最终结果(另请注意转义|
管道符号和(
)
括号)
例如:
sed -n -e 's/.*name="\(config.pkm.identity\|config.pkm.inner_identity\|config.pkm.password\)" value="\(.[^"]*\)".*$/\2/p'
这将搜索并输出流中的config.pkm.identity
、config.pkm.inner_identity
和名称的数据。config.pkm.password
另请注意,最终的正则表达式捕获组参考是\2
- 现在是第二组。