2.2 Matching Text with grep
===========================
.
(單一任何字元) & \
(跳脫字元) 的用法:
1 2 3 4 5 # 尋找 rcx.d [vagrant@server etc]$ ls | grep 'rc.\.d' rc0.d rc1.d ....
[]
(中括號,符合其中一個字元) & [^]
的用法:
1 2 3 4 5 6 7 8 9 10 11 12 13 [vagrant@server etc]$ ls | grep 'rc[134]\.d' rc1.d rc3.d rc4.d [vagrant@server etc]$ ls | grep 'rc[1-3]\.d' rc1.d rc2.d rc3.d [vagrant@server etc]$ ls | grep 'rc[^1-5]\.d' rc0.d rc6.d
*
(零個或多個前面的字元) & \+
(一個或多個前面的字元) & \?
(零個或一個前面的字元) 的用法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 [vagrant@server tmp]$ cat file.txt ac abc abbc abbbc abbbbc abbbbbc abbbbbbc [vagrant@server tmp]$ cat file.txt | grep 'ab*c' ac abc abbc abbbc abbbbc abbbbbc abbbbbbc [vagrant@server tmp]$ cat file.txt | grep 'ab\+c' abc abbc abbbc abbbbc abbbbbc abbbbbbc [vagrant@server tmp]$ cat file.txt | grep 'ab\?c' ac abc
\{i\}
(i 個前面的字元) & \{i,\}
(大於等於 i 個前面的字元) & \{i,j\}
(i 到 j 的前面的字元) 的用法:
1 2 3 4 5 6 7 8 9 10 11 12 [vagrant@server tmp]$ cat file.txt | grep 'ab\{3\}c' abbbc [vagrant@server tmp]$ cat file.txt | grep 'ab\{3,\}c' abbbc abbbbc abbbbbc abbbbbbc [vagrant@server tmp]$ cat file.txt | grep 'ab\{3,4\}c' abbbc abbbbc
練習:尋找包含 IP address 的行 1 2 3 4 5 [vagrant@server ~]$ ip addr | grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' inet 127.0.0.1/8 scope host lo inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3 inet 172.25.25.11/24 brd 172.25.25.255 scope global enp0s8
^
(一行的開頭) & $
(一行的結尾)的用法:
1 2 3 4 5 6 7 8 9 10 11 12 [vagrant@server tmp]$ cat passwd | grep 'root' root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin [vagrant@server tmp]$ cat passwd | grep '^root' root:x:0:0:root:/root:/bin/bash [vagrant@server tmp]$ cat passwd | grep 'bash$' root:x:0:0:root:/root:/bin/bash vagrant:x:1000:1000:vagrant:/home/vagrant:/bin/bash
1 2 3 4 5 6 7 [vagrant@server tmp]$ cat ff aaaaa cataaa aaaa aaaaa cat aaaaa aaaaa aaaacat aaaa [vagrant@server tmp]$ cat ff | grep '\<cat\>' aaaaa cat aaaaa
-v
:反向(顯示沒符合的 )
1 2 3 4 5 [vagrant@server tmp]$ grep -v 'root' passwd bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin
-n
:搜尋結果加上行號
1 2 3 4 [vagrant@server tmp]$ grep -n 'nologin' passwd 2:bin:x:1:1:bin:/bin:/sbin/nologin 3:daemon:x:2:2:daemon:/sbin:/sbin/nologin 4:adm:x:3:4:adm:/var/adm:/sbin/nologin
-c
:列出符合條件的數量
1 2 3 [vagrant@server tmp]$ sudo ls -lR /etc | grep -c '^d' 179
-l
:只列出符合條件的檔名
1 2 3 4 5 6 7 8 9 10 11 12 13 [vagrant@server etc]$ grep 'password' /etc/* 2>/dev/null /etc/dnsmasq.conf: /etc/login.defs: /etc/login.defs: .... /etc/login.defs: /etc/services:shell 514/tcp cmd ... [vagrant@server etc]$ grep -l 'password' /etc/* 2>/dev/null /etc/dnsmasq.conf /etc/login.defs /etc/services
-r
:搜尋整個路徑下的檔案
-i
:不區分大小寫
-e
:可同時給多個搜尋條件
sed
sed 's/cat/dog/' file.txt
:將檔案中每一行左邊的第一個 cat 換成 dog
sed 's/cat/dog/gi' file.txt
:同上,但全部一起置換,且不區分大小寫
sed 's/[Cc]at/dog/gi' file.txt
:Cat or cat 都會置換
sed 's/\<[Cc]at\>/dog/gi' file.txt
:只有精準的 Cat or cat 會被置換
sed '1,30s/cat/dog/gi' file.txt
:同 2,但僅處理 1~30 行
sed '/begin/,/end/s/cat/dog/gi' file.txt
:同 2,但僅處理 begin 開頭的行到 end 開頭的行
sed -e 's/cat/dog/g' -e 's/Cat/dog/g' file.txt
:同時給多個條件
set '/^root/d' file.txt
:開頭為 root 的行刪除
set '/^root/!d' file.txt
:開頭為 root 的行不刪除
加上 -i 參數會將實際的改變反應到檔案中(原本預設是不會變更檔案內容)