Linux的哲学思想一切皆文件(包括硬件);使用文本文件保存程序的配置数据;掌握一种强大的文本搜索工具将是linux运维人员的的必备技能,grep全称 (Globel Search REgular Expression and Printing out the line)全局搜索正则表达式并匹配到的行打印出来)是Linux系统中一种强大的文本搜索工具,能根据用户指定的文本模式(正则表达元字符以及正常字符组合而成)对目标文件进行逐行搜索,并把匹配到的显示到屏幕;不影响原文件内容;grep家族包括 有grep、egrep和fgrep(fgrep:不支持正则表达式;搜索速度更快)。 egrep表示扩展的grep,比grep支持更多的元字符,
grep 使用格式:
    grep [OPTIONS] PATTERN [FILE...]
    grep  选项  模式  文件
    #grep 在搜索的模式中含有空白字符必须使用引号;单引和双引号都可以;grep模式中如果包含变量的时候必须加双引号
grep 常用选项
     --color[=WHEN], --colour[=WHEN]  : 搜索到匹配的文本时进行语法着色,可将grep --color=auto 定义为alias
        --color=auto : 自动为语法着色
     例子:grep --color=auto "root" /etc/passwd
    -o: 只显示被模式匹配到的内容,而不是整个行
    -i: ignore case,匹配时不区分字符大小写
    -v: 反向选取,显示不能够被模式匹配到的行
    -E:使用扩展的正则表达式
    -A #:匹配到的行时,并显示该行后面的#行(#表示数值)
    -B #:匹配到的行时,并显示该行前面的#行(#表示数值)
    -C # 匹配到的行时,并显示该行前后的各#行(#表示数值)

正则表达式:REGular EXPression REGEXP
    正则表达式是什么? 正则表达又一些是由元字符及正常字符所书写的模式,其中的元字符不表示字符本身的意义,而是用于表达控制或通配等功能;这就是grep的搜索模式(Pattern)做为过滤文本的条件。
正则表达式分为:
  基本正则表达式 : grep
  扩展正则表达式: grep -E, egrep

基本正则表达式元字符:
 字符匹配:(通常只用于匹配单个字符)
    . : 匹配任意单个字符
    [] :  匹配指定范围内的任意单个字符
    [^] :  匹配指定范围外的任意单个字符
    [0-9], [[:digit:]] : 所有数字
    [^0-9], [^[:digit:]] :  出数字以外的其他字符
    [a-z], [[:lower:]] :所有的小写字母
    [A-Z], [[:upper:]] :所有的大写字母
    [a-zA-Z], [[:alpha:]] :所有的字母
    [0-9a-zA-Z], [[:alnum:]]  : 所有的数字和字母
    [[:space:]] : 空白字符
    [[:punct:]] : 所有标点符号

显示 /etc/rc.d/rc.sysinit  文件中,以大写C或c后面跟了a的行

# grep '[cC]a' /etc/rc.d/rc.sysinit

显示 /etc/rc.d/rc.sysinit  文件中,以大写N或小写n后面跟任意单个字符的行

# grep '[Nn].' /etc/rc.d/rc.sysinit

显示 /etc/rc.d/rc.sysinit  文件中,以大写N或小写n后面跟一个非字母的行

# grep '[Nn][^[:alpha:]]' /etc/rc.d/rc.sysinit

次数匹配:在期望匹配字符后面提供一个控制符,用于表达匹配其前面字符指定的次数
    *  : 匹配其前字符任意长度,表示0次、1次或多次;
    .* : 任意长度的任意字符;此时工作于贪婪模式(尽可能长的匹配)
    \? :匹配其前字符0次或1次;(表示其左侧字符可有可无)
    \+ : 匹配其前字符1次或多次;(表示其左侧字符至少出现1次)
    \{m\} :表示其前字符精确出现m次;
    \{m,n\} :其前字符至少出现m次,最多出现n次;
    \{0,n\} :其前字符至多出现n次;
    \{m,\} :其前字符至少出现m次
 
显示/etc/passwd中,roo后跟了t,t只出现0次或一次的行

# grep "root\?" /etc/passwd

显示/etc/passwd中,r后跟了o后跟了t,o至少出现1次的行

# grep "ro\+t" /etc/passwd

显示/etc/passwd中,r后跟了o,o只出现2次的行

# grep --color "ro\{2\}" /etc/passwd

显示/etc/passwd中,r后跟了o,o出现至少1次至多2次的行

# grep --color "ro\{1,2\}" /etc/passwd

位置锚定:
    ^: 锚定行首;使用格式:^WORD
    $: 锚定行尾;使用格式:WORD$
    ^PATTERN$:用模式来匹配整行;
    ^$ : 匹配空白行(空白行不等同于空白字符行);
    单词锚定 :由非特殊字符组成的连续的字符串
    \< :锚定词首,也可用\b ;使用格式: \<PATTERN 或\bPATTERN
    \> :锚定词尾,也可以用\b ;使用格式: PATTERN\>或PATTERN\b
    \<PATTERN\>:匹配PATTERN能匹配到的整个单词
