上海华东建设发展设计有限公司网站,cms产品,全网营销推广平台,建设银行采购网站首先介绍grep的一些常见用法#xff1a; grep#xff1a;根据模式搜索文本#xff0c;并将符合模式的文本行显示出来。 其基本格式为#xff1a;grep [options] PATTERN [FILE...] 即#xff1a;grep [选项] 匹配模式 [文件...]#xff1b;其中#xff0c;中括号表示该选… 首先介绍grep的一些常见用法 grep根据模式搜索文本并将符合模式的文本行显示出来。 其基本格式为grep [options] PATTERN [FILE...] 即grep [选项] 匹配模式 [文件...]其中中括号表示该选项可省略...表示可以有多个。PATTERN文本字符和正则表达式的元字符组合而成匹配条件。 下面介绍grep匹配模式中常用的几个选项。 grep -i 表示忽略字符的大小写其基本用法为grep -i PATTERN [FILE...]例如匹配/etc/inittab文件中的字母a并忽略其大小写。其代码如下 #grep -i a /etc/inittab 其显示结果如下图将会把所有匹配到的字符a不管是小写还是大写都会先是出来可以看到大写字母也出现但匹配到没有却看不出来。要想看到匹配效果就需要借助下面这个选项了。 grep --color表示匹配到的字符用其他颜色显示出来其基本用法为grep -color PATTERN [FILE...]例如还用上一个文件匹配/etc/inittab文件中的字母a并用其他颜色显示出来。其代码如下 #grep --color a /etc/inittab 其显示结果将会把匹配到的字符a用其他颜色显示出来。如下图所示 要想显示字符a且不管是大写还是小写都显示出来可在命令行输入如下代码 #grep -i --color a /etc/inittab 其显示结果如下图所示可以看到不管是大写还是小写都可以匹配到。 grep -v表示显示没有被模式匹配到的行其用法为grep -v PATTERN [FILE...]例如依然用前面那个文件在文件/etc/inittab中显示没有字符a的行其代码如下 #grep -v a /etc/inittab 其显示结果将会把所有不含字符a的行都显示出来。 grep -A n表示显示匹配到的行及其后面n行其基本用法为grep -A n PATTERN [FILE...]例如在文件/etc/passwd中显示root用户的后4行其代码如下 #grep -A 4 root /etc/passwd 其显示结果如下图 可能有人会问不是显示下面4行么怎么多显示了几行其实该命令只是显示匹配到root字符及其后面4行要想只显示用户为root的后面4行只需锚定词首即可代码及结果如下 #grep -A 4 ^root /etc/passwd grep -B n表示显示匹配到的行及其前面n行其用法为grep -B n PATTERN [FILE...]。例如显示文件/etc/fstab中字符proc的钱4行。其代码如下 #grep -B 4 proc /etc/fstab 其显示结果为 grep -C n表示显示匹配到的行及其该行前后各n行其用法为grep -C n PATTERN [FILE...]。例如显示文件/etc/fstab中字符boot前后各2行。其代码及显示结果如下 #grep -C 2 boot /etc/fstab grep -E表示使用扩展正则表达式相当于egrep其用法跟其他选项配合使用。具体用法不在阐述。 基本正则表达式和扩展正则表达式的异同 先介绍基本正则表达式。基本正则表达式的元字符 .表示任意单个字符 []表示匹配范围内的任意单个字符 [^]表示匹配指定范围外的任意单个字符 字符集和包括[:digit:]表示数字[:lower:]表示小写字母[:upper:]表示大写字母[:punct:]表示标点符号[:space:]表示空格[:alpha:]表示所有字母[:alnum:]表示所有字母和数字。 匹配次数默认为贪婪模式即尽可能长的匹配 *表示匹配其前面的字符任意次 例给一串字符a,b,ab,aab,acb,adb,amnb 如a*b则匹配字符有b,ab,aab .*表示匹配任意长度的任意字符 \表示匹配其前面的字符1次或0次 \{m,n\}表示匹配其前面的字符至少m次至多n次如 \{1,\}表示匹配至少一次 \{0,3\}表示匹配最多三次 位置锚定 ^锚定行首此字符后面的任意内容必须出现在行首如刚刚提到的^root表示该字符必须出 现在行首 $锚定行尾此字符前面的任意内容必须出现在行尾 ^$空白行 \或\b锚定词首其后面的任意字符必须作为单词首部出现 \或\b锚定词尾其后边的任意字符必须作为单词尾部出现 如\root\在整个文件中把root作为整个单词出现词首词尾词中都不行如mroot、rooter、monrooter均将不匹配。 分组\(\) \(ab\)*表示ab整体作为匹配字符且匹配任意次 \(ab\)\{1,\}表示ab整体作为匹配字符且匹配至少一次 \(ab\)表示ab整体作为匹配字符 后向引用 \1匹配第一个左括号以及与之对应的右括号所包括的所有内容 \2匹配第二个左括号以及与之对应的右括号所包括的所有内容 \3匹配第三个左括号以及与之对应的右括号所包括的所有内容 ...... 如新建文件test1其内容如下 He love his lover. She like her liker. He love his liker. She like her lover. He like her. She love he. # grep \(l..e\).*\1 test1表示匹配前面l开头e结尾中间为任意两个字符的组且前后必须相同 # grep l..e test1表示所有的都可以匹配 下面介绍扩展正则表达式。扩展正则表达式的元字符、位置锚定同基本正则表达式相同不同之处在于次数匹配且扩展正则表达式多了|符号。 次数匹配 *表示其前字符任意次 表示其前字符0次或1次 表示匹配其前面的字符至少1次 {m,n}表示至少m次至多n次 |即or例 C|cat 表示匹配C或cat (C|c)at表示以大写或小写c开头的cat #grep -E ‘C|cat’ test5 或者 #egrep ‘C|cat’ test5 egrep的用法除了在匹配次数上与grep不同外其他基本相同且grep -E [options] PATTERN [FILE...] 等同于egrep [options] PATTERN [FILE...] 。 下面给出一些练习题各位可以做些练习题加深一下这些命令的用法。各练习题后面都配有参考答案希望各位能自己先做练习然后再对照答案不要直接看答案那样是没有多少效果的同时也希望各位能多多上机只有勤加练习才能记住各命令的用法。练习题中有些题目会设计到管道的用法不会做的可以先看看管道的用法然后再做这些练习题。 练习一 1、显示/proc/meminfo文件中以不区分大小的s开头的行 # grep ^s /proc/meminfo -i 或者 # grep ^[sS] /proc/meminfo 2、显示/etc/passwd中以nologin结尾的行; # grep nologin$ /etc/passwd 取出默认shell为/sbin/nologin的用户列表 # grep nologin /etc/passwd | cut -d: -f1 取出默认shell为bash且其用户ID号最小的用户的用户名 # grep bash$ /etc/passwd | sort -n -t: -k3 | head -1 | cut -d: -f1 3、显示/etc/inittab中以#开头且后面跟一个或多个空白字符而后又跟了任意非空白字符的行 # grep ^#[[:space:]]\{1,\}[^[:space:]] /etc/inittab 4、显示/etc/inittab中包含了:一个数字:(即两个冒号中间一个数字)的行 # grep :[0-9]: /etc/inittab 5、显示/boot/grub/grub.conf文件中以一个或多个空白字符开头的行 # grep ^[[:space:]]\{1,\} /boot/grub/grub.conf 6、显示/etc/inittab文件中以一个数字开头并以一个与开头数字相同的数字结尾的行 # grep \(^[0-9]\).*\1$ /etc/inittab 练习二 1、找出某文件中的1位数或2位数 # grep \[[:digit:]][[:digit:]]\?\ /etc/inittab 或者 # grep \[0-9]\{1.2\}\ /etc/inittab 2、找出ifconfig命令结果中的1-255之间的整数 # ifconfig | egrep --color \[1-9]\|\[1-9][0-9]\|\1[0-9][0-9]\|\2[0-4][0-9]\|\25[0-5]\ 注该命令显示结果可能会将非整数也显示出来请各位注意系统默认是不识别小数点的所以它会把非整数拆分成两个整数来对待这点还请注意。 3、查找当前系统上名字为student(必须出现在行首)的用户的帐号的相关信息, 文件为/etc/passwd # grep ^student: /etc/passwd 若在找出该用户的ID号则为# grep ^student: /etc/passwd | cut -d: -f3 或者# id -u student 转载于:https://blog.51cto.com/lq2419/1148355