在使用linux时,经常需要进行文件查找,找到符合某种条件的某一行,那么就需要用到grep,egrep,fgrep这些强大的命令。

grep,egrep,fgrep简介

grep:(Global search Regular Expression(RE) and Print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来,最常用。

egrep:(extend grep)是grep的扩展 ,使用扩展正则表达式来匹配文本。

fgrep:快速grep,只匹配固定字符串而非正则表达式。

一、grep命令介绍

grep命令:
   grep [OPTIONS] PATTERN [FILE...]
        grep:根据模式搜索文本,并将符合模式的文本显示出来。
            使用基本正则表达式定义的模式来过滤文本命令。
        PATTERN:文本字符和正则表达式的元字符组合而成匹配条件。    
    grep -color #对匹配到的文本着色显示
    grep -v     #显示没有被匹配到的行
    grep -i     #忽略大小写
    grep -n     #显示匹配到的行号
    grep -c     #统计匹配的行数,不显示搜索结果
    grep -o     #仅显示匹配到的字符串
    grep -q     #静默(不显示结果)
    grep -A     #显示搜索行及其向下相邻的n行
    grep -B     #显示搜索行及其向上相邻的n行
    grep -C     #显示搜索行及其向上和向下相邻的n行
    grep -e     #支持多个匹配选项   grep -e     ‘root’ -e ‘bin’ /etc/passwd
    grep -w     #匹配整个单词
    grep -E     #或egrep支持扩展的正则表达式
    grep -F     #或fgrep不支持扩展正则表达式

二、正则表达式元字符

字符匹配:
        .    匹配任意单个字符 
        ( )  匹配方括号括起来的正则表达式群
        []   匹配指定范围内的任意单个字符,其中可用连字符'-'指定字符的范围 
        [^]  匹配指定范围外的任意单个字符 
        [:alnum:] 字母和数字,即0-9,a-b,A-B
        [:alpha:] 代表任何英文大小写字符,即 A-Z, a-z 
        [:lower:] 小写字母 
        [:upper:] 大写字母 
        [:blank:] 空白字符(空格键和[Tab]键) 
        [:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广) 
        [:cntrl:] 控制字符
        [:digit:] 代表数字,即0-9
        [:xdigit:] 代表十六进制的数字类型, 包括0-9,A-F,a-f的数字与字符
        [:graph:] 可打印的非空白字符 
        [:print:] 可打印字符 
        [:punct:] 标点符号
匹配次数: 用在要指定次数的字符后面,用于指定前面的字符要出现的次数 
        *       匹配前面的字符任意次,包括0次 (贪婪模式:尽可能长的匹配 )
        .*      任意长度的任意字符
        \       通常用于打开或关闭后续字符的特殊含义 
        |       或者( 匹配'|'符号前或后的正则表达式)
        \?      匹配其前面的字符0或1次 
        \+      匹配其前面的字符至少1次 
        \{n\}   匹配前面的字符n次 
        \{m,n\} 匹配前面的字符至少m次,至多n次 
        \{,n\}  匹配前面的字符至多n次 
        \{n,\}  匹配前面的字符至少n次
位置锚定:定位出现的位置
        ^ 锚定行首,用于模式的最左侧 ,此字符后面的任意内容必须出现在行首
        $ 锚定行尾,用于模式的最右侧 ,此字符前面的任意内容必须出现在行尾
            ^PATTERN$  用于模式匹配整行
            ^$  空行 
            ^[[:space:]]*$  空白行 
        \< 或 \b 锚定词首,用于单词模式的左侧 ,其后面的任意字符必须最为单词首部出现
        \> 或 \b 锚定词尾,用于单词模式的右侧 ,其前面的任意字符必须最为单词的尾部出现 
            \<PATTERN\> 匹配整个单词

分组
        分组:\(\) 将一个或多个字符捆绑在一起,当作一个整体进 行处理,如:\(root\)\+  
        分组括号中的模式匹配到的内容会被正则表达式引擎记录于 内部的变量中,这些变量的命名方式为: \1, \2, \3, ... 
        
      后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身
        \1 表示引用第一个左括号以及与之对应的右括号所包括的内容
            示例:
                 vi test1.txt 
                 He love his lover.
                 She like her liker.
                 He like his lover.
                 She love her liker.
                 grep '\(l..e\).*\1' test1.txt
         
或者:| 
             示例:
                 a|b: a或b              C|cat: C或cat             \(C|c\)at:Cat或cat

三、扩展正则表达式

egrep = grep -E

egrep [OPTIONS] PATTERN [FILE...]

 扩展正则表达式元字符:

        字符匹配:
        	.  :任意单个字符
        	[] :指定范围内的字符
        	[^]:不在指定范围内的字符
        次数匹配:
        	*:匹配前面字符任意次
        	?: 0或1次
        	+: 1次或多次
        	{m}: 匹配m次
        	{m,n}: 至少m次,至多n次
        位置锚定:
        	^: 锚定行首
        	$: 锚定行尾
        	\<,\b :锚定词首,用于单词模式的左侧 ,其后面的任意字符必须最为单词首部出现\
        	\>/\b :\b 锚定词尾,用于单词模式的右侧 ,其前面的任意字符必须最为单词的尾部出现 
        	分组:
        		() 后向引用:\1,\2...
        或者: |
        		 a|b: a或b              C|cat: C或cat             \(C|c\)at:Cat或cat

 实例一    正则表达式

 1.显示/etc/passwd中的两位或三位数

[root@admin ~]# grep -o '[0-9]\{2,3\}' /etc/passwd

12

10

14


2.显示/etc/passwd中以’r’开头,以’h’结尾的行

[root@admin ~]# grep '^r.*h$' /etc/passwd

root:x:0:0:root:/root:/bin/bash


3.显示/etc/inittable中以一个数字结尾的行

[root@admin ~]# grep '[[:digit:]]$' /etc/inittab

#   5 - X11


4.显示/etc/passwd中root单词

[root@admin ~]# grep '\<root\>' /etc/passwd

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin


5.创建test1.txt文件,

He love his lover.

She like her liker.

He like his lover.

She love her liker.

显示test1.txt中前后单词对照的行(love...love,like...like)

[root@admin ~]# grep '\(l..e\).*\1' test1.txt

He love his lover.

She like her liker.

实例二    扩展正则表达式

1.创建test2.txt文件

cat

Cat

C

China

显示test2.txt中’cat’或’Cat’

[root@admin ~]# egrep '(c|C)at' test.txt

cat

Cat


2.显示/boot/grub/grub.conf文件中以一个或多个空白字符开头的行

[root@admin ~]# egrep '^[[:space:]]+' /boot/grub/grub.conf

root (hd0,0)

kernel /vmlinuz-2.6.32-358.el6.x86_64 ro root=/dev/mapper/vg_zhangshibin-lv_root rd_NO_LUKS rd_NO_MD rd_LVM_LV=vg_zhangshibin/lv_root crashkernel=128M LANG=zh_CN.UTF-8 rd_LVM_LV=vg_zhangshibin/lv_swap  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet

initrd /initramfs-2.6.32-358.el6.x86_64.img


3.ifconfig查询网络信息后显示ip地址,广播地址,子网掩码

[root@admin~]#ifconfig|egrep'(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.){3}\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'

          inet addr:192.168.23.134  Bcast:192.168.23.255  Mask:255.255.255.0

          inet addr:192.168.23.137  Bcast:192.168.23.255  Mask:255.255.255.0

          inet addr:127.0.0.1  Mask:255.0.0.0


4.找出/etc/rc.d/init.d/functions文件中行首为单词(包括下划线)的行,

[root@admin ~]# cat /etc/rc.d/init.d/functions |egrep '^[[:alpha:]]+_+.*'

fstab_decode_str() {

echo_success() {

echo_failure() {                    (多出的省略)    





Logo

更多推荐