grep基本使用方法

GREP(Global search RegularExpression and Print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep。它功能更强,可以通过-E、-F命令行选项来使用egrep和fgrep的功能。

grep的工作方式是在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到屏幕,不影响原文件内容。grep也可用于shell脚本,通过执行grep语句来返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。

语法:grep [options] 'pattern' FILE

准备工作:

为方便观察grep效果,可以先在~/.bashrc 文件中添加以下内容:

[root@www~]# cat >> ~/.bashrc << EOF

>export GREP_COLOR='01;34'

>alias grep='grep --color=auto'

>EOF

然后执行 source  ~/.bashrc

可以事先创建一个练习文件,

[root@www~]# cat >> grep.txt  << EOF

Root

MP5is short

rootis root

ThisRoot is not that root

#jackis here.

#tom is here

Howare ya

Howold are you

robert

lab

lib

lb

rooootabc

rot

aroot

rooot

ThinkPad

ipad

pad

aaaroot

EOF

正则表达式元字符集

l^用来锚定行的开始,如:

linux grep 2个条件都满足 linux中grep的用法_操作系统

l$锚定行的结束,如:

linux grep 2个条件都满足 linux中grep的用法_操作系统_02

l.匹配任意一个非换行符的字符,如:

linux grep 2个条件都满足 linux中grep的用法_shell_03

l* 匹配零个或多个先前字符,如

linux grep 2个条件都满足 linux中grep的用法_操作系统_04


l.*表示任意长度的任意字符。如:

linux grep 2个条件都满足 linux中grep的用法_操作系统_05


l[ ]匹配一个指定范围内的单个字符,如:

linux grep 2个条件都满足 linux中grep的用法_元字符_06

l[^]匹配一个不在指定范围内的任意单个字符,如:

linux grep 2个条件都满足 linux中grep的用法_元字符_07

l\(..\)匹配括弧中的词组,在后面也可以用数字引用,如:

linux grep 2个条件都满足 linux中grep的用法_操作系统_08

l\< 用于锚定单词的开始,如:

linux grep 2个条件都满足 linux中grep的用法_操作系统_09

l\> 用于锚定单词的结束,如:

linux grep 2个条件都满足 linux中grep的用法_元字符_10

l\< \>用于锚定整个单词,如:

linux grep 2个条件都满足 linux中grep的用法_锚定_11

l\{n\}表示其前面的字符,重复出现n次,如:

linux grep 2个条件都满足 linux中grep的用法_搜索_12

l\{n,\} 之前的字符至少出现n次,如:linux grep 2个条件都满足 linux中grep的用法_锚定_13

l\{m,n\} 之前的字符至少m次,不多于n次,如:linux grep 2个条件都满足 linux中grep的用法_搜索_14


l\? 表示前面的字符出现0次或1次,如:

linux grep 2个条件都满足 linux中grep的用法_操作系统_15

l\+表示前面的字符出现至少1次,如:

linux grep 2个条件都满足 linux中grep的用法_锚定_16

l\b 的用法跟\<相同,如:

linux grep 2个条件都满足 linux中grep的用法_元字符_17

POSIX字符类:

l[:alpha:] 任意一个字母相当于[a-z,A-Z],如:

linux grep 2个条件都满足 linux中grep的用法_操作系统_18

l[:alnum:] 任意一个字母和数字

linux grep 2个条件都满足 linux中grep的用法_元字符_19

l[:digit:] 表示任意一个数字

linux grep 2个条件都满足 linux中grep的用法_操作系统_20


l[:lower:] 小写字符

linux grep 2个条件都满足 linux中grep的用法_shell_21


l[:punct:] 标点符号

linux grep 2个条件都满足 linux中grep的用法_搜索_22


l[:space:] 表示空格或制表符,如,#后面跟了至少一个空格

linux grep 2个条件都满足 linux中grep的用法_锚定_23

l[:upper:] 表示大写字母,如:

linux grep 2个条件都满足 linux中grep的用法_搜索_24


用于egrep或 grep -E的元字符扩展集

l在egrep中有些元字符没有\,如+用来表示前面的字符出现至少一次,

linux grep 2个条件都满足 linux中grep的用法_锚定_25

l{}用来表示次数范围:

linux grep 2个条件都满足 linux中grep的用法_搜索_26

l? 匹配零个或1个先前的字符。如:

linux grep 2个条件都满足 linux中grep的用法_shell_27

l(m|n) 用于匹配m或n或,如:

linux grep 2个条件都满足 linux中grep的用法_shell_28


l{m},x{m,},x{m,n} 效果同\{m\},\{m,\},\{m,n\},在此不再赘述。

l常用的grep命令选项

-A–B -C 参数后面跟数字,表示显示额外的前,后,或前后多少行

   linux grep 2个条件都满足 linux中grep的用法_元字符_29



-i,--ignore-case忽略大小写差别。

   linux grep 2个条件都满足 linux中grep的用法_锚定_30


-q,--quiet取消显示,只返回退出状态。0则表示找到了匹配的行。

   linux grep 2个条件都满足 linux中grep的用法_锚定_31


-v,--revert-match反检索,只显示不匹配的行。

   linux grep 2个条件都满足 linux中grep的用法_shell_32


-w,--word-regexp把表达式做为一个单词搜索。

   linux grep 2个条件都满足 linux中grep的用法_元字符_33


-o, --only-matching 只显示被匹配的内容,如:

   linux grep 2个条件都满足 linux中grep的用法_操作系统_34


-R, -r, --recursive,查找在某个目录下的所有文件

   linux grep 2个条件都满足 linux中grep的用法_锚定_35


练习:

1、显示/proc/meminfo文件中以不区分大小的s开头的行;

   linux grep 2个条件都满足 linux中grep的用法_锚定_36


2、取出默认shell为bash,且其用户ID号最小的用户的用户名

   linux grep 2个条件都满足 linux中grep的用法_锚定_37


3、显示/etc/rc.d/rc.sysinit中以#开头,且后面跟一个或多个空白字符,而后又跟了任意非空白字符的行;

linux grep 2个条件都满足 linux中grep的用法_操作系统_38

4、匹配任意一个合法的A/B/C类地址:

[root@www work]# echo > ip.txt << EOF

0.1.1.1

10.1.1.1

192.168.10.1

223.255.255.254

224.0.0.1

223.255.255.255

240.1.1.1

EOF

[root@www work]#grep -E -w"([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-1][0-9]|22[0-3])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])" ip.txt

linux grep 2个条件都满足 linux中grep的用法_shell_39



转载于:https://blog.51cto.com/jackyan/1248838