1、文本处理三剑客之grep
对于各种linux的发烧友来说,想玩转linux,就必须对linux的文本处理的三剑客有所了解直到掌握,今天就来小谈一下三剑客之一grep
1、文本三剑客之grep
1、什么是grep
grep
即Global search Regular expression and Print out the line.意为全面搜索正则表达式匹配到的内容并打印匹配到的行,但是grep也只是unix的grep家族中一个小人物,其中还包括egrep
,fgrep
.
1、egrep
egrep是grep的扩展,支持更多的re元字符
2、fgrep
fgrep就是fixed grep或者说是fast grep,旨在把所有的字母都看做为单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不在特殊
2、深入grep
1、grep的作用
文本搜索工具,根据用户指定的模式(过滤条件)
对目标文本逐行进行匹配检查;打印匹配到的行;
2、grep的模式
由正则表达式的元字符
及文本字符
所编写出的过滤条件;
3、grep使用格式
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
选项:OPTIONS:
--color=auto:对匹配到的文本着色后高亮显示;
alias grep='grep --color=auto'
-i:ignorecase,忽略字符的大小写;
-o:仅显示匹配到的字符串本身;
-v, --invert-match:显示不能被模式匹配到的行;
-E:支持使用扩展的正则表达式元字符;
-q, --quiet, --silent:静默模式,即不输出任何信息;
-q
一般使用在脚本中,可以 通过判断"$?"(echo $?)值确定是否找到
1
说明没有匹配到2
说明匹配到
4、显示搜索匹配到的上下文
- -A #:after, 后#行
- -B #:before,前#行
- -C #:context,前后各#行
xuelong@xueba ~ at /etc/passwd | grep -A 2 root
root:x:0:0:root:/root:/usr/bin/zsh #此行为匹配到的行
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
xuelong@xueba ~ cat /etc/passwd | grep -B 2 xuelong
sddm:x:118:126:Simple Desktop Display Manager:/var/lib/sddm:/bin/false
usbmux:x:119:46:usbmux daemon,,,:/var/lib/usbmux:/bin/false
xuelong:x:1000:1000:xuelong,,,:/home/xuelong:/usr/bin/zsh #此行为匹配到的行
xuelong@xueba ~ cat /etc/passwd | grep -C 2 HPLIP
colord:x:111:121:colord colour management daemon,,,:/var/lib/colord:/bin/false
dnsmasq:x:112:65534:dnsmasq,,,:/var/lib/misc:/bin/false
hplip:x:113:7:HPLIP system user,,,:/var/run/hplip:/bin/false #此行为匹配到的行
kernoops:x:114:65534:Kernel Oops Tracking Daemon,,,:/:/bin/false
pulse:x:115:122:PulseAudio daemon,,,:/var/run/pulse:/bin/false
3、grep使用案例
案例一
xuelong@xueba~ ps -ef | grep docker
root 1176 1 0 09:53 ? 00:00:06 /usr/bin/dockerd -H fd://
root 1218 1176 0 09:53 ? 00:00:00 containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --shim containerd-shim --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --runtime runc
xuelong 5218 4238 0 13:42 pts/3 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn docker
2、正则表达式
1、理解正则表达式
正则表达式的出现奠定了计算机智能化的开端
Regual Expression, REGEXP
,是由一类特殊的字符及文本字符所编写的模式,其中有些字符不表示其字面的意义,而是用于表示控制或通配的功能
正则表达式分为两类
- 基本正则表达式BRE
- 扩展正则表达式ERE
2、基本正则表达式
1、元字符
.
:匹配任意单个字符[]
:匹配指定范围内
的任意单个字符[^]
:匹配指定范围外
的任意单个字符’
[]
中的范围有几种表示方式
[:digit:]
:表示所有的数字[:lower:]
:表示小写的字符[:upper:]
:表示大写的字符[:alpha:]
:表示所有的字母[:alnum:]
:表示所有的字母和数字[:punct:]
:表示特殊符号[:space:]
:表示空白字符
2、次数匹配
用在要指定其出现的次数的字符的后面,用于限制其前面字符出现的次数,默认情况下工作与贪婪模式
*
:匹配其前面的字符任意次;0,1,多次.*
:匹配任意长度的任意字符?
:匹配其前面的字符0次或1次;即其前面的字符是可有可无的+
:匹配其前面的字符1次或多次;即其面的字符要出现至少1次{m}
:匹配其前面的字符m次{m,n}
:匹配其前面的字符至少m次,至多n次{0,n}
:至多n次{m,}
:至少m次
3、位置锚定
对特定的位置进行定位
^
:行首锚定;用于模式的最左侧$
:行尾锚定;用于模式的最右侧^PATTERN$
:用于PATTERN来匹配整行^$
:空白行^[[:space:]]*$
:空行或包含空白字符的行
- 单词:非特殊字符组成的连续字符(字符串)都称为单词;包含数字
- < 或 :词首锚定,用于单词模式的左侧;如<root,只能锚定root开头的单词
- > 或 :词尾锚定,用于单词模式的右侧;如root>,只智能锚定root结尾的单词
- <PATTERN>:匹配完整单词;如<root>,精确锚定单词为root
4、分组
分组就是把一个或多个字符捆绑在一起,当做一个整体进行处理,例如()
案例
(xy)*ab
:表示xy这个整体可以出现任意次
注意
分组括号中的模式匹配 到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量的命名为1,2...:
- 1:模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符
- 2:模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符
- 后向引用:引用前面的分组括号中的模式所匹配到的字符;
He loves his lover.
He likes his lover.
She likes her liker.
She loves her liker.
~]# grep "(l..e).*1" lovers.txt
3、扩展正则表达式
支持扩展正则表达式实现类似于grep文本过滤功能
使用格式
使用格式:egrep [OPTIONS] PATTERN [FILE...]
选项:
-i:不区分大小写
-o:只显示匹配到字符串本身,
-v:对匹配的结果去反
-q:表示静默输出
-A #:表示匹配到行的后几行
-B #:表示匹配到行的前几行
-C #:表示匹配到行的上下文几行;
-G:支持基本正则表达式
1、扩展正则表达式的元字符
- .:任意单个字符
- []:指定范围内的任意单个字符
- [^]:指定范围外的任意单个字符
2、次数匹配
- *:任意次,0,1或多次
- ?:0次或1次,其前的字符是可有可无的
- +:其前字符至少1次
- {m}:其前的字符m次
- {m,n}:至少m次,至多n次
3、位置锚定
- ^:行首锚定
- $:行尾锚定
- <, :词首锚定
- >, :词尾锚定
4、分组及引用
- ():分组;括号内的模式匹配到的字符会被记录于正则表达式引擎的内部变量中
- 后向引用:1, 2, ...
注意 - a|b:a或者b
- C|cat:C或cat,注意,此处表示的是整个左侧或者后侧
- (c|C)at:cat或Cat
5、案例
案例一、 找出/proc/meminfo文件中,所有以大写或小写S开头的行;至少有三种实现方式
~]# grep -i "^s" /proc/meminfo
~]# grep "^[sS]" /proc/meminfo
~]# grep -E "^(s|S)" /proc/meminfo
案例二、显示当前系统上root、centos或user1用户的相关信息
~]# grep -E "^(root|centos|user1)>" /etc/passwd
案例三、找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行;
~]# grep -E -o "[_[:alnum:]]+()" /etc/rc.d/init.d/functions
案例四、使用echo命令输出一绝对路径,使用egrep取出基名;(此处是从右向左进行匹配)
~]# echo /etc/sysconfig/ | grep -E -o "[^/]+/?$"
进一步:取出其路径名;类似于对其执行dirname命令的结果;
案例五、找出ifconfig命令结果中的1-255之间的数值;
~]# ifconfig | grep -E -o "<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])>"
案例六、找出ifconfig命令结果中的IP地址;
ifconfig | grep -E -o "([0-9]{1,3}[.]){3}[0-9]{1,3}"
案例七、添加用户bash, testbash,basher以及nologin(其shell为/sbin/nologin);而后找出/etc/passwd文件中用户名同shell名的行;
~]# grep -E "^([^:]+>).*1$" /etc/passwd