linux_grep

1.1. 匹配器选择:

-E, 扩展正则表达式
    将 模式解释为扩展正则表达式(-E 使用的时POSIX )
-F , 固定字符串,固定表达式
    将模式解释成为固定的字符串列表,指定的字符串都要匹配.
-G ,基本的正则表达式
    将模式解释成一个基本的正则表达式.
-P ,perl-方式的正则表达式

1.2. 匹配控制:

-e PATTERN, --regexp=PATTERN
    使用模式作为表达式.可以用来指定多个搜索模式.(POSIX 规范).
-f FILE, --file=FILE
    从文件中获取 表达式,每行一个.空文件包含零模式,因此不匹配任何内容.(POSIX 规范)
-i, --ignore-case
    忽略模式和输入文件中的大小写差别(POSIX 规范)
-v, --invert-match
    选择不匹配的项 .(POSIX 规范)
-w, --word-regexp
    只选择包含整个单词的匹配行.单词只能是字母,数字和下划线.
-x, --line-regexp
    筛选完全匹配的匹配项(面向行)
    [vim@dbserver grep]$ grep  -x 'The penny farthing is 10 paces ahead of Waldo.' *.txt 
goldrush.txt:The penny farthing is 10 paces ahead of Waldo.

-y     Obsolete synonym for -i.
    和i 一样的功能

1.3. 输出控制:


-c, --count
    抑制正常输出,打印每个文件的匹配行数,使用-v 将计算不匹配的行数.(POSIX)


--color[=WHEN], --colour[=WHEN]
    使用不同的颜色显示匹配项.

-L, --files-without-match
    抑制正常输出,打印每个输入文件的名称,但是只是到第一个匹配之后,扫描就会停止

-l, --files-with-matches
    抑制正常输出,打印每个输入文件的名称,但是只是到第一个匹配之后,扫描就会停止

