Curl 和 Grep 解析内容

Curl 和 Grep 解析内容

我需要解析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.identityconfig.pkm.inner_identity和名称的数据。config.pkm.password

另请注意,最终的正则表达式捕获组参考是\2- 现在是第二组。

相关内容