扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
grep是一个行编辑器,它的默认动作是搜索与给定模式匹配的行显示到屏幕上来。它的变种程序包括egrep和fgrep。
创新互联公司长期为上千客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为昭苏企业提供专业的成都网站建设、网站建设,昭苏网站改版等技术服务。拥有10年丰富建站经验和众多成功案例,为您定制开发。正则表达式是用户定义的、Linux工具用来过滤文本的模式模板。正则表达式利用元字符来表示数据流中的一个或多个字符。
正则表达式(Regual Expression,REGEXP)包括BRE和ERE两种,BRE就是基本正则表达式,而ERE是扩展正则表达式。
grep使用的元字符是BRE,egrep使用的元字符是ERE,而fgrep不使用元字符。而这三个命令可以使用不同的选项进行互通。接下来,我们来看看grep的用法。
一、grep
1. 格式
grep [options] PATTERN [FILE...]
2. 选项
-o:只显示匹配的行中与PATTERN相匹配的部分。
-i: 忽略PATTERN和输入文件中大小写的区别
-v:反选,只显示没有被PATTERN匹配到的行
-q:静默模式,找到匹配的内容,则命令的执行状态返回值为0,否则为非0。
-A NUM:打印紧随匹配的行之后的下文NUM行。
-B NUM: 打印紧随匹配的行之前的上文NUM行。
-C NUM: 打印匹配出来的行的上下文各NUM行。
二、基本正则表达式
类型 | 元字符 | 解释 |
字符匹配 | . | 匹配任意单个字符 |
[] | 匹配指定范围内的任意单个字符 | |
[^] | 匹配指定范围外的单个字符 | |
匹配次数 | * | 匹配其前的字符任意次,0次,1次或者多次 |
.* | 匹配任意长度的任意字符 | |
\? | 匹配其前的字符0次或者1次,即其前面的字符可有可元 | |
\+ | 匹配其前的字符1次或者多次,即其前面的字符至少出现1次 | |
\{m\} | 匹配其前的字符m次,精确匹配 | |
\{m,n\} | 匹配其前的字符至少m次,至多n次 | |
\{0,n\} | 匹配其前的字符最多n次 | |
\{m,\} | 匹配其前的字符最少m次 | |
位置锚定 | ^ | 锚定行首,写在模式的最左侧,指定的字符串只能出现在行首 |
$ | 锚定行尾,写在模式的最右侧 | |
^PATTERN$ | 用PATTERN来匹配整行 | |
^$ | 表示空行,连空格都不能包含,不包括任意字符 | |
^[[:spaces:]]* | 表示空行或者包括空白字符的行 | |
\ | 锚定词首 | |
\bPATTERN | 锚定词首 | |
PATTERN\> | 锚定词尾 | |
\ | 精确锚定单词 | |
分组及引用 | \(PATTERN\) | 将一个或者多个字符捆绑在一起,当作一个整体进行处理; |
分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为: \1: 模式从左侧起,第一个左括号以及与之匹配到的右括号之间的字符 \2:模式从左侧起,第二个左括号以及与之匹配到的右括号之间的字符 |
三、扩展正则表达式
类型 | 元字符 | 解释 |
字符匹配 | . | 匹配任意单个字符 |
[] | 匹配指定范围内的任意单个字符 | |
[^] | 匹配指定范围外的单个字符 | |
匹配次数 | * | 匹配其前的字符任意次,0次,1次或者多次 |
.* | 匹配任意长度的任意字符 | |
? | 匹配其前的字符0次或者1次,即其前面的字符可有可元 | |
+ | 匹配其前的字符1次或者多次,即其前面的字符至少出现1次 | |
{m} | 匹配其前的字符m次,精确匹配 | |
{m,n} | 匹配其前的字符至少m次,至多n次 | |
{0,n} | 匹配其前的字符最多n次 | |
{m,} | 匹配其前的字符最少m次 | |
位置锚定 | ^ | 锚定行首,写在模式的最左侧,指定的字符串只能出现在行首 |
$ | 锚定行尾,写在模式的最右侧 | |
^PATTERN$ | 用PATTERN来匹配整行 | |
^$ | 表示空行,连空格都不能包含,不包括任意字符 | |
^[[:spaces:]]* | 表示空行或者包括空白字符的行 | |
\ | 锚定词首 | |
\bPATTERN | 锚定词首 | |
PATTERN\> | 锚定词尾 | |
\ | 精确锚定单词 | |
或 | | | 或,以|为分隔,表示或者为|左边,或者为|右边 C|cat表示C或者cat |
分组及引用 | (PATTERN) | 将一个或者多个字符捆绑在一起,当作一个整体进行处理; |
分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为: \1: 模式从左侧起,第一个左括号以及与之匹配到的右括号之间的字符 \2:模式从左侧起,第二个左括号以及与之匹配到的右括号之间的字符 |
四、 BRE和ERE的区别: 从上面的两个表可以看出基本正则表达式和扩展正则表达式的区别,那就是扩展正则表达式在进行次数匹配和分组时的元字符不再需要\进行转义;另外扩展正则表达式多了一个或的元字符。
五、 练习:前面提到了这么多,一起来练习下吧。
1、显示/proc/meminfo文件中以大写或小写S开头的行;
# grep -i '^s' /proc/meminfo
# grep '^[Ss]' /proc/meminfo
# grep -E '^(S|s)' /proc/meminfo
2、显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;
# grep -v "/sbin/nologin$" /etc/passwd | cut -d: -f
3、显示/etc/passwd文件中其默认shell为/bin/bash的用户; 进一步:仅显示上述结果中其ID号大的用户;
# grep "/bin/bash$" /etc/passwd | sort -t: -k3 -n | tail -1 | cut -d: -f1,7
4、找出/etc/passwd文件中的一位数或两位数;
# grep "\<[0-9][0-9]\?\>" /etc/passwd
# grep "\<[0-9]\{1,2\}\>" /etc/passwd
5、显示/boot/grub/grub.conf中以至少一个空白字符开头的行;
# grep "^[[:space:]]\{1,\}" /boot/grub/grub.conf
6、显示/etc/rc.d/rc.sysinit文件中,以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;
# grep "^#[[:space:]]\{1,\}[^[:space:]]\{1,\}" /etc/rc.d/rc.sysinit
7、找出netstat -tan命令执行结果中以'LISTEN'结尾的行;
# netstat -tan | grep "LISTEN[[:space:]]*$"
8、添加用户bash, testbash, basher, nologin(SHELL为/sbin/nologin),而找出当前系统上其用户名和默认shell相同的用户;
# grep "^\([[:alnum:]]\{1,\}\):.*\1$" /etc/passwd
9、扩展题:新建一个文本文件,假设有如下内容:
He like his lover.
He love his lover.
He like his liker.
He love his liker.
找出其中最后一个单词是由此前某单词加r构成的行。
[root@liuqing tmp]# grep "\(l..e\).*\1" love.txt
10. 显示ifconfig命令输出结果中的IP地址。
~]# ifconfig | grep -E -o "\<([1-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])\>){3}"
六、三个命令的互换
grep -E表示使用扩展正则表达式(egrep), -F表示将模式视为一个固定的字符串(fgrep)
egrep -G表示使用基本正则表达式(grep), -F表示将模式视为一个固定的字符串(fgrep)
fgrep -E表示使用扩展正则表达式(egrep), -G表示使用基本正则表达式(grep)
另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流