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