Linux 通过grep命令筛选过滤

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ZENGZISUZI/article/details/80292975

grep命令语法

grep [option] pattern file

命令说明

通过grep命令能对特定字符进行筛选,得到我们期望的效果(过滤/搜索),grep全称是Global Regular Expression Print

命令参数

-a 不要忽略二进制数据。
-A<显示列数> 除了显示符合范本样式的那一行之外,并显示该行之后的内容。
-b 在显示符合范本样式的那一行之外,并显示该行之前的内容。
-c 计算符合范本样式的列数。
-C<显示列数>或-<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之前后的内容。
-d<进行动作> 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。
-e<范本样式> 指定字符串作为查找文件内容的范本样式。
-E 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式。
-f<范本文件> 指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式。
-F 将范本样式视为固定字符串的列表。
-G 将范本样式视为普通的表示法来使用。
-h 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。
-H 在显示符合范本样式的那一列之前,标示该列的文件名称。
-i 忽略字符大小写的差别。
-l 列出文件内容符合指定的范本样式的文件名称。
-L 列出文件内容不符合指定的范本样式的文件名称。
-n 在显示符合范本样式的那一列之前,标示出该列的编号。
-q 不显示任何信息。
-R/-r 此参数的效果和指定“-d recurse”参数相同。
-s 不显示错误信息。
-v 反转查找。
-w 只显示全字符合的列。
-x 只显示全列符合的列。
-y 此参数效果跟“-i”相同。
-o 只输出文件中匹配到的部分。


实际例子

以下是grep.log供实际例子使用

[root@rhel66x64 work]# cat grep.log
Regexp selection and interpretation:
 -E, --extended-regexp     PATTERN is an extended regular expression (ERE)
-F, --fixed-strings       PATTERN is a set of newline-separated fixed strings

#Example: grep -i 'hello world' menu.h main.c
      hello world
[root@rhel66x64 work]#
  • 显示过滤掉空行,以及#和-开头的行信息(-E前有空格,所以没有被过滤掉)
[root@rhel66x64 work]# grep -Ev "^$|^[#-]" grep.log
Regexp selection and interpretation:
 -E, --extended-regexp     PATTERN is an extended regular expression (ERE)
      hello world
[root@rhel66x64 work]#
  • 在多个文件中查找,以及递归查找
[root@rhel66x64 work]# grep  "hello world" grep.log grep1.log grep2.log
grep.log:#Example: grep -i 'hello world' menu.h main.c
grep.log:      hello world
grep1.log:#Example: grep -i 'hello world' menu.h main.c
grep1.log:      hello world
grep2.log:#Example: grep -i 'hello world' menu.h main.c
grep2.log:      hello world
[root@rhel66x64 work]#
[root@rhel66x64 work]# grep "hello world" . -r -n
./grep2.log:5:#Example: grep -i 'hello world' menu.h main.c
./grep2.log:6:      hello world
./1/grep1-1.log:5:#Example: grep -i 'hello world' menu.h main.c
./1/grep1-1.log:6:      hello world
./1/2/3/4/grep1-4.log:5:#Example: grep -i 'hello world' menu.h main.c
./1/2/3/4/grep1-4.log:6:      hello world
./1/2/3/grep1-3.log:5:#Example: grep -i 'hello world' menu.h main.c
./1/2/3/grep1-3.log:6:      hello world
./1/2/grep1-2.log:5:#Example: grep -i 'hello world' menu.h main.c
./1/2/grep1-2.log:6:      hello world
./grep1.log:5:#Example: grep -i 'hello world' menu.h main.c
./grep1.log:6:      hello world
./grep.log:5:#Example: grep -i 'hello world' menu.h main.c
./grep.log:6:      hello world
[root@rhel66x64 work]#
  • 只输出文件中匹配到的部分
[root@rhel66x64 work]# grep -o "hello world" grep.log
hello world
hello world
  • 输出包含匹配字符串的行数以及其内容
[root@rhel66x64 work]# grep -n "hello world" grep.log
5:#Example: grep -i 'hello world' menu.h main.c
6:      hello world
[root@rhel66x64 work]#
  • 统计文件或者文本中包含匹配字符串的行数
[root@rhel66x64 work]# grep -c "hello world" grep.log
2
  • 多条件筛选实现or功能()
[root@rhel66x64 work]# grep "#\|-" grep.log
 -E, --extended-regexp     PATTERN is an extended regular expression (ERE)
-F, --fixed-strings       PATTERN is a set of newline-separated fixed strings
#Example: grep -i 'hello world' menu.h main.c

egrep 命令等同于‘grep -E’

[root@rhel66x64 work]# grep -E "#|Regexp" grep.log
Regexp selection and interpretation:
#Example: grep -i 'hello world' menu.h main.c
[root@rhel66x64 work]# grep -e "#" -e "Regexp" grep.log
Regexp selection and interpretation:
#Example: grep -i 'hello world' menu.h main.c
  • 多条件筛选实现and功能
[root@rhel66x64 work]# grep -E "Regexp.*and.*tion:" grep.log
Regexp selection and interpretation:
[root@rhel66x64 work]# grep -E "hello world" grep.log | grep -E "#"
#Example: grep -i 'hello world' menu.h main.c
  • 多条件筛选实现not功能
[root@rhel66x64 work]# grep -Ev "hello|Regexp" grep.log
 -E, --extended-regexp     PATTERN is an extended regular expression (ERE)
-F, --fixed-strings       PATTERN is a set of newline-separated fixed strings

  • 静默输出,通过获取其返回值来判断是否存在某字符
[root@rhel66x64 work]# grep -q "hello" grep.log
[root@rhel66x64 work]# echo $?
0
[root@rhel66x64 work]# grep -q "xxxxxxx" grep.log
[root@rhel66x64 work]# echo $?
1
  • 结合xargs做简单删除文件的操作(grep输出用-Z选项来指定以0值字节作为终结符文件名(\0),xargs -0 读取输入并用0值字节终结符分隔文件名,然后删除匹配文件,-Z通常和-l结合使用。)
[root@rhel66x64 work]# ls -l grep*
-rw-r--r--. 1 root root 255 May 12 18:04 grep.log
-rw-r--r--. 1 root root 255 May 12 18:04 grep1.log
-rw-r--r--. 1 root root 255 May 12 18:04 grep2.log
[root@rhel66x64 work]# grep "hello" grep* -lZ |xargs -0 rm
[root@rhel66x64 work]# ls -l grep*
ls: cannot access grep*: No such file or directory

一些符号含义

\:忽略正则表达式中特殊字符的原有含义。
^:匹配正则表达式的开始行。
$: 匹配正则表达式的结束行。
<:从匹配正则表达式的行开始。
>:到匹配正则表达式的行结束。
[ ]:单个字符,如[A]A符合要求 。
[ - ]:范围,如[A-Z],即ABC一直到Z都符合要求 。
。:所有的单个字符。
* :有字符,长度可以为0。

注:
在输入要搜索的字符串时最好使用双引号/而在模式匹配使用正则表达式时,注意使用单引号

猜你喜欢

转载自blog.csdn.net/ZENGZISUZI/article/details/80292975