**位置标记锚点(position marker anchor)是标识字符串位置的正则表达式。**默认情况下,正
则表达式所匹配的字符可以出现在字符串中任何位置,如下图。
标识符是正则表达式的基础组成部分。它定义了那些为了匹配正则表达式,必须存在(或不
存在)的字符,如下图。
一个标识符可以出现一次、多次或是不出现。数量修饰符定义了模式可以出现的次数,如下图。
( +[a-zA-Z]+ +)
开头的+表示需要匹配一个或多个空格。字符组[a-zA-Z]用于匹配所有的大小写字母。随后的+
表示至少要匹配一个字母,多者不限。最后的+表示需要匹配一个或多个空格来终结单词
这个正则表达式无法匹配句子末尾的单词。
( +[a-zA-Z]+[?,.]? +)
[?,.]?表示仅需要匹配问号、逗号或点号中的一个。
[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
[0-9]表示匹配数字。{1,3}表示至少一位数字,至多三位数字:
或者也可以使用[[:digit:]]表示数字:
[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}
正则表达式用$、^、.、*、+、{以及}等作为特殊字符。但是如果我们希望将这些字符作
为普通字符使用,应该怎么做呢?来看一个正则表达式:a.txt。
该正则表达式能够匹配字符a,然后是任意字符(由.负责匹配),接着是字符串txt。但是我们希望.能够匹配字面意义上的.,而非任意字符。因此需要在.之前加上一个反斜线\(这叫作“字符转义”)。这表明正则表达式希望匹配的是字面含义,而不是它所代表的特殊含义。因此,最终的正则表达式就变成了a.txt。
$ echo -e "this is a word\nnext line" | grep word
this is a word
$ grep pattern filename
this is the line containing pattern
或者
$ grep "pattern" filename
this is the line containing patter
$ grep "match_text" file1 file2 file3 ...
尽管该选项在命令行中的放置位置没有强制要求,不过惯常作为第一个选项出现。
$ grep --color=auto word filename
this is the line containing word
这是先前描述的正则表达式的一个子集。选项-E可以使grep使用扩展正则表达式。也可以使用默认启用扩展正则表达式的egrep命令
$ grep -E "[a-z]+" filename
或者
$ egrep "[a-z]+" filename
$ echo this is a line. | egrep -o "[a-z]+\."
line
$ grep -v match_pattern file
$ grep -c "text" filename
10
需要注意的是-c只是统计匹配行的数量,并不是匹配的次数。例如:
$ echo -e "1 2 3 4\nhello\n5 6" | egrep -c "[0-9]"
2
尽管有6个匹配项,但egrep命令只输出2,这是因为只有两个匹配行。在单行中出现的
多次匹配只被计为一次。
$ echo -e "1 2 3 4\nhello\n5 6" | egrep -o "[0-9]" | wc -l
6
$ cat sample1.txt
gnu is not unix
linux is fun
bash is art
$ cat sample2.txt
planetlinux
$ grep linux -n sample1.txt
2:linux is fun
或者
$ cat sample1.txt | grep linux -n
如果涉及多个文件,该选项也会随输出结果打印出文件名
$ grep linux -n sample1.txt sample2.txt
sample1.txt:2:linux is fun
sample2.txt:2:planetlinux
配合选项-o可以打印出匹配所在的字符或字节偏移。
$ echo gnu is not unix | grep -b -o "not"
7:not
字符在行中的偏移是从0开始计数,不是1。
$ grep -l linux sample1.txt sample2.txt
sample1.txt
sample2.txt
和-l效果相反的选项是-L,它会返回一个不匹配的文件列表。
如果需要在多级目录中对文本进行递归搜索,可以使用下列命令
$ grep "text" . -R -n
命令中的.指定了当前目录。例如:
$ cd src_dir
$ grep "test_function()" . -R -n
./miscutils/test.c:16:test_function();
等价于