GREP命令与正则表达式

前端之家收集整理的这篇文章主要介绍了GREP命令与正则表达式前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

文本搜索工具: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位于词尾,如ro\b,以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

abc\Cbaè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:完全不支持正则表达式,只能匹配字符,但速度快。在文件较大,而且

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

猜你在找的正则表达式相关文章