sed或者awk命名模式匹配

背景
需要從一個文件中逐行的數據中提取出符合要求的子串,比如提取其中tagA*****tagB之間的字符

基於sed方式的子串提取
cat  my.log | sed 's/\(.*\)tagA\(.*\)tagB\(.*\)/\2/g'
1
可以搭配grep先進行一次行過濾,在之後,再進行一次的子串提取:
s: 表示替換命令
(.*)tagA : 表示tagA前的內容
tagA(.*)tagB:表示tagA和tagB之間的內容
tagB(.*):表示tagB後的內容
\2: 表示第二對括號裏面的內容
括號裏的表達式匹配的內容,可以用\1,\2等進行引用,第n個括號對內的內容,就用\n引用。
這個命令的意思是:
用\2代表的第二個括號的內容(即tagA好tagB之間的內容)去替換整個字符串,這樣就得到了我們所需要的子字符串了。

grep 'id=myid'  my.log | sed 's/\(.*\)tagA\(.*\)tagB\(.*\)/\2/g'
1
方案2:
採用awk和match的方案:通過match匹配出tagA的位置和tagB的位置,分別即爲start1和start2,再通過substr進行字符串的截取,從而實現預期子串的提取。代碼如下:

cat  my.log | awk '{start1=match($0,/GET/);start2=match($0,/HTTP/);print start1,start2;print substr($0,start1+4,start2-start1-4)}'
1
其中start1中+4表示將tagA這4個字符跳過。當然,前期使用grep進行一次過濾,再使用awk和match進行二次處理可以達到各種預期的目的。
PS:歡迎留言,提供更多便捷方案。
————————————————
版權聲明:本文爲CSDN博主「JasonLiu1919」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/ljp1919/article/details/53337670

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章