grep 跨行搜尋(匹配)

2021-09-30 01:52:31 字數 1667 閱讀 5350

grep 非常強大,可以在檔案中搜尋任意的字串,通常的場景多是以行為單位進行檢索,但若標識字串與搜尋內容不在一行怎麼辦? 例如下面的乙個kubernetes部署檔案,現在需要從該檔案中取出部署名,也就是

metadata:

name: projecta-web-ms-deployment

中的name值。

kind: deployment

metadata:

name: projecta-web-ms-deployment

namespace: projecta-dev

labels:

spec:

replicas: 1

selector:

matchlabels:

template:

metadata:

labels:

spec:

nodeselector:

disktype: projectkdev

containers:

- name: projecta-web-ms

image: 192.168.1.8/projecta.io/projecta-web:1.5.0-snapshot

imagepullpolicy: always

ports:

- containerport: 8080

volumemounts:

- name: v2

mountpath: /usr/projecta/logs

volumes:

- name: v2

hostpath:

path: /home/docker/data/tomcat/bpm/ms/logs

(1)首先取出帶標識串的部分:

因為有多個name特徵串,不能使用單行搜尋,否則會返回多條資料。

命令: grep -pzo "metadata:\s*\n  name:.*$" deployment.yaml

說明:-p, --perl-regexp,使用perl正規表示式; z,處理多行; o,只輸出匹配部分。因為如果進行多行匹配,就沒有換行作為匹配結束邊界,會返回剩下的全部文字

結果:metadata:

name: projecta-web-ms-deployment

(2)提取識別符號所在行

命令:grep -pzo "metadata:\s*\n  name:.*$" deployment.yaml  | grep name

結果:name: pi6000-bpm-web-ms-deployment

(3)使用sed命令提取值

命令:grep -pzo "metadata:\s*\n  name:.*$" deployment.yaml  | grep name | awk ''

結果:pi6000-bpm-web-ms-deployment

至此,就實現了我們最初的目標,提取出了跨行文字中的特徵值。

(4)綜合使用

若在指令碼裡執行,則需要將上述執行過程獲得的值傳到下面的指令碼繼續執行,這時,只需要定義乙個變數儲存提取值就可以了:

命令:

deploymentname=`grep -pzo "metadata:\s*\n  name:.*$" deployment.yaml | grep name | awk ''`

grep 精確匹配

如果是有程序名為abcd,abcde等有包含 abc 字元的,那麼判斷將會不準備,如果精確的匹配到abc呢,當時不知道,只能很誠實的回答,不清楚 其實答案很簡單,用grep w abc 或者是grep 都可以實現 w,word regexp 強制 pattern 僅完全匹配字詞 如果是有程序名為ab...

grep搜尋指令

序號指令內容1 grep abc text.log 包含 abc 區分大小寫 2grep i abc text.log 包含 abc 不區分大小寫 3grep w abc text.log 精確搜尋 abc 單詞,區分大小寫 4grep wi text.log 精確搜尋 abc 單詞,不區分大小寫 ...

grep 搜尋文字

grep 引數 搜尋內容 檔名grep greptest test.txt常用選項 作用選項 含義 求反 v 顯示不包含 搜尋內容 的所有行 顯示行號 n 顯示匹配行及其行號 忽略大小寫 i 忽略大小寫 統計數目 c 統計匹配的字串數量 常用正規表示式 作用引數 含義 指定行首 a 搜尋以 a 開頭...