简介
grep命令作为Linux中常用的命令,是文本搜索的重要工具。它可以接受正则表达式,生成各种格式的输出。
常用命令
选项 | 含义 |
---|---|
-E |
grep命令可以使用扩展正则表达式搜索 |
-o | 只输出匹配到的内容 |
-v | 打印出不包含特定匹配模式的文本行 |
-c | 统计包含特定匹配模式的文本行数 |
-n | 打印出匹配字符串所在行的行号 |
-r或-R | 在多级目录中递归搜索 |
-i | 在搜索时不考虑字符的大小写 |
-e | 指定多个匹配模式 |
-f |
可以将匹配模式保存在文件中(一行一个模式),grep搜索时使用 -f读取文件中的匹配模式 |
细节
命令1:在stdin中搜索包含特定的模式的文本行(stdin表示标准输入)
$ echo -e "this is a word\nnext line" | grep word
输出结果为:
this is a word
命令解析:①要想在echo显示的字符串中使用转义字符(例如\n \t等),需要加上参数“-e”才能解析带有转义字符的字符串。故
$ echo -e "this is a word\nnext line"
输出结果为: this is a word
next line
②“|” 为管道运算符,用于多条命令的通信。
cmd1 | cmd2 | cmd3
这里,使用管道运算符连接了三个命令,其中cmd1的输出传递给cmd2,cmd2对cmd1进行操作的结果传递给cmd3,cmd3再对传递过来的内容做处理,最终输出到终端或是文件中。
③命令1中的例子是想在echo显示的字符串中查找关键词word ,会显示包含关键字“word”的一行文本。
命令2:在文件中搜索包含特定模式的文本行
$ grep pattern filename
#"pattern"表示想要搜索的特定模式
#“filename”是文件名(在哪一文件中搜索),即搜索范围
例如:grep hello hello_world.txt #表示在hello_world.txt中搜索关键词“hello”
输出结果:包含关键词的那一行文本
命令3:在多个文件中搜索包含特定模式的文本行
$ grep pattern filename1 filename2 filename3
命令4:grep默认使用基础正则表达式,选项“-E”可以使grep使用扩展正则表达式
$ cat args.txt
#输出结果为以下三行
ARG1
arg2
arg3
#使用正则表达式在文件中搜索,查找包含一个或多个小写字母的文本行
$ grep "[a-z]+" args.txt #由于grep默认使用基础正则表达式,不能解析本命令的正则表达式
正确的为:
$ grep -E "[a-z]+" args.txt
#或者使用egrep
$ egrep "[a-z]+" args.txt
输出结果为:
arg2
arg3
命令5:命令1-4中都是输出包含特定匹配模式的文本行,如果只输出匹配到的文本,就需要添加选项“-o”.
$ echo this is a line. | grep -oE "[a-z]+\."
输出结果:line.
命令解析:①正则表达式中 [a-z] 表示匹配任意单个小写字母,“+”表示匹配之前的项一次或多次,“\.”使转义字符,表示匹配“.”,故该正则表达式是查找一个或多个小写字母,并且以“.”结尾的文本。
②命令中的正则表达式不是基础正则表达式,所以grep命令加上“-E”选项。
命令6:选项-v可以打印出不匹配match_pattern的所有行。
$ grep -v match_pattern file
#"match_pattern"表示想要搜索的特定模式
例如:
args.txt文本内容如下:
ARG1
arg2
arg3
$ grep -v "arg2" args.txt
该命令输出不包含arg2的文本行:
结果:
ARG1
arg3
命令7:选项-c可以统计出包含特定匹配模式的文本行数。
$ echo -e "1 2 3 4\nhello\n5 6" | grep -c "[0-9]"
命令解析:①echo输出的字符串为:
1 2 3 4
hello
5 6
②grep命令想要查找包含单个数字的文本行数。
结果:
2 #虽然共有6个数字,但是分布在2行中
命令8:想要统计搜索出多少个匹配项,可以借助-o 选项(输出搜索到的匹配模式)。
echo -e "1 2 3 4\nhello\n5 6" | grep -o "[0-9]" | wc -l
命令解析:①上面命令中grep -o的输出结果为:
1
2
3
4
5
6
②“wc”是一个用于统计行、单词和字符数量的实用工具,它是Word Count(单词计数)的缩写,"wc -l"用于统计行数。
结果:
6
命令 9:选项-n可以打印出匹配字符串所在行的行号。
$ echo -e "1 2 3 4\nhello\n5 6" | grep -n 3
#打印出数字3所在的行数
结果:
1:1 2 3 4 #其中开头的1表示查找的内容在第一行
注:如果涉及到多个文件中查找,使用-n选项时也会打印出文件名。
命令10:选项-i可以在匹配模式时不考虑字符的大小写。
$ echo hello world | grep -i "HELLO"
结果:
hello world
命令11:选项-e可以指定多个匹配模式
$ grep -e "pattern1" -e "pattern2"
#"pattern1"和"pattern2"对应两个查找内容
例如:
$ echo this is a line of text | grep -o -e "this" -e "line"
#其中-o选项表示只输出匹配的内容
结果:
this
line
命令12:除了使用-e指定多个匹配模式,还乐意将多个匹配模式保存在文件(一个模式一行)中,例如:
pat_file.txt内容如下:
hello
cool
#两个匹配模式是在两行中
$ echo hello this is cool | grep -f pat_file.txt
结果:
hello this is cool