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 開頭...