文本搜索工具:Grep及正则表达式
globbing:文件名通配,即限定时间,又限定次数;
*:匹配任意长度的任意字符;
?:匹配任意单个字符;
[]:指定范围内的任意单个字符;[a-z],所有字母,不区分大小写;
[^]:指定范围外的任意单个字符
grep命令: Globalsearch Regular expression and Print out the line
以行为单位进行文本处理
模式(pattern):以正则表达式的元字符和正常字符组成
grep [OPTIONS] PATTERN [FILE]…
--color[=always,auto,never]
效果: grep –color=auto“root” /etc/passwd
aliasgrep=”grep –color=auto”,可以写到配置文件中,永久保存,位置 /etc/bahsrc;
-o:only,只显示被匹配到的行
-i:ignore case,忽略大小写
-v:显示不能被模式匹配到的行
-E:使用扩展的正则表达式;
-A #:after,显示匹配到的行及后面#行;
-B #:before,显示匹配到的行及前面#行;
-C#:context,显示匹配到的行及前后#行
正则表达式:Regular EXPression ,REGEXP。默认工作在贪婪模式下,匹配所有能匹配到的内容,在数据量较大的情况下,速度较慢
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相同的用户的信息;
#Useradd bash
#Useradd testbash
#Useradd basher
#Useradd –s nologin nologin
#grep “^\([[:alnum:]\+]\>\).*\1$” /etc/passwd
扩展正则表达式:grep -E; egrep。不需要转义;
字符匹配:
. :任意单个字符
[]:范围内的任意单个字符
[^]:范围外的任意单个字符
次数匹配:
*:任意单个字符任意次
?:0或1 次
+:1次或多次
{m,n}:至少m次,至多n次
{m}:m次
{m,}:至少m次
{0,n}至多n次
位置锚定:
^:锚定句首
$:锚定句尾
\<,\b:锚定词首
\>,\b:锚定词尾
分组及后向引用:
():
\1,\2,\3…:
| :或者,两侧所有内容;
abc|Cbaèabc或Cba
ab(c\C)baèabcba或abCba
练习:
1、显示当前系统上root、fedora或user1用户的默认shell;
# grep -E"^(root|fedora|user1)\>" /etc/passwd | cut –d”:” -f7
2、找出/etc/rc.d/init.d/functions文件中某单词后面跟一组小括号的行,形如:hello();
# grep -o-E "\<[[:alnum:]]+\>()" /etc/rc.d/init.d/functions
3、使用echo命令输出一个绝对路径,使用grep取出其基名;扩展:取出其路径名
#ls /etc/init.d/*|egrep -o "\<[^/]+/?$"
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])\>"
5、挑战题:写一个模式,能匹配合理的IP地址;
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}.[0-9]{1,3}"
6、挑战题:写一个模式,能匹配出所有的邮件地址;
#grep -o -E"\<([[:alnum:]]{0,}[[:punct:]]{0,}[[:alnum:]]{0,})@([[:alnum:]]{0,}[[:punct:]]{0,})\.([[:alnum:]]{0,}[[:punct:]]{0,})\>"
fgrep:完全不支持正则表达式,只能匹配字符,但速度快。在文件较大,而且
不需要正则时,建议使用。