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开头的单词 |
\> | 锚定单词结尾 | "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