| 字符 | 作用 |
|---|---|
| ^ | 表示匹配以尖角号后面的单词开头的行 |
| $ | 表示匹配以美元符后面的单词结尾的行 |
| ^$ | 表示空行 |
| . | 匹配任意一个且只有一个字符 |
| \ | 让有特殊含义的字符输出自身 |
| * | 重复前一个字符(连续出现)0次或N次 |
| .* | 匹配所有内容 |
| ^.* | 匹配任意多个字符开头的内容 |
| .*$ | 匹配任意多个字符结尾的内容 |
| [abc] | 匹配[]集合内的任意一个字符 |
| [^abc] | 不匹配^后的任意字符 |
grep '^my' oldboy.txt
grep '^I' oldboy.txt

grep '448$' oldboy.txt
grep '448' oldboy.txt

grep 'm$' oldboy.txt
cat -A oldboy.txt
grep 'm $' oldboy.txt

我们使用m$没找到以m结尾的行,我们cat查看文件内容,发现是以m结尾的行。我们使用cat -A查看文件中的隐藏字符发现,m后面还有空格,使用m $即可匹配
空格也是字符,查找含有空格的行
grep ' ' oldboy.txt

grep '^$' oldboy.txt
grep -n '^$' oldboy.txt

显示空行一般意义不大,我们一般用-v ^$排除空行
grep -v '^$' oldboy.txt
grep -nv '^$' oldboy.txt

grep '.' oldboy.txt

这样就匹配了所有字符,由于空行不是字符,故这种方式也能排除空行
查找以.结尾的行
grep '.$' oldboy.txt

注意,这条指令匹配的是以任何字符结尾的行,而不是以.结尾的行,于是我们需要使用转义字符\
查找以.结尾的行
grep '\.$' oldboy.txt

查找出现0次或多次的0,出现一次也算连续出现
grep '0*' oldboy.txt

为何还显示出了文件其他部分呢?
*表示出现0次或者0次以上,出现0次,相当于是空,即没有这个字符

当grep的正则中什么都不写时,就把文件内容都显示出来了
grep '.*' oldboy.txt
.*也可以匹配空行

我们想匹配从开头到字符t的部分,中间可以是任意字符
grep '^.*t' oldboy.txt

我们想匹配从开头到字符o的部分,中间可以是任意字符
grep '^.*o' oldboy.txt

我们本来想的是,匹配到一行第一个o即可,正则帮我们匹配到了最后一个o,这就是正则的贪心原则
grep "^.*zx" oldboy.txt # 从开头匹配到zx停止
grep "fq.*$" oldboy.txt # 从fq开始匹配到结尾
grep '[abc]' oldboy.txt

匹配[abc]内任意一个字符,可我们看见匹配了ac,这是俩字符,我们显示一下匹配过程
grep -o '[abc]' oldboy.txt

a和c是分两次匹配的
我们一般这样使用:[a-z]、[A-Z]、[0-9],用于匹配ASCII码表上相邻的字符
grep '[a-z]' oldboy.txt

grep '[a-zA-Z0-9]' oldboy.txt
grep '[a-Z0-9]' oldboy.txt
grep -i '[a-z0-9]' oldboy.txt # -i不区分大小写

grep '[a-Z 0-9]' oldboy.txt
grep '[a-Z,0-9]' oldboy.txt # 匹配逗号
[]还能去掉特殊含义:[a-z|A-Z|0-9]表示匹配大小写字母和数字,以及|,有点类似于转义字符的功能

在中括号里,^表示取反
grep '[^abc]' oldboy.txt
