Linux三剑客之grep命令详解

1、概述

Linux三剑客:grep、sed、awk。grep主打查找功能,sed主要是编辑行,awk主要是分割列处理。本篇文章我们详细介绍grep命令。

grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。用于过滤/搜索的特定字符。可使用正则表达式能配合多种命令使用,使用上十分灵活。

全称中的”Global search”为全局搜索之意。

全称中的”Regular Expression”表示正则表达式。

所以,从grep的全称中可以了解到,grep是一个可以利用”正则表达式”进行”全局搜索”的工具,grep会在文本文件中按照指定的正则进行全局搜索,并将搜索出的行打印出来。

当然,不使用正则表达式时也可以使用grep,但是当grep与正则表达式结合在一起时,威力更强大。

2、语法

2.1、用法

[root@liuchao ~]# grep --help
用法: grep [选项]... PATTERN [FILE]...
在每个 FILE 或是标准输入中查找 PATTERN。
默认的 PATTERN 是一个基本正则表达式(缩写为 BRE)。
例如: grep -i 'hello world' menu.h main.c

2.2、选项说明

-a --text  # 不要忽略二进制数据。
-A <显示行数>   --after-context=<显示行数>   # 除了显示符合范本样式的那一行之外,并显示该行之后多少行的内容(常用)。
-b --byte-offset                           # 在显示符合范本样式的那一行之外,并展示搜索字符偏移字节数(1个字符等于4个字节)。
-B<显示行数>   --before-context=<显示行数>   # 除了显示符合样式的那一行之外,并显示该行之前的内容(常用)。
-c --count    # 计算符合范本样式的行数(常用)。
-C<显示行数> --context=<显示行数>或-<显示行数> # 除了显示符合范本样式的那一列之外,并显示该行前后多少行的内容(常用)。
-d<进行动作> --directories=<动作>  # 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。
-e<范本样式> --regexp=<范本样式>   # 指定字符串作为查找文件内容的范本样式。
-E --extended-regexp             # 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式。
-f<范本文件> --file=<规则文件>     # 指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式。
-F --fixed-regexp   # 将范本样式视为固定字符串的列表。
-G --basic-regexp   # 将范本样式视为普通的表示法来使用。
-h --no-filename    # 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。
-H --with-filename  # 在显示符合范本样式的那一列之前,标示该列的文件名称。
-i --ignore-case    # 忽略字符大小写的差别(常用)。
-l --file-with-matches   # 列出文件内容符合指定的范本样式的文件名称。
-L --files-without-match # 列出文件内容不符合指定的范本样式的文件名称。
-n --line-number         # 在显示符合范本样式的哪一行最前面展示行号(常用)。
-P --perl-regexp         # PATTERN 是一个 Perl 正则表达式
-q --quiet或--silent     # 不显示任何信息。
-R/-r  --recursive       # 此参数的效果和指定“-d recurse”参数相同,递归查找目录下所有文件(常用)。
-s --no-messages  # 不显示错误信息。
-v --revert-match # 反转查找,查找非匹配到的行(常用)。
-V --version      # 显示版本信息。   
-w --word-regexp  # 只显示全字符合的列。
-x --line-regexp  # 只显示全列符合的列。
-y # 此参数效果跟“-i”相同。
-o # 只输出文件中匹配到的部分。
-m <num> --max-count=<num> # 找到num行结果后停止查找,用来限制匹配行数
 

2.3、正则表达式说明

^    # 锚定行的开始 如:'^grep'匹配所有以grep开头的行。    
$    # 锚定行的结束 如:'grep$' 匹配所有以grep结尾的行。
.    # 匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。    
*    # 匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。    
.*   # 一起用代表任意字符。   
[]   # 匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。    
[^]  # 匹配一个不在指定范围内的字符,如:'[^A-Z]rep' 匹配不包含 A-Z 中的字母开头,紧跟 rep 的行
\(..\)  # 标记匹配字符,如'\(love\)',love被标记为1。    
\<      # 锚定单词的开始,如:'\<grep'匹配包含以grep开头的单词的行。    
\>      # 锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。    
x\{m\}  # 重复字符x,m次,如:'0\{5\}'匹配包含5个o的行。    
x\{m,\}   # 重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。    
x\{m,n\}  # 重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。   
\w    # 匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。   
\W    # \w的反置形式,匹配一个或多个非单词字符,如点号句号等。   
\b    # 单词锁定符,如: '\bgrep\b'只匹配grep。  
 

3、常用实例

3.1、基本使用

从文件中查找关键字

测试文件内容如下:

// test1 文件内容
[root@liuchao grep_test]# cat test1.txt
row1_col1 row1_col2 row1_col3 row1_col4
row2_col1 row2_col2 row2_col3 row2_col4
row3_col1 row3_col2 row3_col3 row3_col4
// test2 文件内容
[root@liuchao grep_test]# cat test2.txt
row4_col1 row4_col2 row4_col3 row4_col4
row5_col1 row5_col2 row5_col3 row5_col4
row6_col1 row6_col2 row6_col3 row6_col4

