Text-Processing

Curl 和 Grep 解析內容

  • March 31, 2016

我需要解析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="00259E951451@company.net" maxlength="64" />
<input type="text" id="config.pkm.inner_identity" name="config.pkm.inner_identity" value="test@company.net" maxlength="64" />
<input type="password" id="config.pkm.password" name="config.pkm.password" value="382738" maxlength="64" />

我想搜尋name="config.pkm.identity"並列印00259E951451@company.net、搜尋並name="config.pkm.inner_identity"列印test@company.net、搜尋name="config.pkm.password"並列印382738

Grep 只輸出00259E951451@company.net,test@company.net382738.

您確實應該為此使用 HTML 解析器,但是(脆弱的)Awk 解決方案是:

awk -F'"' '/pkm.identity/ {id = $8}; /inner_/ {inner = $8}; /password/ {pass = $8} END {print id" "inner" "pass}' file
00259E951451@company.net test@company.net 382738

要以查詢方式獲取資訊,您應該使用grep. 因此,嘗試使用(或)命令過濾掉curl輸出:sed``awk

sed -n 's/.*name="config.pkm.identity" value="\(.[^"]*\)".*$/\1/p'

其中欄位的值在\1(正則表達式擷取組 #1)中擷取。這將輸出name欄位的值為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_identityconfig.pkm.password名稱的數據。

另請注意,最終的正則表達式擷取組參考是\2- 現在是第二組。

引用自:https://unix.stackexchange.com/questions/273054