这一篇写Linux 里面的查找工具 —— grep
grep 的全称是 Global Regular Expression Print,全局正则表达式打印,顾名思义,它可以在指定文档里搜索普通的字符串,也可以匹配正则表达式,然后将匹配后的结果打印在屏幕上。(注:下文的pattern指的是你交给grep 进行匹配的字符串或正则表达式)
当然它也可以在多个文件中,或者指定的路径下对所有的文档同时进行检索,这就需要设定一些参数了。
需要学习正则表达式的可以看我的另一篇笔记:
123456:[Python] Python 的正则表达式
1.grep 的参数:
关于你输入的pattern 和匹配方式:
-E, --extended-regexp 输入的pattern为一个正则表达式,也可以用egrep 来代替它。如果你想在不使用 -E 或者 egrep 的情况下使用,但是需要添加转义符。
-F, --fixed-strings 需要匹配的pattern 为固定的字符串
-G, --basic-regexp pattern 为一个普通的正则表达式
-P, --perl-regexp 输入的 pattern 为一个perl语言下的正则表达式
-e, --regexp=PATTERN pattern 在这里作为一个条件输入,如 grep -e ‘1’file 会输出文件中所有的包含1的字符串
-f, --file=FILE pattern 来自于指定文件
-i, --ignore-case 忽略大小写 grep -i ‘a’file 输出的结果包括 a 和 A
-w, --word-regexp 完整匹配单词,只有pattern = 整个单词的时候才能够匹配,grep -w “function”file 只能匹配 function 而不会匹配 functional
-x, --line-regexp 完整匹配一整行,和 -w 类似,不过要求一整行的内容都和pattern一样
-z, --null-data 匹配数据时,以“0”作为结尾,而非换行符
关于输出:
-m, --max-count=NUM 限制最大匹配数量 举个例子: grep -m 2 'str' file 最多在文件里匹配两次 str
-b, --byte-offset 在输出的字符串前标注字符串的第一个字符的位置
-n, --line-number 在输出的行前面标注行编号
-H, --with-filename 输出匹配项时同时打印对应的文件名
-h, --no-filename 输出时不输出文件名
-o, --only-matching 只显示匹配pattern 的部分
-q, --quiet, --silent 不输出
-a, --text 不会忽略二进制内容
-I 忽略二进制内容
-d, --directories 输入动作,决定对某个目录的动作,当你的输入是目录而非文件时,必须输入 -d,动作包括: 'read', 'recurse', or 'skip' (分别为 明确读取某个指定目录;递归读取子目录;和忽略子目录)
-D, --devices=ACTION 处理设备、栈或套接字时必用,但没有递归,只有read 和 skip
-r, --recursive 等于 -d recurse
-R, --dereference-recursive 依旧是等于-d read ,但在同时解析符号链接
-L, --files-without-match 只输出不包含匹配项的文件的名称
-l, --files-with-matches 只输出包含匹配项文件的文件名
-c, --count 只打印每个文件中匹配的行数
-T, --initial-tab 对齐制表符
-Z, --null 在输出文件名后不再输出(我没用过这个...没太明白啥意思)
如果你想看看匹配项的上下文:
-B, --before-context=NUM 除了匹配到的行外,还将输出匹配到行的前(?)行
-A, --after-context=NUM 除了匹配到的行外,还将输出匹配到行的后(?)行
-C, --context=NUM 同时输出上下文(?)行
-NUM = -C or --context=NUM
-U, --binary 不会删除其他系统下的CR换行符(MSDOS/Windows 的换行符不是n 而是 r)
-u, --unix-byte-offsets 如果内容里不包含CR,那么报告它的位置
其他:
-s, --no-messages 不报错
-v, --invert-match 反选,选择那些没有pattern的行
-V, --version 版本信息
--help 帮助
2.Pattern部分:
这一部分主要是正则表达式的写法和多个pattern的同时设定,这部分我只谈grep 一些比较特殊的正则表达式用法,基本的我就不再赘述了。
匹配次数:
{m,n} 匹配 m-n 次前面的pattern
? = {0,1} 匹配0-1次
* = {0,} 匹配pattern 任意次数(即使没有也没关系)
+ = {1,} 匹配pattern 一到多次 (至少出现一次)
多pattern 匹配:
(string) 将其中的string作为一个整体,进行分组
| 用于多组pattern 同时进行匹配,举例:抓取日志文件中的错误信息:
grep 'warning|error' *.log
或者可以用grep -e warning -e error *.log 直接给出多个pattern
pattern 的位置:
^ 锚定行首
$ 锚定行尾
b(pattern)或< 锚定单词的词首。如"blike"不会匹配alike,但是会匹配liker
(pattern)b或> 锚定单词的词尾。如"likeb"不会匹配liker,只会匹配alike
B 与b作用相反
写在后面:
这里面只介绍了参数、用法和很少的几个例子,我打算写完awk之后将一些平时处理数据的命令行统一给出,再讨论一下什么时候我会用命令行,什么时候我会去写一些简单的python脚本实现功能。
最近沉迷下棋....我会尽量更新的....
参考:
linux中grep命令的用法 - flyor - 博客园