一、grep简介
【grep】:*Global Regular Expression Print
*根据给定的正则表达式搜索文本,是Linux系统中最重要和最有用的命令之一。
A “regular expression” is a text string that describes a particular search pattern.
【反思】:grep搜索的内容要理解为“字符串”,而不是“单词/关键字/...”
grep 对于字符串的定义很宽泛,空格、Tab、标点符号等都可以作为字符串的划分。
grep -e 和 -E 的区别主要在于符号在默认情况下是字符串还是特殊含义,参看 5.1。
注:反思内容的来源在后文红色字体对应的部分。
二、基本用法
2.1 在一个文件中搜索
在文件中搜索与字符串相匹配的内容,命令返回文件中包含此字符串的每一行内容。
$ grep "你所要搜索的字符串" 你所要搜索的文件名
例如:在文件 "test.txt" 中搜索包含连续字符串 aaa 的每一行。
$ grep "aaa" test.txt
2.2 同时在多个文件中搜索
直接输入多个文件名,命令返回时会自动显示字符串所在的文件名。
$ cat test1
a
aa
aaa
b
bb
$ cat test2
a
b
aa
bb
$ grep "a" test1 test2
test1:a
test1:aa
test1:aaa
test2:a
test2:aa
三、选项详解
3.1 忽略大小写 -i
i 指的是 ignore
命令返回包含 "aa" "aA" "Aa" "AA" 的每一行。
$ grep -i "aa" test.txt
3.2 反选 -v
v 指的是 invert-match
命令返回不包含 "aaa" 的每一行。
$ grep -v "aaa" test.txt
3.3 显示行号 -n
n 指的是 line-number
命令返回包含 "aaa" 的每一行,以及在文件中相对应的行号。
$ grep -n "aaa" test.txt
# output:
2:sdcnu, jfsdfaaa, aaasfjw
5:sdfowaaacjisdfaa
13:aaabbbccc
20:aaaaaaaaaaaaa
3.4 只搜索完全符合字符串要求的内容 -w
w 指的是 whole-word
首先用 cat 命令打开 test.txt 文件,看到文件中的内容,再用 grep -w 命令,返回的只有完全符合要求的行内容。
因此单纯的包含是不行的,例如aaaaaaaa不会返回。
grep 对于字符串的定义很宽泛,空格、Tab、标点符号等都可以作为字符串的划分。
「字母的例子」
$ cat test.txt
aaa bbb ccc
aaaaaaa
aaabbb
aaa:bbb
aaa,bbb
aaa bbb
aaa|bbb
aaa'bbb
aaaa bbbb
$ grep -w "aaa" test.txt
aaa bbb ccc
aaa:bbb
aaa,bbb
aaa bbb
aaa|bbb
aaa'bbb
「数字的例子」
$ cat test.txt
aa123bb
aa 123 bb
aa 1 2 3 bb
1 2 3
1,2,3,aa
$ grep -w "123" test.txt
aa 123 bb
「含有分隔符的例子」
$ grep "aa 1" test.txt
aa 123 bb
aa 1 2 3 bb
$ grep -w "aa 1" test.txt
aa 1 2 3 bb
综上,grep搜索的内容要理解为“字符串”,而不是“单词/关键字/...”
3.4 计算总行数 -c
c 指的是 -count
输出说明该文件中有 2 行包含字符串内容。
$ grep -c "aaa" test.txt
# output:
2
四、正则表达式
4.1 以**开头 ^
搜索以字符串 aa 开头的行。^要放在字符串前
$ grep "^aa" test.txt
4.2 以**结尾 $
搜索以字符串 aa 结尾的行。$要放在字符串后
$ grep "aa$" test.txt
4.3 存在任意字符 ./../.../....
搜索的字符串中存在任意位(可用任意字符代替),有几个位子就用几个.
搜索包含字符串 a..a 的行,可用两个任意字符代替..
命令返回(例如:a12a a*Ba a.1a 等等)
$ grep "a..a" test.txt
4.4 存在/不存在规定范围内的任意一个字符 [ ]
搜索字符串,包含 [ ] 外的字符,和 [ ] 内的任意字符。命令返回包含字符串 aa ab ac 的行。
$ grep "a[abc]" test.txt
搜索字符串,包含 [ ] 外的字符,和除了 [ ] 内的任意字符。命令不会返回字符串 aa ab ac 的行。
相当于不包含aa ab ac 的 a.
$ grep "a[^abc]" test.txt
用 [ ] 表示一个范围。命令返回以大写字母 A 到 H 开头的所有行。
$ grep "^[A-H]" test.txt
4.5 存在重复内容 *
非常实用的命令,特别是不规定字符串长度的情况下。
搜索括号内由小写字母和空格组成的字符串,不规定括号内的字符数量。
$ grep "([a-z ]*)" test.txt
4.6 字符串中存在4.1-4.5中的特殊符 \
在以上的特殊符号 ^ $ . * 的前面加上反斜杠 \ 表明该符号仅用作字符串
搜索以大写字母 C-I 开头,并且以 . 结尾的字符串,字符串长度不限,除去开头结尾意外的内容不限。
$ grep "^[C-I].*\.$" test.txt
五、拓展正则表达式 grep -E
5.1 grep -e 和 grep -E 的区别
有一些符号,除了作为字符串的一部分以为,有特殊的含义。这类符号可以进一步分为两类。
*第一类:^ $ . [ ] * *
在 grep 命令中,默认为特殊含义,若要作为字符串的一部分,则需要在前面加上反斜杠 \ 。
第二类:( ) | ? + { }
在grep命令中,默认为字符串,若要使用其特殊含义,则用 grep -E 。
5.2 存在规定范围内的任意一组字符 ( ) |
与 [ ] 作比较, [ ] 中只能是一个字符,依靠 ( ) 和|可以扩大范围。
( ):小括号里的内容作为一个独立的单元。
$ cat test
AaaaA
AbbbA
AabaA
$ grep -E "A(aaa|bbb)A" test
AaaaA
AbbbA
5.2 可有可无 ?+
与 * 的区别
* :0次~很多次
? : 0次 或者 1次
+ :1次~很多次
$ grep -E "copy(right)?" test # copy 后面有/没有 right
$ cat test
()
( )
$ grep "([^[:space:]]*)" test # 没有空格,或者至少有一个
()
( )
$ grep -E "\([^[:space:]]+\)" test # 至少有一个空格
( )
5.3 确定数量 { }
定一个确切的字符串长度。搜索在 ABCDEFG 范围内任三个字符组成的字符串。
$ grep -E "[ABCDEFG]{3}" test
定一个范围。搜索长度为15~20范围内的英文单词(不区分大小写)。
$ grep -E "[[:alpha:]]{15,20}" test
版权归原作者 兔子太岁 所有, 如有侵权,请联系我们删除。