grep命令详解

时间:2024-04-14 22:33:51

用法格式

grep [option] pattern file

实验文件

[root@zejin240 tmp]# cat testdir/tfile
1 #include <stdio.h>
2 void main()
3 {
4 int a,b;
5 a=10;
6 b=5;
7 a++;
8 b=a*2;
9 printf("Maxnum=%d",a>b?a:b);
10 }
[root@zejin240 tmp]# cat testdir/tfile1
Nice to meet you.
Hello World!
I like max and min
when meet a ?,think more.
and it will become a !

常用选项

匹配控制选项

-E:支持扩展正则表达式,相当于命令egrep
-F:只匹配固定的字符,相当于命令fgrep
-e:指定多个匹配模式
-i:忽略查找字符串及文件名大小写
-v:反向查找不匹配的行
-w:查找整个单词,而不一个子串
e.g 1.查找包含有main或Max的行
[root@zejin240 testdir]# grep -e 'main' -e 'Max' tfile
2 void main()
9 printf("Maxnum=%d",a>b?a:b);
e.g 2.查找包含有b且有Max的行
[root@zejin240 testdir]# grep 'b' tfile | grep 'Max'
9 printf("Maxnum=%d",a>b?a:b);
e.g 3.查找包含max的行,不区分大小写
[root@zejin240 testdir]# grep -i 'max' tfile
9 printf("Maxnum=%d",a>b?a:b);
e.g 4.查找没有=字符的行
[root@zejin240 testdir]# grep -v '=' tfile
1 #include <stdio.h>
2 void main()
3 {
4 int a,b;
7 a++;
10 }

输出控制选项

-c:输出匹配的总行数
-l:只输出匹配的文件名
--color:匹配的字符串用颜色显示
-o:只输出匹配的字符串,而不是所在行
-q:没有任何输出,有匹配的行返回状态0,适合与判断的时候用
e.g 5.查找有=号的行总行数
[root@zejin240 testdir]# grep -c '=' tfile
4

输出行前缀控制

-n:在每行前面输出该行在文件中所处的行数
-H:在每行前加止文件名,在有多个文件时该值是默认打开的
e.g 6.查找=所在的行数
[root@zejin240 testdir]# grep -n '=' tfile
5:5 a=10;
6:6 b=5;
8:8 b=a*2;
9:9 printf("Maxnum=%d",a>b?a:b);

上下文件输出控制

-A #:输出匹配行及后面#行
-B #:输出匹配行及前面#行
-C #:输出匹配行及前后#行
e.g 7.查找包含main的行及其后面2行
[root@zejin240 testdir]# grep -A 2 'main' tfile
2 void main()
3 {
4 int a,b;
e.g 8.查找包含main的行及其前面2行
[root@zejin240 testdir]# grep -B 2 'int' tfile
2 void main()
3 {
4 int a,b;
--
7 a++;
8 b=a*2;
9 printf("Maxnum=%d",a>b?a:b);
e.g 9.查找含有main的行及其前后1行:
[root@zejin240 testdir]# grep -C 1 'main' tfile
1 #include <stdio.h>
2 void main()
3 {

文件及文件夹控制

-r:递归查询文件及文件夹下的文件
e.g 10.查找文件夹下所有包含max(不区分大小写)的行
[root@zejin240 tmp]# ls
testdir
[root@zejin240 tmp]# grep -i 'max' * #查找不到,只会在当前文件夹下找
[root@zejin240 tmp]# grep -i -r 'max' * #正确,会递归入文件中查找
testdir/tfile:9 printf("Maxnum=%d",a>b?a:b);
testdir/tfile1:I like max and min

注意点

1.大多数的元字符在中括号中已经失去了他们的特殊意义,就是一个普通的字符而已
2.在基本的正则表达式中,?, +, {, |, (, 和) 没有特殊的含义,就是一个普通的字符,如果在使用时要让它有正则的含义,则需要加上\,如\? \+
3.传统的egrep命令并不支持{元字符,有一些egrep用\{来实现,为了避免出现疑惑,在grep -E 匹配{时最好用模式[{]
e.g 11.查找包含+和?号的行 (中括号中的加号和问号不需要加反斜线)
[root@zejin240 testdir]# grep '[+?]' tfile
7 a++;
9 printf("Maxnum=%d",a>b?a:b);
e.g 12.查找包含?号的行
[root@zejin240 testdir]# grep '?' tfile #直接写问号,不需要反斜线
9 printf("Maxnum=%d",a>b?a:b);
e.g 13.查找以有a,并且后面接任意一个字母的行
[root@zejin240 testdir]# grep 'a[a-zA-Z]' tfile
2 void main()
9 printf("Maxnum=%d",a>b?a:b);