1.知識點
知識點1:grep 參數
-i | 忽略大小寫。也可用--ignore-case 來指定。 |
-v | 打印不不匹配,這個選項導致 grep 程序只會打印不包含匹配項的文本行。也可用--invert-match 來指定。 |
-c | 打印匹配的數量,也可用 --count 選項來指定。 |
-l | 打印包含匹配項的文件名,而不是匹配項本身,也可用--files-with-matches 選項來指定。 |
-L | 相似於-l 選項,打印匹配項本身,而不加文件名。也可用--files-without-match 來指定。 |
-n | 在每個匹配行之前打印出其位於文件中的相應行號。也可用--line-number 選項來指定。 |
-h | 應用於多文件搜索,不輸出文件名。也可用--no-filename 選項來指定。 |
-E | 可以使用擴展正則表達式 |
對於指令,更重要的是記住有這麼一個功能,知道之後就可以通過查詢手冊進行敲打,熟練了自然會了。
知識點2:^A和[^A]之間的區別?
答:第一個是以A開頭,第二個是非的意思。
知識點3: POSIX 字符集包括哪些?
字符集 | 說明 |
---|---|
[:alnum:] | 字母數字字符。等價於:[A-Za-z0-9] |
[:word:] | 與[:alnum:]相同, 但增加了下劃線字符。 |
[:alpha:] | 字母字符。等價於:[A-Za-z] |
[:blank:] | 包含空格和 tab 字符。 |
[:cntrl:] | ASCII 的控制碼。包含了0到31,和127的 ASCII 字符。 |
[:digit:] | 數字0到9 |
[:graph:] | 可視字符。在 ASCII 中,它包含33到126的字符。 |
[:lower:] | 小寫字母。 |
[:punct:] | 標點符號字符。在 ASCII 中,等價於:[-!"#$%&'()*+,./:;<=>?@[\\\]_`{|}~] |
[:print:] | 可打印的字符。在[:graph:]中的所有字符,再加上空格字符。 |
[:space:] | 空白字符,包括空格、tab、回車、換行、vertical tab 和 form feed.在 ASCII 中, 等價於:[ \t\r\n\v\f] |
[:upper:] | 大寫字母。 |
[:xdigit:] | 用來表示十六進制數字的字符。在 ASCII 中,等價於:[0-9A-Fa-f] |
4.匹配元素個數的符號意義?
? |
匹配零個或一個元素,使前面的元素可有可無。 |
* | 匹配0個或多個元素,即任意多個。 |
+ |
匹配一個或多個元素,即至少一個。 |
{ } |
匹配特定個數的元素,即指定。比如{n},{n,m},{n,},{,m}。 |
2.代碼實操
grep [options] regex [file...]
[me@linuxbox ~]$ grep bzip dirlist*.txt
dirlist-bin.txt:bzip2
dirlist-bin.txt:bzip2recover
注:可以把bzip看成regex所需的參數。
[me@linuxbox ~]$ grep -l bzip dirlist*.txt
dirlist-bin.txt
[me@linuxbox ~]$ grep -L bzip dirlist*.txt
dirlist-sbin.txt
dirlist-usr-bin.txt
dirlist-usr-sbin.txt
[me@linuxbox ~]$ grep -h '.zip' dirlist*.txt
bunzip2
bzip2
bzip2recover
注意:圓點字符會增加一個字符,所以不會匹配到zip,zip是三個字符。
[me@linuxbox ~]$ grep -h '^zip' dirlist*.txt
zip
zipcloak
[me@linuxbox ~]$ grep -h 'zip$' dirlist*.txt
gunzip
gzip
[me@linuxbox ~]$ grep -h '[bg]zip' dirlist*.txt
bzip2
bzip2recover
[me@linuxbox ~]$ grep -h '[^bg]zip' dirlist*.txt
bunzip2
gunzip
注:是zip的前面是非b或g,而不是首字母。
[me@linuxbox ~]$ grep -h '^[A-Z]' dirlist*.txt
MAKEDEV
ControlPanel
GET
[me@linuxbox ~]$ grep -h '^[A-Za-z0-9]' dirlist*.txt
注:第一個匹配以大寫字母爲開頭,第二個在A-Z和a-z之間有and就好理解了。
[me@linuxbox ~]$ grep -h '[-AZ]' dirlist*.txt
注:這個就是匹配包含-或A或Z,-失去了連字符的意義。
[me@linuxbox ~]$ ls /usr/sbin/[[:upper:]]*
/usr/sbin/MAKEFLOPPIES
/usr/sbin/NetworkManagerDispatcher
/usr/sbin/NetworkManager
[me@linuxbox ~]$ echo "AAA" | grep AAA
AAA
[me@linuxbox ~]$ echo "BBB" | grep AAA
[me@linuxbox ~]$ echo "AAA" | grep -E 'AAA|BBB'
AAA
[me@linuxbox ~]$ echo "BBB" | grep -E 'AAA|BBB'
BBB
[me@linuxbox ~]$ echo "CCC" | grep -E 'AAA|BBB'
[me@linuxbox ~]$ grep -Eh '^(bz|gz|zip)' dirlist*.txt
[me@linuxbox ~]$ grep -Eh '^bz|gz|zip' dirlist*.txt
注:第一個以“bz”,或“gz”,或“zip”開頭的文件名。第二個匹配任意以“bz”開頭,或包含“gz”,或包
含“zip”的文件名。
[me@linuxbox ~]$ echo "(555) 123-4567" | grep -E '^\(?[0-9][0-9][0-9]\)? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$'
(555) 123-4567
[me@linuxbox ~]$ echo "555 123-4567" | grep -E '^\(?[0-9][0-9][0-9]\)? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$'
555 123-4567
[me@linuxbox ~]$ echo "AAA 123-4567" | grep -E '^\(?[0-9][0-9][0-9]\)? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$'
注:表達式匹配這個電話號碼的兩種形式,但是不匹配包含非數字字符的號碼。^\(?意義者前面的(可有可無
[me@linuxbox ~]$ echo "This works." | grep -E '[[:upper:]][[:upper:][:lower:] ]*\.'
This works.
[me@linuxbox ~]$ echo "This Works." | grep -E '[[:upper:]][[:upper:][:lower:] ]*\.'
This Works.
[me@linuxbox ~]$ echo "this does not" | grep -E '[[:upper:]][[:upper:][:lower:] ]*\.'
[me@linuxbox ~]$ echo "This that" | grep -E '^([[:alpha:]]+ ?)+$'
This that
[me@linuxbox ~]$ echo "a b c" | grep -E '^([[:alpha:]]+ ?)+$'
a b c
[me@linuxbox ~]$ echo "a b 9" | grep -E '^([[:alpha:]]+ ?)+$'
[me@linuxbox ~]$ echo "abc d" | grep -E '^([[:alpha:]]+ ?)+$'
注:[[:alpha:]]+是至少一個[a-zA-Z],空格?是0個或多個空格。^([[:alpha:]]+ ?)+$整體的意思就是可
以匹配A或A空格。
[me@linuxbox ~]$ echo "(555) 123-4567" | grep -E '^\(?[0-9]{3}\)? [0-9]{3}-[0-9]{4}$'
(555) 123-4567
[me@linuxbox ~]$ echo "555 123-4567" | grep -E '^\(?[0-9]{3}\)? [0-9]{3}-[0-9]{4}$'
555 123-4567
[me@linuxbox ~]$ echo "5555 123-4567" | grep -E '^\(?[0-9]{3}\)? [0-9]{3}-[0-9]{4}$'
案例:電話簿操作
[me@linuxbox ~]$ for i in {1..10}; do echo "(${RANDOM:0:3}) ${RANDOM:0:3}-${RANDOM:0:4}" >> phonelist.txt; done
[me@linuxbox ~]$ cat phonelist.txt
(232) 298-2265
(624) 381-1078
(540) 126-1980
(874) 163-2885
(286) 254-2860
(292) 108-518
(129) 44-1379
(458) 273-1642
(686) 299-8268
(198) 307-2440
[me@linuxbox ~]$ grep -Ev '^\([0-9]{3}\) [0-9]{3}-[0-9]{4}$' phonelist.txt
(292) 108-518
(129) 44-1379
[me@linuxbox ~]$ find . -regex '.*[^-\_./0-9a-zA-Z].*'
注:掃描會發現包含空格和其它潛在不規範字符的路徑名
[me@linuxbox ~]$ locate --regex 'bin/(bz|gz|zip)'
/bin/bzcat