grep: Global search regular expression and print out the line.
作用:文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文件逐行进行匹配检查,打印匹配的行
模式:由正则表达式的元字符及文本字符所编写出的过滤条件
grep [OPTIONS] PATTERN [FILE…]
OPTIONS:
--color=auto:对匹配到的文本着色后高亮显示
-i, --ignore-case:忽略字符的大小写
-o, --only-matching:仅显示匹配到的字符串本身
-v, --invert-match:显示不能被模式匹配到的行
-E, --extended-regexp:支持使用扩展的正则表达式元字符
-q, --quiet, --silent:静默模式,即不输出任何信息
-A #:after,显示匹配到行和向后#行
-B #:before,显示匹配到行和前#行
-C #:context,显示匹配到行和前后各#行
正则表达式分为两种:1.基本正则表达式 2.扩展正则表达式
PATTERN,正则表达式(这里用到是基本正则表达式)
基本正则表达式有四种匹配模式:1.字符匹配 2.匹配次数 3.位置锚定 4.分组及应用
1.字符匹配:
.(英文的点):匹配任意单个字符
[]:匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符
特殊:[:digit:]、[:lower:]、[:upper:]、[:alpha:]、[:alnum:]、[:punct:]、[:space:]
2.匹配次数:
*:匹配其前面的字符任意次(0,1,多次)
.*:匹配任意长度的任意字符
\?:匹配其前面的字符0次或1次,即其前面的字符是可有可无的
\+:匹配其前面的字符1次或多次,即其面的字符要出现至少1次
\{#\}:匹配其前面的字符#次
\{m,n\}:匹配其前面的字符至少m次,至多n次
\{0,n\}:至多n次
\{m,\}:至少m次
3.位置锚定
^:行首锚定,用于模式的最左侧
$:行尾锚定,用户模式的最右侧
^PATTERN$:用于parrern来匹配整行
^$:空白行
^[[:space:]]*$:空行或包含空白字符的行
\<或\b:词首锚定,用于单词模式的左侧
\>或\b:词尾锚定,用于单词模式的右侧
\:匹配完整单词
4.分组及应用:
\(\):将一个或多个字符捆绑在一起,当做一个整体进行处理
note:分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中
\1:模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符
\2:模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符
例题:
1.显示/etc/passwd文件中不以/bin/bash结尾的行
grep -v "/bin/bash$" /etc/passwd
2.找出/etc/passwd文件中两位数或三位数
grep '[1-9]\{1,2\}[1-9]' /etc/passwd
3.找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中,以至少一个空白字符开头,且后面非空白字符的行
grep '^[[:space:]]\+[[:alpha:]]' test.txt
4.找出”netstat -tan”命令的结果中以’LISTEN’后跟0,1或多个空白字符结尾行
netstat -tan | grep 'LISTEN[[:space:]].*$'
5.创建test.txt文件内容如下:
He love his lover
He likes his lover
She likes her liker
She loves her liker
查找单词中出现 l和e之间存在两个字符,且一行中要出现两次查找到的内容。
grep '\(l..e\).*\1' test.txt
egrep命令:支持扩展的正则表达式实现类似于grep文本过滤功能
egrep [OPTIONS] PATTERN [FILE...]
OPTIONS
-l, -o, -v, -q, -A, -B, -C(跟上述的grep功能一样,这里就不再累述)
-G:支持基本正则表达式
PATTERN,正则表达式(这里的正则表达式用到是扩展表达式)
扩展正则表达式也有四种匹配模式:1.字符匹配 2.匹配次数 3.位置锚定 4.分组及应用
字符匹配和位置锚定跟grep用法一样这里不再累述
次数匹配:用法还是跟上述一样。但是扩展正则表达式?,+,{,}不需要用\来转义
分组及引用:用法还是跟上述一样。但是扩展正则表达式括号不需要用\来转义。还有新的一个功能 或(|) 。例如 (c|C)at:cat或者Cat
例题:
1.找出/proc/meminfo文件中,所有在大写或小写S开头的行,至少有两种实现方式
egrep "^(S|s)" /proc/meminfo
egrep ^[Ss] /proc/meminfo
2.显示当前系统上root、Python、maintain用户的相关信息
egrep ^\(root\|python\|maintain\) /etc/passwd
3.找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行
grep "[[:alpha:]]\+(" /etc/rc.d/init.d/functions
egrep '[[:alpha:]]\+|\)|\(' /etc/rc.d/init.d/functions
4.使用echo命令输出一绝对路径,使用egrep取出几名
echo /home/maintain/test.txt | grep -E -o "[^/]+/?$"
5.进一步:取出其路径名;类似于对执行dirname命令结果
找出ifconfig命令结果中的1-255之间的数值
ifconfig eth0 | egrep -o "[1-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]"
6.添加用户bash,testbash,basher以及nologin(其中shell为/sbin/nologin),而后找出/etc/passwd文件中用户名同shell名行
egrep "(^[[:alnum:]]+\>).*\1$" /etc/passwd
扩展题:找出ifconfig命令结果中的IP地址
ifconfig eth0 | grep "inet " | sed 's/[[:space:]]\+inet //' | sed "s/ .*//"
fgrep命令:不支持正则表达式元字符
当无需要用到元字符去编写模式时,使用fgrep必能更好