加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

GREP命令与正则表达式

发布时间:2020-12-13 22:32:36 所属栏目:百科 来源:网络整理
导读:文本搜索工具: Grep 及正则表达式 globbing :文件名通配,即限定时间,又限定次数; * :匹配任意长度的任意字符; 650) this.width=650;" width="554" height="46" src="http://img.jb51.cc/vcimg/static/loading.png" style="background:url(/e/u261/lan

文本搜索工具:Grep及正则表达式

  1. globbing:文件名通配,即限定时间,又限定次数;

*:匹配任意长度的任意字符;

spacer.gif

?:匹配任意单个字符;

spacer.gif

[]:指定范围内的任意单个字符;[a-z],所有字母,不区分大小写;

spacer.gif

[^]:指定范围外的任意单个字符

  1. grep命令: Globalsearch Regular expression and Print out the line

以行为单位进行文本处理

模式(pattern):以正则表达式的元字符和正常字符组成

grep [OPTIONS] PATTERN [FILE]…

--color[=always,auto,never]

效果: grep ?color=auto“root” /etc/passwd

spacer.gif

aliasgrep=”grep ?color=auto”,可以写到配置文件中,永久保存,位置 /etc/bahsrc

-o:only,只显示被匹配到的行

spacer.gif

-i:ignore case,忽略大小写

spacer.gif

-v:显示不能被模式匹配到的行

-E:使用扩展的正则表达式;

-A #:after,显示匹配到的行及后面#行;

spacer.gif

-B #:before,显示匹配到的行及前面#行;

spacer.gif

-C#:context,显示匹配到的行及前后#

spacer.gif

  1. 正则表达式:Regular EXPression REGEXP。默认工作在贪婪模式下,匹配所有能匹配到的内容,在数据量较大的情况下,速度较慢

  2. a)基础正则表达式:grep

元字符:大部分需要转义

字符匹配:

. :匹配任意单个字符;

[]:匹配指定范围内的任意单个字符

[^]:匹配指定范围外的任意单个字符

字符集:

[0-9];[[:digit:]]:数字

[a-z];[[:lower:]]:小写字母;

[A-Z];[[:upper:]]:大写字母;

[[:space:]]:空格

[[:punct:]]:特殊字符

[0-9a-zA-Z],[[:alnum:]]:数字和字母

[a-zA-Z];[[:aipha:]]:所有字母

次数匹配:

*:任意单个字符

.: .* :任意字符

?:匹配其前面字符0次或1次;

+:匹配其前面字符1次或多次(至少一次);

{m,n}:匹配其前面字符至少m次,至多n次;

{m}:精确匹配其前面字符m次;

{0,n}:匹配其前面字符最少0次,最多n次;

{m,}:匹配其前面字符最少m次;

位置锚定:

^:句子锚定,锚定句首

$:句子锚定,锚定句尾

^PATTERN$:匹配整个句子

^$:空白行

&;,b:单词锚定,锚定词首【不属于转义】【b位于词首,如bro,以ro开头的单词】

&;,b:单词锚定,锚定词尾,【不属于转义】【b位于词尾,如rob,以ro结尾的单词】

&;PATTERN&;:精确匹配单词,

PATTERN&;:PATTERN结尾的单词;

&;PATTERN:以PATTERN开头的单词;

分组及后向引用:

(PATTERN):分组,匹配整组字符;

|:或者

1,2,3…:后向引用,引用前面的第1,2,3个分组

练习:

1、显示/proc/meminfo文件中以大写或小写S开头的行;用两种方式;

#grep ?i“^s” /proc/meminfo

#grep “^[sS]” /proc/meminfo

2、显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;
#grep?v“nologin$”/etc/passwd
3、显示/etc/passwd文件中其默认shell为/bin/bash的用户;
#grep“bash$”/etc/passwd
4、找出/etc/passwd文件中的一位数或两位数;
#grep“&;[0-9]{1,2}&;”/etc/passwd
#grep“&;[0-9][0-9]?&;”/etc/passwd
5、显示/boot/grub/grub.conf中以至少一个空白字符开头的行;
#grep“^[[:space:]]+”/boot/grub/grub.conf
6、显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;
#grep“^#[[:space:]]+[^[:space:]]”/etc/rc.d/rc.sysinit
7、打出netstat-tan命令执行结果中以‘LISTEN’,后或跟空白字符结尾的行;
#netstat?tan|grep“LISTEN[[:space:]+]?$”
8、添加用户bash,testbash,basher,nologin(此一个用户的shell为/sbin/nologin),而后找出当前系统上其用户名和默认shell相同的用户的信息;
#Useraddbash
#Useraddtestbash
#Useraddbasher
#Useradd?snologinnologin
#grep“^([[:alnum:]+]&;).*1$”/etc/passwd

  1. 扩展正则表达式:grep -E; egrep。不需要转义;

字符匹配:

. :任意单个字符

[]:范围内的任意单个字符

[^]:范围外的任意单个字符

次数匹配:

*:任意单个字符任意次

?:01

+:1次或多次

{m,n}:至少m次,至多n

{m}m

{m,}:至少m

{0,n}至多n

位置锚定:

^:锚定句首

$:锚定句尾

&;,b:锚定词首

&;,b:锚定词尾

分组及后向引用:

():

1,3…:

| :或者,两侧所有内容;

abc|CbaèabcCba

abcCbaèabcbaabCba

练习:

1、显示当前系统上rootfedorauser1用户的默认shell

# grep -E"^(root|fedora|user1)&;" /etc/passwd | cut ?d”:” -f7

spacer.gif

2、找出/etc/rc.d/init.d/functions文件中某单词后面跟一组小括号的行,形如:hello()

# grep -o-E "&;[[:alnum:]]+&;()" /etc/rc.d/init.d/functions

spacer.gif

3、使用echo命令输出一个绝对路径,使用grep取出其基名;扩展:取出其路径名

#ls /etc/init.d/*|egrep -o "&;[^/]+/?$"

spacer.gif

4、找出ifconfig命令结果中的1-255之间数字;

#ifconfig | grep -E "&;([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])&;"

spacer.gif

5、挑战题:写一个模式,能匹配合理的IP地址;

  1. 0.0.1-- 239.255.255.255

#ifconfig | grep -E "&;([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-3][0-9])&;.[0-9]{1,3}.[0-9]{1,3}"

spacer.gif

6、挑战题:写一个模式,能匹配出所有的邮件地址;

#grep -o -E"&;([[:alnum:]]{0,}[[:punct:]]{0,}[[:alnum:]]{0,})@([[:alnum:]]{0,}).([[:alnum:]]{0,})&;"

spacer.gif

  1. fgrep:完全不支持正则表达式,只能匹配字符,但速度快。在文件较大,而且

不需要正则时,建议使用。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读