16.正则表达式(快乐的Linux命令行)

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
发布了59 篇原创文章 · 获赞 11 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章