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