LinuxShell命令grep

【注】具体详解参见 man 手册。

1. 简介

grep 命令用来在文件中查找并输出包含匹配指定模式的字符的行。

2. 格式

grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] -e PATTERN ... [FILE...]
grep [OPTIONS] -f FILE ... [FILE...]

其中,OPTIONS 为指定的选项参数,PATTERN 为匹配模式(可以为固定字符串、基础正则表达式 BRE 、扩展正则表达式 ERE 以及 Perl 兼容正则表达式 PCRE),FILE 为指定文件输入(FILE 为 - 代表从标准输入读入)。PATTERN 指定为 BRE 或 ERE 可参照 LinuxShell正则表达式

3. 常用参数

3.1 基础信息

选项参数 说明
--help 帮助手册
-V, --version 版本信息

3.2 选择匹配模式

选项参数 说明
-E, --extended-regexp 使用 ERE 解释 PATTERN
-F, --fixed-strings 把 PATTERN 仅当做固定字符串来解释
-G, --basic-regexp 使用 BRE 解释 PATTERN(默认)
-P, --perl-regexp 使用 PCRE 解释 PATTERN
  • 匹配模式控制
选项参数 说明
-e PATTERN, --regexp=PATTERN 该选项可被使用多次用于指定多个模式
或者用于保护以 - 为首的模式不被解释为参数
-f FILE, --file=FILE 从文件 FILE 中读取匹配模式(每行一个)
-i, --ingore-case 不区分大小写(grep 默认区分)
-v, --invert-match 返向搜索(输出不匹配模式行)
-w, --word-regexp 只输出包含有完整的词匹配的行(词的组成字符是字母、数字、下划线)
匹配的字符串是必须是行首或者一个不是词组成的字符之后,且必须是行尾或者一个不是词组成的字符之前
-x, --line-regexp 只输出完整行匹配的行(与 -w 同时使用则 -w 无效)

3.3 普通行输出控制

选项参数 说明
-c, --count 禁止通常的输出,取而代之输出匹配的行数
-L, --files-without-match 禁止通常的输出,取而代之输出没有任何文本匹配的文件名
(对于输入文件,扫描到第一个匹配的时候就会停止)
-l, --files-with-matches 禁止通常的输出,取而代之输出有任一文本匹配的文件名
(对于输入文件,扫描到第一个匹配的时候就会停止)
-m NUM, --max-count=NUM 输出 NUM 个匹配的行之后停止继续读取
当同时使用 -c, --count 选项时,输出行数不会比 NUM 更多
当同时指定 -v, --invert-match 选项时,输出 NUM 个不匹配的行之后停止继续读取
-o, --only-matching 只输出匹配的字符串部分(每部分输出占一行)
-q, --quiet, --silent 安静模式,不向标准输出写任何信息
如何找到任何匹配字符串就立即以状态 0 退出,即使检测到错误(参见 -s, --no-messages 选项)
-s, --no-messages 禁止输出任何有关文件不存在或不可读的错误信息

3.4 行输出前缀控制

选项参数 说明
-b, --byte-offset 在输出的每行前面同时打印出当前行在输入文件中的字节偏移量
当同时指定 -o, --only-matching 选项时,取而代之打印出匹配部分的字节偏移量
-H, --with-filename 在输出的每行前面同时打印出所属文件(当输入多个文件时默认该选项)
-h, --no-filename 禁止在输出行前加文件名前缀(当输入单个文件或标准输入时默认该选项)
--label=LABEL 讲实际上来自标准输入的输入视为来自文件 LABEL 的输入
-n, --line-number 在输出行前加上其所在文件中的行号
-T, --initial-tab 确保每个输出行在输出航前缀信息后的一个 Tab 后对齐输出
当同时含有 -H, -n, -b 选项时,由于前缀的不等长,该选项则显得非常有用
-Z, --null 在文件名输出后紧跟着输出一个全零字节(ASCII NUL 字符),取代原来的文件名后紧随的字符(换行符、: 等)

3.5 文本行控制

