对于各种linux的发烧友来说,想玩转linux,就必须对linux的文本处理的三剑客有所了解直到掌握,今天就来小谈一下三剑客之一grep
grep
即Global search Regular expression and Print out the line.意为全面搜索正则表达式匹配到的内容并打印匹配到的行,但是grep也只是unix的grep家族中一个小人物,其中还包括egrep
,fgrep
.
egrep是grep的扩展,支持更多的re元字符
fgrep就是fixed grep或者说是fast 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一般使用在脚本中,可以 通过判断"
1
说明没有匹配到2
说明匹配到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/nologinxuelong@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
案例一
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
正则表达式的出现奠定了计算机智能化的开端
Regual Expression, REGEXP
,是由一类特殊的字符及文本字符所编写的模式,其中有些字符不表示其字面的意义,而是用于表示控制或通配的功能
正则表达式分为两类
.
:匹配任意单个字符[]
:匹配指定范围内
的任意单个字符[^]
:匹配指定范围外
的任意单个字符’[]
中的范围有几种表示方式
[:digit:]
:表示所有的数字[:lower:]
:表示小写的字符[:upper:]
:表示大写的字符[:alpha:]
:表示所有的字母[:alnum:]
:表示所有的字母和数字[:punct:]
:表示特殊符号[:space:]
:表示空白字符用在要指定其出现的次数的字符的后面,用于限制其前面字符出现的次数,默认情况下工作与贪婪模式
*
:匹配其前面的字符任意次;0,1,多次.*
:匹配任意长度的任意字符\?
:匹配其前面的字符0次或1次;即其前面的字符是可有可无的\+
:匹配其前面的字符1次或多次;即其面的字符要出现至少1次\{m\}
:匹配其前面的字符m次\{m,n\}
:匹配其前面的字符至少m次,至多n次\{0,n\}
:至多n次\{m,\}
:至少m次对特定的位置进行定位
^
:行首锚定;用于模式的最左侧^PATTERN$
:用于PATTERN来匹配整行^$
:空白行^[[:space:]]*$
:空行或包含空白字符的行分组就是把一个或多个字符捆绑在一起,当做一个整体进行处理,例如\(\)
\(xy\)*ab
:表示xy这个整体可以出现任意次
注意
分组括号中的模式匹配 到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量的命名为\1,\2...:
He loves his lover.
He likes his lover.
She likes her liker.
She loves her liker.
~]# grep "\(l..e\).*\1" lovers.txt
支持扩展正则表达式实现类似于grep文本过滤功能 使用格式
使用格式:egrep [OPTIONS] PATTERN [FILE...]
选项:
-i:不区分大小写
-o:只显示匹配到字符串本身,
-v:对匹配的结果去反
-q:表示静默输出
-A #:表示匹配到行的后几行
-B #:表示匹配到行的前几行
-C #:表示匹配到行的上下文几行;
-G:支持基本正则表达式
案例一、 找出/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