-m NUM, --max-count=NUM
    匹配个数最大限定,如果达到了最大值则停止读取文件.如果输入是一个常规文件,且
    那么grep将确保标准输入定位到退出前最后匹配行之后的位置,而不管是否存在尾随上下文行。这使调用进程能够恢复搜索。当grep在NUM匹配行之后停止时,它输出任何尾随的上下文行 .
    使用-c 或者count 选项时,grep 输出计数不会大于NUM,使用-v 选项时`,grep 在输出第一个不匹配的项目之后停止.

-o, --only-matching
    只打印匹配行中匹配的部分(非空,只把匹配字段输出,并不是把行输出),将匹配的部分放再单独的输出行中.

-q, --quiet, --silent
    静默方式,不向标准输出写入任何内容,如果找到匹配先,立即退出,退出码为0,检测到错误也是如此.(POSIX)

-s, --no-messages
    抑制文件不存在,或者不可读的错误消息.一致性注意:第7版的unix grep 不符合POSIX ,因为缺少-q,USG风格grep 也缺少-q,但-s 选项表现的想GNU grep .

1.4. 输出行前缀控制

-b, --byte-offset
    打印匹配当前行的前几行.

-H, --with-filename
    打印每个匹配项的文件名,搜索多个文件的默认值.

-h, --no-filename
    禁止输出文件名,当只有一个文件或者标准输入时搜索的时候,是默认值.

--label=LABEL
    将来自标准输入的显示为来自标签输入.--label 将会给标准输入一个文件名.
    eg1 :gzip  -cd foo.gz | grep --label=foo -H something.  See also the -H option.
    eg2:
        [vim@dbserver grep]$ cat *.txt | grep -H --label=txt Waldo 
        txt:Waldo is beside the boot counter.
        txt:Waldo is studying his clipboard.
        txt:The penny farthing is 10 paces ahead of Waldo.

-n, --line-number
    在匹配的每一行 ,打印上下文 为几行.并显示行号.

-T, --initial-tab
    使用制表符规范输出结果.
    eg:
    [vim@dbserver grep]$ grep -T  Waldo *.txt   
    department-store.txt   :Waldo is beside the boot counter.
    goldrush.txt   :Waldo is studying his clipboard.
    goldrush.txt   :The penny farthing is 10 paces ahead of Waldo.

-u, --unix-byte-offsets
    unix 风格的字节偏移量.

-Z, --null
    输出一个零字节(ASCII NULL 字符),这个选项使输出没有起义.即使存在包含不寻常的字符(如换行)的文件名.

1.5. 文本控制

-A NUM, --after-context=NUM
    打印匹配行之前的多少行.(-o 没有效果,并会发出警告)

-B NUM, --before-context=NUM(-o 没有效果,并会发出警告)
    打印匹配行之后的多少行

-C NUM, -NUM, --context=NUM(-o 没有效果,并会发出警告)
    打印出输出上下问的行数.

--group-separator=SEP
    使用SEP作为分割符,默认的分割符为(--). 
--no-group-separator
    使用空字符串作为分割符.

1.6. 选则文件目录

-a, --text
    处理文本一样处理二进制文件.

--binary-files=TYPE
    如果文件的前几个字节表示该文件包含二进制数据,则假定该文件类型为type ,默认情况下type 是二进制的,grep 通常输出一行消息,说明二进制匹配,如果没有匹配,则不输出消息.如果类型不匹配,

-d ACTION, --directories=ACTION
    如果输入文件是一个目录,则-d 选项可以处理对于目录的动作.默认情况下ACTION是`read`目录,如果ACTION是`skip`则跳过目录.如果递归的,则ACTION 是 `recurse`.这个选项等价于`-r` 选项

--exclude=GLOB
    排除于GLOB 匹配的文件(是哟个通配符),文件名GLOB 可以使用 * , ? and [...] 作为通配符.

--exclude-from=FILE
    排除从文件中读取的全局匹配的文件(可以使用通配符)

--exclude-dir=DIR
    递归搜索中排除与模式DIR 匹配的目录.

-I     
    处理二进制文件.

--include=GLOB
    包含所有GLOB 匹配的文件(使用通配符),文件名GLOB 可以使用*, ? and [...] 为通配符.

-r, --recursive
    递归按照符号链接读取每个目录下的所有文件.

-R, --dereference-recursive
    递归的读取每个目录下的所有链接,包括符号链接.

1.7. 正则表达式

1.7.1. 字符类和括号表达式

括号表达式 使用[ 和] 字符列表.意义是匹配列表中的任何一个字符;
如果列表第一个是^ 符号,那么他是不匹配列表中的任何一个字符;
例如: [0123456789] 匹配任何的单个数字.

括号表达式中,范围表达式为连接字符组成,匹配两个字符之间的排序的任何单个字符.
例如:

[a-d]: 等价语[abcd]

括号表达式预定义了一些指定的字符类:
例如:

[:alnum:]:字母和数字,

表达式 示意
[:alpha:] 匹配当前归类中的大写和小写字母字符。例如,'[0-9]{3}[[:alpha:]]{2}' 匹配三个数字,后跟两个字母
[:alnum:] 匹配当前归类中的数字、大写和小写字母字符。例如,'[[:alnum:]]+' 匹配含有一个或多个字母和数字的字符串。
[:cntrl:] 匹配顺序值小于 32 或字符值为 127 的 ASCII 字符(控制字符)。控制字符包括换行符、换页符、退格符,等等
[:digit:] 匹配当前归类中的数字。例如,'[[:digit:]-]+' 匹配含有一个或多个数字或横线的字符串。同样,'[^[:digit:]-]+' 匹配含有一个或多个不是数字或横线的字符的字符串。
[:graph:] 匹配打印字符。[[:graph:]] 等效于 [[:alnum:][:punct:]]
[:lower:] 匹配当前归类中的小写字母字符。例如,'[[:lower:]]' 不匹配 A,因为 A 为大写。
[:print:] 匹配打印字符和空格。[[:print:]] 等效于 [[:graph:][:whitespace:]]
[:punct:] 匹配其中一个字符: !"#$%&'()*+,-./:;<=>?@[\]^_`{
[:space:] 匹配单个空格 (' ')。例如,以下语句搜索 Contacts.City 以查找任何名称为两个词的城市:
[:upper:] 匹配当前归类中的大写字母字符。例如,'[[:upper:]ab]' 与以下其中一项匹配:任何大写字母、a 或 b。
[:xdigit:] 匹配字符类 [0-9A-Fa-f] 中的字符。

1.7.2. 定位符号

插入符号^ 和$ 都是元字符,匹配行首和空字符串.

1.7.3. 反斜杠的特殊表达式

< 匹配单词开头和结尾空字符串.\b 匹配单词边缘的空字符串.\w 是 [[:alnum:]] 的同义词,\W 是[^[:alnum:]] 同义词.

1.7.4. 重复匹配

符号 匹配意义
? 匹配0 次和 1 次
* 匹配0次和多次.
+ 匹配一次或多次.
刚好匹配 n 次.
匹配n 次或更多次.
最多匹配m次.
最少匹配n次,但最多匹配m次.

1.7.5. 优先级

重复优先于连接,连接优先于 | (或 ),使用() 来改变优先级.

1.7.6. 匹配引用

使用 \n 用来 引用前面的第n 个() 表达式匹配的字符串.

1.7.7. 基本正则表达式和 扩展正则表达式

在 基本正则表达式中 :元字符: ?, + ,{, | , ( 和) 失去了特殊含义,如果想使用,则需要前面加上反斜杠. \?, \+, \{, \|, \(, and \).
传统的egrep 不支持 { 元字符,而 egrep 支持 \{ ,可移植的脚本应该避免使用 { ,应该使用 [{] 匹配文字.
GNU grep -E试图支持传统用法,如果{是一个无效区间规范的开始,。
例如,命令
grep -E '{1'搜索双字符串{1,而不是报告正则表达式中的语法错误。POSIX允许这种行为作为扩展,但是可移植脚本应该避免这种情况.

grep -C 5 foo file 显示file文件里匹配foo字串那行以及上下5行
grep -B 5 foo file 显示foo及前5行
grep -A 5 foo file 显示foo及后5行

查看grep版本号的方法是

grep -V

grep 指定行输出

grep -vE 'Database|^$|colname' 

grep -vE 'Database|^$|colname|SELECT|WHERE|AND|FROM'