直接贴代码,以下是实例通过关键字查找的场景: 

// 查找方式1
[root@liuchao grep_test]# grep row1_col2 test1.txt
row1_col1 row1_col2 row1_col3 row1_col4

// 查找方式2
[root@liuchao grep_test]# cat test1.txt | grep row1_col2 test1.txt
row1_col1 row1_col2 row1_col3 row1_col4

// 查找方式3
[root@liuchao grep_test]# grep 'row1_col2' test1.txt
row1_col1 row1_col2 row1_col3 row1_col4

// 查找方式4  可以是从多个文件中查找
[root@liuchao grep_test]# grep row1_col2 test1.txt test2.txt
test1.txt:row1_col1 row1_col2 row1_col3 row1_col4

// 递归查询目录下所有文件
[root@liuchao ~]# ll grep_test/
总用量 8
-rw-r--r-- 1 root root 120 3月  30 09:31 test1.txt
-rw-r--r-- 1 root root 120 3月  30 09:37 test2.txt
[root@liuchao ~]#
[root@liuchao ~]# grep -r  'row1_col2' ./grep_test/
./grep_test/test1.txt:row1_col1 row1_col2 row1_col3 row1_col4

// 查找并显示行号
[root@liuchao grep_test]# grep -n 'row1_col2' test1.txt
1:row1_col1 row1_col2 row1_col3 row1_col4

// 展示匹配关键字行之外所有的行
[root@liuchao grep_test]# grep -v 'row1_col2' test1.txt
row2_col1 row2_col2 row2_col3 row2_col4
row3_col1 row3_col2 row3_col3 row3_col4
[root@liuchao grep_test]#

// 忽略大小写
[root@liuchao grep_test]# grep -ni 'ROW1_COL2' test1.txt
1:row1_col1 row1_col2 row1_col3 row1_col4


// 查找关键展示关键字所在行 并展示下一行
[root@liuchao grep_test]# grep -A1 'row2_col2' test1.txt
row2_col1 row2_col2 row2_col3 row2_col4
row3_col1 row3_col2 row3_col3 row3_col4


// 查找关键展示关键字所在行 并展示上一行
[root@liuchao grep_test]# grep -B1 'row2_col2' test1.txt
row1_col1 row1_col2 row1_col3 row1_col4
row2_col1 row2_col2 row2_col3 row2_col4
[root@liuchao grep_test]#


// 查找关键展示关键字所在行 并展示上下一行
[root@liuchao grep_test]# grep -A1 -B1 'row2_col2' test1.txt
row1_col1 row1_col2 row1_col3 row1_col4
row2_col1 row2_col2 row2_col3 row2_col4
row3_col1 row3_col2 row3_col3 row3_col4
[root@liuchao grep_test]#

// 查找关键展示关键字所在行 并展示上下一行
[root@liuchao grep_test]# grep -C1 'row2_col2' test1.txt
row1_col1 row1_col2 row1_col3 row1_col4
row2_col1 row2_col2 row2_col3 row2_col4
row3_col1 row3_col2 row3_col3 row3_col4
[root@liuchao grep_test]#

3.2、配合正则表达式使用 

测试文件内容如下:

// 测试文件内容
[root@liuchao grep_test]# cat reg1.txt
row01 ro2  ro1
r01 row01 ro2
row01 ro3 ro4

row04 ro4 ro8
google is a browser
gogle is aaa
[root@liuchao grep_test]#

直接贴代码,以下是5个使用正则表达式的场景: 


// 查找以“row01” 开头的行数据  注意是开头
[root@liuchao grep_test]# grep '^row01' reg1.txt
row01 ro2  ro1
row01 ro3 ro4
[root@liuchao grep_test]#


// 查找以“ro2”结束的行数据 注意是结尾
[root@liuchao grep_test]# grep 'ro2$' reg1.txt
r01 row01 ro2
[root@liuchao grep_test]#

// 查找以“ro” 或者 "r0" 开头的行数据
[root@liuchao grep_test]# grep '^r[0o]' reg1.txt
row01 ro2  ro1
r01 row01 ro2
row01 ro3 ro4
row04 ro4 ro8
[root@liuchao grep_test]#

// 查找以”go“后面有2到5个”o“,然后再跟一个”g“ 的行数据 ,注意:2到5个o可以不是连续的只要后续列有即可
[root@liuchao grep_test]# grep 'go\{2,5\}g' reg1.txt
google is a browser
[root@liuchao grep_test]#


// 查询出空白行,和空白行上下一行
[root@liuchao grep_test]# grep -n -C1 '^$' reg1.txt
3-row01 ro3 ro4
4:
5-row04 ro4 ro8
[root@liuchao grep_test]#

猜你喜欢

转载自blog.csdn.net/u011837804/article/details/129850232