名称
grep - 打印匹配的行
语法:
grep [option] pattern [file...] grep [option] [-e pattern] | -f file [file]
简介
grep 就是从文件或者标准输入中搜索你给的样式,默认把匹配到的行打印下来。
除grep外,还有其他两个程序可以用,egrep和fgrep。egrep等同于grep -E,frep等同于grep -F。直接使用egrep和fgrep的方法被丢弃了,提供这两个命令时是为了和历史版本相兼容。
选项(option)
--help 输出帮助信息 -V ,--version 打印grep 的版本号
选择匹配类型:(Macher Selection)
-E ,--extended-regexp , 模式是一个扩展正则表达式 -F ,--fixed-strings , 模式是一个由断行符分隔的定长字符串 -G,--basic-regexp , 模式是基本正则表达式,默认就是这 -P,--perl-regexp , 模式是perl正则表达式
匹配控制:
-e pattern ,--regexp=pattern , 使用pattern作为匹配操作。指定多次匹配操作 -f file,--file=file 从文件中获得匹配模式 -i ,--ignore-case 在输入的文件和匹配模式中都忽略大小写, -v,--invert-match 打印不匹配的行 -w,--word-regexp , 强制匹配仅完全匹配单词, 单词必须和匹配内容一样才打印 -x,--line-regexp , 强制模式匹配一行,文件里面行的内容必须和匹配模式一样才打印
[object Object] [object Object] [object Object] [object Object]
一般输出控制:
-c,--count , 不输出匹配的内容,仅仅打印匹配到的行数,和-v一块使用,就是打印没匹配的行数 --color[= WEHN], 带颜色在终端打印匹配的内容,颜色通过环境变量GREP_COLORS定义, WEHN可以是never,auto,和always -L,--files-without-match 只显示不匹配的文件名 -l,--files-with-match 只显示匹配的文件名 -o ,--only-matching 打印仅仅匹配到的部分。 -q ,--quiet,--silent 安静模式,不输出任何内容,如果有匹配内容,退出状态码为0, -s ,--no-messages 不输出错误信息。 更好的的做法是不使用-q和-s,而是重定向到/dev/null 中
输出行前缀控制:
-b,--byte-offset 在输出的每一行之前显示包含字符串的行的文件中的字节偏移量,在这里是行偏移量 -H,--with-filename 打印每次匹配到的文件名,这是默认选项当很多文件要匹配时 -h ,--nofilename , 当只有一个文件匹配时,不打印文件名,这是默认选项。 -n,--line-number , 打印匹配到的行号
输出上下文的行控制
-A num ,--after-context=NUM 打印匹配到行的后面NUM行,多次模式匹配中间以 -- 分隔 -B num ,--before-context=NUM 打印匹配的行之前的NUM行放一个行包含一个组分隔符 (--)在接下来的匹配组中。如果指定了-o选项,这个选项就没有一样了,同时会给一个警告 -C NUM,--context=NUM, 打印匹配行的上下NUM行
文件和目录选择:
-a,--text 加工二进制文件当成文本文件处理。这个选项等同于--binary-files=text --binary-files=TYPE -D ACTION ,--device=ACTION 如果输入文件是一个设备文件,FIFO,或者套接字文件,使用ACTION处理它,默认的ACTION是读,也就是说设备文件当成一般文件看待,如果ACTION是skip,设备文件会被跳过。 -d ACTION,--directores=ACTION 如果输入文件是一个目录 ,使用ACTION去处理这个目录,默认的ACTION是读,也就是把目录当成一般文件来读。如果ACTION是skip,目录会被跳过, 如果ACTION是recurse,grep会递归的读取所有的文件在每一个目录下面 --exclude=GLOB 跳过文件匹配GLOB,文件名GLOB可以是*,?,和[..] ,也可以是\ 去引用一个通配符或者反斜杠字符 --exclude-from=FILE 跳过文件谁的名字匹配任何文件名GLOB的,从FILE中读取GLOB的。和--exclude差不多 --exclude-dir=DIR 排除目录匹配这样式DIR从递归查询中 -I 处理二进制文件,把二进制文件当做什么都没有,直接跳过 --inlclude=GLOB 仅仅搜寻匹配GLOB的文件 -R,-r,--recursive 读取所有在目录下面的文件,这等价于-d recurse 选项
其它选项:
--line-buffered 使用行的缓存在输出上,这个可能导致性能损失 --mmap 如果可能的话,使用mmap系统调用去读取输入,而不是read系统调用。这某些情况下,--mmap导致更好的性能。然而--mmap可能导致无法定义的行为,当一个文件shrinks当grep在操作的时候,或者IO错误发生 -U 把文件当成二进制文件来看,默认情况下,在DOS和windows操作系统下面,grep猜一个文件的类型通过查看文件的前32kB的内容。如果文件是文本,他去掉CR字符从原始文件。这个选项在其它平台上没有什么作用 -z ,--null-data 把输入当做很多行,每一个终止通过一个NULL字节代替一个新航,就像-Z或者--null选项,这个选项就像sort -z 去加工随机文件名
正则表达式
正则表达式是一个模式描述一套字符串。正则表达式就像数学表达式差不多,使用不同的操作符构成一个小的表达式 . 正则表达式几乎匹配了所有的字符,数字和正则自己。一些特殊的元字符可以通过在前面加一个反斜杠实现引用。
grep理解三种不同版本的正则表达式语法:basic,extended和perl的。
字符类和括号类表达式:
. 匹配任何单个字符 [...] 匹配括号列表里面的单个字符在[]内表示范围,可以在两个字符之间加一个 - 代表范围。 匹配任何单字符在两个字符之间。默认的 [a-d]匹配[abcd] ,不过也可能匹配[aBbCcDd] ,为了获得默认的括号表达式类型,你需要设置这LC_ALL环境变量。 为了匹配一些特殊字符: ] : 把它放在列表首部, []abcd] ^ :可以放在任何位置除了首部 [abc^d] - :放在最后的位置 [abcd-] [object Object]
另外有几个预定义的括号表达式
[:alnum:]:表示数字与大小写字母[0-9a-zA-Z] [:alpha:]:表示大小写字母[a-zA-Z] [:cntr:]: 表示控制按键,Ctrl、Tab... [:digit:]:表示数字 [:graph:]:表示除了空白键与Tab键外的所有按键 [:lower:]:代表小写字母 [:print:]:代表任何可以被打印出来的字节 [:punct:]:代表标点符号 [:space:]:代给空白键 [:upper:]:代表大写字母 [:xdigit:]:代表十六进制的数字类型
锚定符
^:匹配行首 $:匹配行尾 \< 和 \> 匹配一个字符串的开始和结束 ,也就是牟定单词。 \b 相当于\<或\> \B 不牟定,类似于\b取反 \w 等价于 [:alnum:] \W 等价于 [^[:alnum:]]
重复:
正则表达式可能重复几次撇皮 ? 前面的字符是可选的和只匹配一次 * 前面的字符可以匹配0此或者更多次 + 前面的字符至少匹配一次,可以匹配更多次 {n} 前面的字符精确匹配 n 此 {n,}前面的字符匹配n此以上 {,m}前面的字符至多匹配m次 \(\):向后引用,引用:\1, \2, \3
基本正则和扩展正则:
基本正则之间,元字符,?,+,{,|,(,}和)都丢失了他们特殊的意义,应该使用\?,\+,\{,\(,和、) 传统egrep不支持{ 元字符,一些egrep实现了支持 \{ ,一些脚本应该避免 { 在grep -E 中应该使用 [{] 去匹配"{"
环境变量:grep的行为被一些环境变量影响。自己man吧。
总结:博文到这里结束吧。这篇博文,写的不好,需要时间来不断完善其中的实例。
为什么不好?
1、这种grep例子,都是老生常谈,没有一点点新意,尽管我花了好久时间,时间长不能代表做的好。
2、grep就只是一个命令,我去看manual手册,一直在那翻译,当然翻译的不够好,翻译时好多句式不明白,明白单词的意思,不一定能够明白句子的意思。难道还要看源代码,才能明白其中的原理吗?目前会用就行了吧。
3、在这个平台上面写的第一篇博文,弄个图片好久没弄出来,最后我又撤销了几张图片,都不知道为什么。
下次写博客注意的地方?
1、不要照着manual手册翻译过来,那样是个人都会翻译,而是把自己对manual的理解,与整理之后贴出来,有自己的见解。
2、还要再熟悉熟悉博客平台,才能用好。