如果要使用正则表达式,需要添加-E选项——这意味着使用扩展(extended)正则表达式。或者也可以使用默认允许正则表达式的grep命令——egrep。例如:
$ grep -E "[a-z]+" filename
#或者
$ egrep "[a-z]+" filename
使用 -o
[root@CentOS ~]# grep word readme
this is the line containing word
[root@CentOS ~]# grep word readme -o
word
-v, --invert-match
翻转匹配即是将不属于模式的内容输出
[root@CentOS ~]# grep -v word readme
this is a simple line.
[root@CentOS ~]# cat readme
this is the line containing word, word
this is a simple line.
[root@CentOS ~]# grep -c word readme
1
[root@CentOS ~]# grep -o word readme |wc -l
2
-l
[root@CentOS ~]# grep -l word readme out.html
readme
-n
-P
-b
-b, --byte-offset
Print the 0-based byte offset within the input file before each line of output. If -o (--only-matching) is specified, print the offset
of the matching part itself.
-o
只输出匹配单词结果
[root@CentOS ~]# grep -b -o word readme
28:word
34:word
39:word
[root@CentOS ~]# cat readme
this is the line containing word, word
word
this is a simple line.
-R
[edemon@CentOS tmp]$ grep "open" . -R
./write.c: int fd = open("./tmp.txt",O_WRONLY|O_CREAT|O_TRUNC,0644);
./write.c: perror("tmp.txt open wrongly");
-i
[edemon@CentOS tmp]$ echo "HAha" |grep -i "haha"
HAha
使用-e
选项
[edemon@CentOS tmp]$ echo this is a line |grep -e "is" -e "line" -o
is
is
line
使用文件
[edemon@CentOS tmp]$ echo -e "is\nline" > pattern_txt
[edemon@CentOS tmp]$ cat pattern_txt
is
line
[edemon@CentOS tmp]$ echo this is a line |grep -f pattern_txt -o
is
is
line
include
或 exclude
[edemon@CentOS tmp]$ grep "open" . -r --include *.c
./write.c: int fd = open("./tmp.txt",O_WRONLY|O_CREAT|O_TRUNC,0644);
./write.c: perror("tmp.txt open wrongly");
[edemon@CentOS tmp]$ grep "open" . -r --exclude *.c
排除目录:--exclude-dir
从文件中读取所需排除的文件列表: --exclude-from FILE
-q
选项可以使得grep不输出任何东西到stdout。即使出现出错。
当返回值是0时,则找到了对象。非0则没找到。
[edemon@CentOS workspace]$ cat auto.c |grep -q longjmp
[edemon@CentOS workspace]$ echo $?
0
#输出4后面2行
[edemon@CentOS workspace]$ seq 10 |grep 4 -A 2
4
5
6
#输出4前面2行
[edemon@CentOS workspace]$ seq 10 |grep 4 -B 2
2
3
4
#输出4前后两行
[edemon@CentOS workspace]$ seq 10 |grep 4 -C 2
2
3
4
5
6
edemon@linux:~$ cat tt
“在这个世界上,分裂是最大的痛苦,堤坝的分裂会导致洪灾,地表的分裂会导致地震,山峦的分裂会带来山崩,爱情的分裂会带来离婚,同样你和自我的分裂会带来一生的痛苦和遗憾。人生最大的痛苦莫过于知道该怎么做却没有去做,你会自责,你会对自己不满意,你会觉得自己是渺小的、不讲信誉不可信的。总而言之,就是你开始不信任自己,自信心降低了。”
真正能自控的人是内心和谐的人,他们将自己内心的每一部分需求都当作朋友来看待,这样每一部分都不会捣乱。这样的人不是试图控制或压制一些缺点,而总能从它们当中找到正面的信息。
仔细地聆听一下你内心的声音,你会听见,你心中有一个部分在大喊:你整天做令人烦躁和劳累的工作,你太需要休息和娱乐了。现在,你要感谢这个“次人格”对你的关心和帮助,告诉它你一定会去。但此时此地,你必须先把手头的工作完成。这个时候,你会发现,那些曾经让你分心的想法不再纠缠你了,它相信了你的承诺。
edemon@linux:~$ grep -n "分裂" tt #tt中包含"分裂"的所有行
1:“在这个世界上,分裂是最大的痛苦,堤坝的分裂会导致洪灾,地表的分裂会导致地震,山峦的分裂会带来山崩,爱情的分裂会带来离婚,同样你和自我的分裂会带来一生的痛苦和遗憾。人生最大的痛苦莫过于知道该怎么做却没有去做,你会自责,你会对自己不满意,你会觉得自己是渺小的、不讲信誉不可信的。总而言之,就是你开始不信任自己,自信心降低了。”
edemon@linux:~$ grep -v "分裂" tt #tt中不包含"分裂"的所有行
真正能自控的人是内心和谐的人,他们将自己内心的每一部分需求都当作朋友来看待,这样每一部分都不会捣乱。这样的人不是试图控制或压制一些缺点,而总能从它们当中找到正面的信息。
仔细地聆听一下你内心的声音,你会听见,你心中有一个部分在大喊:你整天做令人烦躁和劳累的工作,你太需要休息和娱乐了。现在,你要感谢这个“次人格”对你的关心和帮助,告诉它你一定会去。但此时此地,你必须先把手头的工作完成。这个时候,你会发现,那些曾经让你分心的想法不再纠缠你了,它相信了你的承诺。
edemon@linux:~$ grep -c "分裂" tt #输出行数
1
edemon@linux:~$ grep -l "分裂" *
grep: c: Is a directory
grep: d: Is a directory
grep: Desktop: Is a directory
grep: Documents: Is a directory
grep: Downloads: Is a directory
grep: e: Is a directory
grep: f: Is a directory
grep: Music: Is a directory
grep: Pictures: Is a directory
grep: pra.link: Is a directory
grep: Public: Is a directory
grep: sda: Is a directory
grep: Templates: Is a directory
tt
grep: Videos: Is a directory
edemon@linux:~$ grep -s "分裂" * #和前者比较少了很多乱七八糟的出错信息
tt:“在这个世界上,分裂是最大的痛苦,堤坝的分裂会导致洪灾,地表的分裂会导致地震,山峦的分裂会带来山崩,爱情的分裂会带来离婚,同样你和自我的分裂会带来一生的痛苦和遗憾。人生最大的痛苦莫过于知道该怎么做却没有去做,你会自责,你会对自己不满意,你会觉得自己是渺小的、不讲信誉不可信的。总而言之,就是你开始不信任自己,自信心降低了。
edemon@linux:~$ grep -r doc * #递归搜索当前目录下含关键词grep的文本内容
grep 使用 -w 后相应的元字符变成普通字符,使用参数x匹配整行
edemon@linux:~$ cat tt
#!/bin/bash
echo "the time is "
date
echo here is :
who
echo
edemon@linux:~$ grep -w echo tt
echo "the time is "
echo here is :
echo
edemon@linux:~$ grep -x echo tt
echo
echo $? 用于输出上一条命令的退出状态(返回码)0表示成功执行,1表示未得到结果,2表示产生语法错误
edemon@linux:~$ echo $?
0
edemon@linux:~$ grep -x echo ttt
grep: ttt: No such file or directory
edemon@linux:~$ echo $?
2
edemon@linux:~$ cat tt
ab
ab
cv
ab
edemon@linux:~$ grep -b -w ab tt #打印匹配行距离首部的偏移量
0:ab
3:ab
9:ab #解释,每一个串计上'\0'
edemon@linux:~$ cat tt
ab ab cv ab
edemon@linux:~$ grep -b -o -w ab tt #匹配词的偏移量
0:ab
3:ab
9:ab
edemon@linux:~$ grep -b -w ab tt
0:ab ab cv ab
查找tt文件中的空白行和非空白行
edemon@linux:~$ grep ^$ tt
edemon@linux:~$ grep ^[^$] tt
精确匹配:
edemon@linux:~$ grep "\" tt
ab
edemon@linux:~$ grep -w ab tt
ab
grep 命令族:
grep 标准,支持基本正则表达式
egrep (grep -E) 拓展,支持拓展正则表达式
fgrep (grep -F) 快速,不支持正则表达式
不区分大小写的查找:
edemon@linux:~$ grep .*[aA].* tt #查找含a或者A的文本
34.eA
asa
行尾判断:
edemon@linux:~$ grep -E [^A-Za-z]$ tt
:
213
edemon@linux:~$ grep -E :$ tt
: