我有一個類似的字串(來自 curl 命令的主體):服務器回傳一個 xml
Package installed in 116ms.
</log>
</data>
<status code="200">ok</status>
有時這種強可能會變成或其他一些錯誤:
<status code="500">java.lang.IllegalStateException: Archive not valid.</status>
我想知道 grep 狀態代碼 200 的最佳方法是什么,如果不是 200。給出一個錯誤,如“狀態代碼為 500 錯誤:java.lang.IllegalStateException:存檔無效
到目前為止,我有一些改進:
sed -n "s|<status code="200">(.*)|\1|p" test.log
但是如何使用 sed 獲取狀態碼
uj5u.com熱心網友回復:
要獲取codenode 的屬性status,只需:
xmllint --xpath 'string(//status/@code)' -
uj5u.com熱心網友回復:
假設:
- (通過任何方式)
<status>...</status>字串已從curl輸出中提取 <string>字串的格式與 OP 的示例中一樣(例如,字串和字串之間沒有嵌入的換行符</string>;資料中沒有雙引號、左/右胡蘿卜;沒有比下面使用的更復雜的正則運算式模式)
一個想法是將字串與正則運算式進行比較,如果匹配,則從BASH_REMATCH[]陣列中獲取所需的資訊,例如:
regex='<status code="([^"] )">([^<] )<'
for string in '<status code="200">ok</status>' '<status code="500">java.lang.IllegalStateException: Archive not valid.</status>' 'ignore this string'
do
unset error_no error_msg
printf "\n######## %s\n\n" "${string}"
if [[ "${string}" =~ $regex ]]
then
error_no="${BASH_REMATCH[1]}"
error_msg="${BASH_REMATCH[2]}"
fi
typeset -p BASH_REMATCH
printf "\nerror_no : ${error_no}\n"
printf "error_msg : ${error_msg}\n"
done
這會產生:
######## <status code="200">ok</status>
declare -ar BASH_REMATCH=([0]="<status code=\"200\">ok<" [1]="200" [2]="ok")
error_no : 200
error_msg : ok
######## <status code="500">java.lang.IllegalStateException: Archive not valid.</status>
declare -ar BASH_REMATCH=([0]="<status code=\"500\">java.lang.IllegalStateException: Archive not valid.<" [1]="500" [2]="java.lang.IllegalStateException: Archive not valid.")
error_no : 500
error_msg : java.lang.IllegalStateException: Archive not valid.
######## ignore this string
declare -ar BASH_REMATCH=()
error_no :
error_msg :
筆記:
- 該
regex變數可能會擴展以處理其他格式,但在某些時候您開始重新發明 XML 決議器
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/432622.html
