我有一個用管道“|”分隔的資料 我想用 awk 決議它并將其寫入資料庫。
EndpointRequest|ID-ip-172-31-70-119-eu-west-1-compute-internal-209879772|2022-05-12 08:20:03:467|0|ip-172-31-70-119|616e50193233020648|vfgh|GenericAmount|61d458303574b21f|Display|v1|Display-v1|PrepaidEndpoint|6227300ec1786d26|Corporate|62273041c8cf901071786d81|Health Line||||69.28.67.153|Java/1.8.0_321|application/xml|468|475|POST||http://127.0.0.1/endpoint/||200||2022-05-12 08:20:03:458|0|468|7|0|0|0|true|Http|null|null|HTTPConnector:CallPrepaid|Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2\nAuthorization: Bearer e3edbb1d8f5d8c828dc584ed293602bf\nContent-Type: application/xml\nX-Amzn-Trace-Id: Root=1-627cc333-7167\nX-Forwarded-For: XX.XX.XX.XX\nX-Forwarded-Port: 443\nX-Forwarded-Proto: https\n\n<?xml version="1.0"?>\n<!DOCTYPE cp_request SYSTEM "cp_req_websvr.dtd">\n<cp_request>\n <cp_id>YY1880</cp_id>\n <cp_transaction_id>SDP</cp_transaction_id>\n <op_transaction_id>arr684754251</op_transaction_id>\n <application>1</application>\n <action>2</action>\n <user_id type="MSISDN">9999999999</user_id>\n <cp_timer>5</cp_timer>\n <transaction_price>1900</transaction_price>\n <transaction_currency>0</transaction_currency>\n</cp_request>
資料有很多行,如上面的行,我使用下面的命令來獲取某些欄位。
more file.log | egrep "EndpointRequest|EndpointSuccess|EndpointFailure" | egrep "PrepaidEndpoint" | awk -F"|" '{print $1"|"$2"|"$3"|"$4"|"$5"|"$12"|"$13"|"$15"|"$17"|"$21"|"$25"|"$30"|"$31"|"$32"|"$33"|"$44}'
這里的問題是,在最后一個欄位 (#44) 上,有一個 HTTP 回應,其中包含一些標頭和一個 XML 有效負載。我需要獲取“op_transaction_id”值(“arr684754251”)并將其添加到 awk 命令的末尾,但我無法這樣做。在單獨的命令中,我可以通過“sed”獲取該值,
sed -n "s/.*<op_transaction_id>\(.*\)<\/op_transaction_id>.*/\1/p" file.log
如何將“sed”命令遷移到“awk”命令中,以便將“op_transaction_id”值作為“awk”中的欄位之一。
預期輸出:
EndpointRequest|ID-ip-172-31-70-119-eu-west-1-compute-internal-209879772|2022-05-12 08:20:03:467|0|ip-172-31-70-119|Display-v1|PrepaidEndpoint|Corporate|Health Line|69.28.67.153|475|200||2022-05-12 08:20:03:458|0|arr684754251
謝謝bash大師。任何幫助表示贊賞。
uj5u.com熱心網友回復:
如何將“sed”命令遷移到“awk”命令中
您可以利用gensubfunction,考慮以下簡單示例,讓file.txt-sheared|與 3 列:
<tag>text1</tag>|A|1
<tag>text2</tag>|B|2
<tag>text3</tag>|C|3
并說您想從第一個欄位中獲取標簽內的內容并使用,然后您可能會這樣做
awk 'BEGIN{FS="|";OFS=","}{$1=gensub(/<tag>(. )<\/tag>/,"\\1",1,$1);print}' file.txt
給出輸出
text1,A,1
text2,B,2
text3,C,3
引數gensub是正則運算式、替換、方式(要替換或"g"全部替換的數字)和目標。gensub確實回傳更改后的字串,然后我們將其分配為第一個欄位的新值。FS通知欄位分隔符是|并且OFS輸出欄位分隔符是,。請注意,您不能盲目地將您的正則運算式從復制sed到成為gensub. 例如(,and)在 GNU 中sed用于表示文字括號,需要轉義以獲得捕獲組,在 GNU 中AWK (表示)捕獲組,必須轉義才能獲得文字括號。
(在 gawk 4.2.1 中測驗)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/474229.html