选项参数 说明
-A NUM, --after-context=NUM 额外输出紧随匹配行之后最多 NUM 行
当 NUM 小于相邻匹配行间的不匹配行数时,则再附加输出 -- 作为相邻分隔符
当 NUM 大于相邻匹配行间的不匹配行数时,只输出相邻匹配行间的所有行
当同时含有 -o, --only-matching 参数时,该参数除输出 -- 分隔符行外均无效
-B NUM, --before-context=NUM 额外输出紧随匹配行之前最多 NUM 行
当 NUM 小于相邻匹配行间的不匹配行数时,则再附加输出 -- 作为相邻分隔符
当 NUM 大于相邻匹配行间的不匹配行数时,只输出相邻匹配行间的所有行
当同时含有 -o, --only-matching 参数时,该参数除输出 -- 分隔符行外均无效
-C NUM, -NUM, --context=NUM 额外输出紧随匹配行前后各最多 NUM 行
当 NUM 小于相邻匹配行间的不匹配行数时,则再附加输出 -- 作为相邻分隔符
当 NUM 大于相邻匹配行间的不匹配行数时,只输出相邻匹配行间的所有行
当同时含有 -o, --only-matching 参数时,该参数除输出 -- 分隔符行外均无效
  • 举例
grep -B 1 "!" file

输出结果如下:

hhhhhhhhhhhhhhhhhhhhh
hello world !
--
1
hello earth !
--
2
hello universe !
--
3
hello universe !
hello earth !
hello world !

其中,file 文件内容为:

hhhhhhhhhhhhhhhhhhhhh
hello world !
:)
1
hello earth !
:(
2
hello universe !
:|
3
hello universe !
hello earth !
hello world !

3.6 选择文件(夹)

选项参数 说明
-a, --text 将二进制文件当做文本文件来处理(等价于下文 --binary-files=text)
--binary-files=TYPE 如果一个文件的起始几个字节表明文件包含二进制文件,则假定该文件是 TYPE 类型的(默认 TYPE 为 binary)
如果 TYPE 为 binary,那么不会输出匹配行,而是匹配成功输出提示信息或匹配失败不输出信息
如果 TYPE 为 without-match,那么假定二进制文件不会匹配(等价于 -I 选项)
如果 TYPE 为 text,那么将一个二进制文件视为文本文件处理(等价于 -a 选项)
-D ACTION, --devices=ACTION 如果输入文件是一个设备(FIFO 或 socket),使用动作 ACTION 处理(默认为 read)
当 ACTION 指定为 read 时,将设备视为普通文件来读取
当 ACTION 指定为 skip 时,将不处理而直接跳过设备
-d ACTION, --directories=ACTION 如果输入文件是一个目录,使用动作 ACTION 处理(默认为 read)
当 ACTION 指定为 read 时,将设备视为普通文件来读取
当 ACTION 指定为 skip 时,将不处理而直接跳过该目录
当 ACTION 指定为 recurse 时,递归读取目录下的所有文件(等价于 -r 选项)
--exclude=GLOB 跳过文件名匹配通配符模式 GLOB 的所有文件
如果是递归读取目录下的文件,则跳过基本名(不包含路径)匹配模式的所有文件
--exclude-from=FILE 通过文件 FILE 指定 GLOB 模式,跳过匹配 FILE 中任一模式的文件
--exclude-dir=GLOB 跳过目录名匹配通配符模式 GLOB 的所有目录
如果是递归读取目录下的目录,则跳过基本名(不包含路径)匹配模式的所有目录
-I 将二进制文件视为不会匹配处理(等价于上文 --binary-files=without-match)
--include=GLOB 只处理文件名匹配通配符模式 GLOB 的文件
如果是递归读取目录下的文件,则处理基本名(不包含路径)匹配模式的所有文件
-r, --recursive 递归处理目录下的所有文件,同 -d recurse 选项
对于符号链接,仅在命令行上才按照符号链接所指定的文件/目录递归地读取所有文件。
-R, --dereference-recursive 递归处理目录下所有文件(包括符号链接)

3.7 其他选项

选项参数 说明
--line-buffered 输出时使用行缓存(可能造成性能下降)
-U, --binary 将文件视为二进制文件处理
-z, --null-data 将输入输出数据视为行串处理,每行以一个全零字节符(ASCII NUL)而不是换行符结束(类似 -Z, --null 选项)

4. 退出状态

正常情况下,有任一行匹配返回退出状态 0,没有任何行匹配返回退出状态 1,有错误出现返回退出状态 2 。
当指定 -q, --quiet, --silent 选项时,有错误出现也返回退出状态 0 。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容