Linux

通過替換文件中的值進行循環,然後執行 curl 請求 25 次,將計數增加 1000

  • March 5, 2019

我有一個使用從文件到我的伺服器的有效負載執行 curl 請求的場景。在這裡,我需要將文件中的值替換為 1000 並重複相同的值 25 次。我可以用 ‘sed’ 替換這些值,但我無法循環 25 次。這是我曾經實施的一次。

curl -H "text/xml" --data-binary "@/home/miracle/email/somainput1.xml" https://x.x.x.x:5550 --insecure -u admin:xxxxx >> somaoutput1.xml

我的輸入文件有以下程式碼..

   <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<dp:request domain="HUB" xmlns:dp="http://www.datapower.com/schemas/management">
<dp:b2b-query-metadata>
<dp:query>
<dp:query-condition evaluation="property-equals">
<dp:property-name>ResultCode</dp:property-name>
<dp:value>0</dp:value>
</dp:query-condition>
<dp:query-condition evaluation="logical-and">
<dp:query-condition evaluation="property-greater-than">
<dp:property-name>InputTime</dp:property-name>
<dp:value>2019-02-19 23:00:00</dp:value>
</dp:query-condition>
<dp:query-condition evaluation="property-less-than">
<dp:property-name>InputTime</dp:property-name>
<dp:value>2019-02-20 11:00:00</dp:value>
</dp:query-condition>
</dp:query-condition>
</dp:query>
<dp:result-constraints>
<dp:max-rows>1000</dp:max-rows>
**<dp:start-index>18001</dp:start-index>**
<dp:include-properties>
<dp:property-name>SenderName</dp:property-name>
<dp:property-name>ReceiverName</dp:property-name>
<dp:property-name>ResultCode</dp:property-name>
</dp:include-properties>
</dp:result-constraints>
</dp:b2b-query-metadata>
</dp:request>
</soapenv:Body>
</soapenv:Envelope>

我可以使用 sed 替換它

sed -i '23s/18001/19001/g' b2bsoapinput.xml

我需要循環並發送相同的 curl 請求 25 次。

您可以循環的命令是

sed -n '23s/[^0-9]*\([0-9]*\)[^0-9]*/\1+1000/p' \
b2bsoapinput.xml | bc | xargs -I{} sed -i \
'23s/\([^0-9]*\)[0-9]*\([^0-9]*\)/\1{}\2/g' b2bsoapinput.xml

所以你可以跑

for i in {1..25}; do
   curl -H "text/xml" --data-binary \
   "@/home/miracle/email/b2bsoapinput.xml" \
   https://x.x.x.x:5550 --insecure -u admin:xxxxx \
   >> somaoutput$i.xml || break
   sed -n '23s/[^0-9]*\([0-9]*\)[^0-9]*/\1+1000/p' 
   b2bsoapinput.xml | bc | xargs -I{} \
   sed -i '23s/\([^0-9]*\)[0-9]*\([^0-9]*\)/\1{}\2/g' \
   b2bsoapinput.xml
done

第一個sed匹配第 23 行中唯一的數字並將其替換為number+1000. .../p告訴 sed 列印替換的值並告訴-n它不列印更改的文件。因此,只有替換字元串通過管道傳輸到bc算法中。第二個 sed 用新值替換第 23 行中唯一的數字,並就地更改文件。我使用 xargs 將管道值放入 sed 參數中。-I{}將由管道值替換的字元串設置為{}

**編輯:**我|| break在循環中添加了一個。如果預置命令失敗(返回 0 以外的退出程式碼)並且程序在循環後繼續,這將導致循環“停止”。但是,如果 curl 確實以 0 退出,即使它收到錯誤響應,您也需要break在另一個條件下呼叫。也許像grep "an error text" somaoutput$i.xml && break.

如果您希望您的程序繼續循環的下一次迭代而不是在它之後,您可以使用continue而不是break.

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