1.grep命令
grep命令的名称是来自于全局搜索正则表达式并打印文本行(Global Search Regular Expression and Print out the line)的缩写。
语法如下
grep [options] pattern [file…]
options:表示选项。
pattern:要匹配的模式。
file:表示一系列的文件名。
1.1 选项-i:忽略大小写
-q:结果不显示。
-c:接数字,列出该文件的第几行。 grep -c ftp.so /usr/local/webserver/php-5.2.4/lib/php.ini
-v:反向选择。找出没有关键字的那一行。
-h:当搜索多个文件的时候,不显示文件的前缀。
-l:只列出含有匹配文件行的文件名,不显示具体内容。
-n:显示行号和所有文本行。
-s:不显示错误信息。
-w:匹配整个单词
-x:匹配整个文本行。
-r:递归搜索,不仅搜索当前目录,还会搜索各级子目录。
-b:打印匹配文本行到文件头的偏移量,以字节为单位。
-A:后面跟数字,过滤出符合要求的行以及下面n行。
-B:后面跟数字,过滤出符合要求的行以及上面n行。
-C:后面跟数字,过滤出符合要求的行以及上和下面n行。
-E:支持扩展正则表达式。同egrep
-P:支持Perl正则表达式。
-F:不支持正则表达式,以字面意思匹配。--color=aoto:关键字加上颜色显示。
2. grep字符集
同正则:元字符 正则的特殊符号符号意义例子
^锚定行的开始"^grep"就是grep开头的行
$锚定结尾"grep$"就是grep结尾的行
.非换行符的任意一个字符"gr.p"就可以匹配到"grep,grap"
*零个或多个前字符"gr*p"就可以匹配到"grp,grrp,grrrp"
[]范围内的一个字符"[Gg]rep"就可以匹配到"Grep,grep"
[^]取非"[^a-yA-Z]"就可以匹配到z
\(..\)标记匹配字符"\(oo\)"就可以匹配到包含oo的行
\
\>锚定单词结尾"grep\>"就可以匹配到grep结尾的单词
x\{m\}匹配重复字符x,m次"g\{2\}"匹配连续两个g的行
x\{m,\}匹配重复字符x,m次或以上"g\{2,\}"匹配到"gg,gggrep"
x\{m,n\}品牌重复字符x,m到n次之间"g\{2,5\}"匹配到2到5次g的行
\w零个或多个文字和数字[0-9a-zA-Z]"g\wp"匹配到"grep"
\W一个或多个非单纯数字字符如 ", ."等
\b单词锁定"\bgrep\b"只匹配grep
egrep grep -E字符集RE字符意义例子
+1个或多个前一个字符"g+rep" 匹配到"ggrep。gggrep"
?0个或1个前面的字符"g?rep"匹配到"grep。ggrep"
|用或的方式找出字符串"gr(a
()找出字符组"gr(ee){2,5}p"匹配到greeeep,greeeeeep.或(rr)+
3. 范例
3.1 选取将last有出现root的行取出来。
last |grep 'root'
将last没有出现root的行取出来。
last |grep -v 'root'
将last有出现root的行取出来,只显示第一列。
last |grep 'root' |cut -d ' ' -f 1
3.2查找关键字找出filename文件中 含有abc的行。
grep 'abc' filename
承上,显示行好,和颜色。
grep -n --color=auto 'abc' filename
承上,把关键字所在行前三行,后两行打印出来。
grep -n --color=auto -A2 -B3 filename
找出不含有abc关键字的行。
grep -vn 'abc' filename
忽略大小写,找出包行abc的行
grep -in 'abc' filename
3.3 利用 [] 来查找关键字找出 abc aecd的行。
grep -n 'a[be]c' filename
找到不是 bc前面不是a的行。
grep -n [^a]bc' filename
找到bc前面不是小写字符的行。
grep -n [^a-z]bc' filename
找到含有数字的行。
grep -n '[0-9]' filename
grep -n [[:digit:]] filename
3.4 开头与结尾符号^$找到以a开头的行。
grep -n '^a' filename
找到以小写字母开头的行。
grep '-n ^[a-z]' filename
找到不是以字母开头的行,
grep -n '^[^a-zA-Z]' filename
找到以 . 结尾的行。
grep -n '\.$' filename
. 有特殊含义必须转义成普通字符。
找出空白行。
grep -n '^$' filename
不显示空白行和#开头的行
grep -vn '^$' filename | grep -vn '^#'
3.5 任意一个字符 . 重复字符*找出g??d的字符串。
grep -n 'g..d' filename
找出至少oo的字符串。
grep -n 'ooo*' filename
*表示0个或多个*前面一个字符。
找出o与o之间任意个任意字符的字符串。
grep -n 'o.*' filename
3.6 使用限定连续RE字符范围{}找出连续两个o的行。
grep -n 'o\{2\}' filename
找出g后面2-5个o,再接个g的字符串。
grep -n 'go\{2,5\}g' filename
找出2个或以上的o的字符串。
grep -n 'o\{2,\}' filename