分组:\(\)
    注意:分组中的模式,在某次的具体匹配过程中所匹配到的字符,可以被grep记忆(保存于内置的变量中,这些变量是\1, \2, ...),因此,还可以被引用;
    \1: 引用,模式中自左向右,由第一个左括号以及与之对应的右括号中的模式所匹配到的内容;
    \2: 引用 ,模式中自左右,由第二个左括号以及与之对应的右括号中的模式所匹配到的内容
显示/etc/passwd文件,以sh开头的行

# grep "^sh" /etc/passwd

显示/etc/passwd文件,以sh开头中间跟了任意字符后以sh结尾的行

# grep "^sh.*sh$" /etc/passwd

显示/etc/rc.d/rc.sysinit 文件,以空白字符开头,空白字符出现任意次的行

# grep "^[[:space:]]*$" /etc/rc.d/rc.sysinit

显示/etc/rc.d/rc.sysinit 文件,空白行(行中不包含任意字符的行)

# grep "^$" /etc/rc.d/rc.sysinit

显示/etc/passwd文件,以sh作为单词词首的行

# grep "\<sh" /etc/passwd #等同于 # grep "\bsh" /etc/passwd

显示/etc/passwd文件,以sh作为单词词尾的行

# grep "sh\>" /etc/passwd #等同于 # grep "sh\b" /etc/passwd

从ifconfig命令结果中取得两位的数字

# ifconfig | grep "\<[[:digit:]]\{2\}\>"

显示/etc/rc.d/rc.sysinit 文件中以大写N或小写n后面了跟了任意个非字母的行

# grep "[Nn][^[:alpha:]]*" /etc/rc.d/rc.sysinit

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

# grep "^[sS]" /proc/meminfo
# grep -i "^s" /proc/meminfo

显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;

# grep -v "/sbin/nologin$" /etc/passwd | cut -d: -f1

显示/etc/passwd文件中其默认shell为/bin/bash的用户;

# grep "/bin/bash$" /etc/passwd | cut -d: -f1

找出/etc/passwd文件中的一位数或两位数;

# grep "\<[0-9]\{1,2\}\>" /etc/passwd

显示/boot/grub/grub.conf中以至少一个空白字符开头的行;

# grep "^[[:space:]]\+" /boot/grub/grub.conf

显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;

# grep "^#[[:space:]]\+[^[:space:]]\+" /etc/rc.d/rc.sysinit

打出netstat -tan命令执行结果中以‘LISTEN’,后或跟空白字符结尾的行;

# netstat -tan | grep "LISTEN[[:space:]]*$"

添加用户bash, testbash, basher, nologin (此一个用户的shell为/sbin/nologin),而后找出当前系统上其用户名和默认shell相同的用户的信息;

# useradd -s /sbin/nologin nologin <--指定nologin用户的默认shell 为/sbin/nologin
# grep "^\([[:alnum:]]\+\>\).*\1$" /etc/passwd
# grep "^\(.*\):.*\1$" /etc/passwd

扩展的正则表达式:
字符匹配:(和基本正则表达式表示的含义一直)
    . : 匹配任意单个字符
    [] :匹配指定范围内的任意单个字符
 [^] :匹配指定范围外的任意单个字符
次数匹配:
    *: 匹配其前字符任意长度,表示0次、1次或多次;
    ?:匹配其前字符0或1次
    +: 匹配其前字符至少1次
    {m}:精确匹配匹配其前字符m次;
    {m,n}:匹配其前字符至少m次,至多次;
    {m,}:匹配其前字符至少m次;
位置锚定:
    ^ :锚定行首;使用格式:^WORD
    $ :锚定行尾;使用格式:WORD$
    \<, \b :锚定词首,也可用\b ;使用格式: \<PATTERN 或\bPATTERN
    \>, \b :锚定词尾,也可以用\b ;使用格式: PATTERN\>或PATTERN\b
分组:\(\)
    注意:分组中的模式,在某次的具体匹配过程中所匹配到的字符,可以被grep记忆(保存于内置的变量中,这些变量是\1, \2, ...),因此,还可以被引用;
    \1: 引用,模式中自左向右,由第一个左括号以及与之对应的右括号中的模式所匹配到的内容;
    \2: 引用 ,模式中自左右,由第二个左括号以及与之对应的右括号中的模式所匹配到的内容
或者:
    a|b:a或者b
    或者是匹配|两侧的所有内容;

支持扩展的正则表达式命令:grep -E PATTERN FILE... ;egrep PATTERN FILE...

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

# echo /etc/rc.d/init.d/functions | grep -o -E "[[:alnum:]]+/?$" | cut -d/ -f1

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

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

写一个模式,能匹配合理的IP地址;
1.0.0.1 -- 239.255.255.255

# grep -E "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-3][0-9])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"
# grep -E "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-3][0-9])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>" ip.txt