Linux基础命令---显示文本grep

本文详细介绍了Grep命令的使用方法,包括语法、选项列表、环境变量影响、退出码及实例。Grep用于在文件中搜索匹配的行并显示结果,支持多种模式匹配和输出控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

grep
      按照指定的模式,在文件中搜索匹配的行,将结果显示在标准输出。另外还有两个指令egrep相当于grep –E,fgrep相当于grep -F。如果没有给出文件名,那么从标准输入读取。
      此命令的适用范围:RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。

1、语法
      grep  [选项]  PATTERN  files
      grep  [OPTIONS]  [-e PATTERN | -f FILE]  [FILE...]


2、选项列表
      -V | --version
            显示命令版本信息
      --help
            显示帮助文档

      匹配选择
      -E | --extended-regexp
            使用扩展规则表达式解释匹配模式
      -F | --fixed-strings
            将匹配模式看做固定字符串
      -G | --basic-regexp
            使用基本规则表达式解释匹配模式
      -P | --perl-regexp
            使用perl表达式解释匹配模式
      
      文件和目录选择控制
      -a | --text
            忽略二进制数据
      --binary-files=TYPE
            如果文件的前几个字节表示该文件包含二进制数据,则假定该文件类型是TYPE。默认情况下,TYPE为二进制,grep通常输出一行消息表示二进制文件匹配,如果没有匹配则不输出消息。如果类型不匹配,grep假定二进制文件不匹配;这相当于-i选项。如果TYPE是文本,grep会像处理文本一样处理二进制文件;这相当于-a选项。警告:“grep-binary-files=text”可能会输出二进制垃圾,如果输出是终端,并且终端驱动程序将其中的一些解释为命令,则会产生严重的副作用。
      -D action | --devices=ACTION
            如果输入文件是一个设备文件,那么用指定的action处理。read,像普通文件一样读取设备,skip,忽略设备
      -d action | --directories=ACTION
            如果查找的是目录文件,那么使用指定的操作处理。read,像普通文件一样读取目录;skip,忽略目录;recursive,递归当时读取子目录下文件。
      --exclude=per
            忽略文件名匹配per的文件
      --exclude-from=FILE
            跳过其基本名称与从FILE中读取的任何文件名全局匹配的文件。
      --exclude-dir=DIR
            从递归搜索中排除匹配模式DIR的目录
      -I
            处理二进制文件,就像它不包含匹配的数据一样;等价于“--binary-files=without-match”
      --include=GLOB
            只搜索其基本名称与GLOB匹配的文件
      -R | -r | --recursive
            递归方式读取目录下所有文件

      行数控制
      -A num | --after-context=NUM
            显示匹配行以及之后指定的行数
      -B num | --before-context=NUM
            显示匹配行以及之前指定的行数
      -C num | -NUM | --context=NUM
            显示匹配行以及之前和之后的指定行数

      输出行控制
      -b | --byte-offset
            在显示匹配的行之前,打印该行第一个字符的偏移位置
      -H | --with-filename
            为每个匹配的行显示文件名,如果有多个文件的话,这是默认操作
      -h | --no-filename
            显示匹配的行,但是不显示文件名。如果搜索一个文件时,这是默认操作
      -n | --line-number
            显示匹配的行之前,显示行号
      -T | --initial-tab
            确保实际行内容的第一个字符位于制表符停止上,使制表符的对齐看起来正常。
      -u | --unix-byte-offsets
            报告Unix样式的字节偏移量。此开关使grep报告字节偏移量,就像文件是Unix样式的文本文件一样
      -Z | --null
            输出一个零字节(ASCII null字符),而不是通常跟随文件名的字符。例如,“grep –lz”在每个文件名之后输出一个零字节,而不是通常的换行符。

      输出控制
      -c | --count
            统计符合匹配的行数
-      -color[=WHEN] |  --colour[=WHEN]
            用转义序列包围匹配(非空)字符串、匹配行、上下文行、文件名、行号、字节偏移量和分隔符(用于字段和上下文行组),以便在终端上显示它们的颜色。颜色由环境变量grep_colors定义。仍然支持不推荐的环境变量grep_color,但它的设置没有优先级。WHEN的有效值是never,always,auto。
      -L | --files-without-match
            禁止正常输出;而是打印通常不会输出的每个输入文件的名称。扫描将在第一次匹配的时候停止。
      -l
            显示内容符合指定匹配模式的文件名
      -m num  |  --max-count=NUM
      在匹配num行之后,停止搜索
      -o | --only-matching
            只显示匹配行的匹配字符
      -q | --quite
            静默模式,搜索完成之后返回0
      -s | --no-messages
            不显示文件不存在和文件不可读的错误信息

      模式控制
      -e parttern  |  --regexp=PATTERN
            设置匹配模式
      -f file  | --file=FILE
            将给定的文件内容作为匹配模式
      -i  |  --ignore-case
            忽略大小写
      -v | --invert-match
            显示不符合匹配模式的行
      -w | --word-regexp
            显示整个字都匹配的行
      -x | --line-regexp
            显示整行都匹配的行

      其他选项
      --line-buffered
            对输出使用行缓冲。这会导致性能损失。
      --mmap
            如果可能,使用mmap(2)系统调用来读取输入,而不是默认的read(2)系统调用。在某些情况下,mmap会产生更好的性能。但是,-mmap可能导致未定义的行为(包括核心转储),如果一个输入文件在grep运行时收缩,或者如果发生I/O错误。
      -U | --binary
            将文件视为二进制文件。
      -z | --null-data
            将输入视为一组行,每一行以零字节(ASCII NUL字符)结尾,而不是换行符。

3、环境变量
grep的行为受到以下环境变量的影响。
      GREP_OPTIONS,此变量指定放置在任何显式选项前面的默认选项。选项规范由空格分隔。反斜杠转义下一个字符,因此它可以指定包含空格或反斜杠的选项。例如,如果GREP_OPTIONS是’--binary-files=without-match --directories=skip’,那么grep执行的时候就假设已经有了这两个选项。
      GREP_COLOR,此变量指定用于突出显示匹配(非空)文本的颜色。
      GREP_COLORS,指定用于突出显示输出的各个部分的颜色和其他属性。它的值是一个以冒号分隔的功能列表,默认为ms=01;31:mc=01;31:sl=:cx=:fn=35:ln=32:bn=32:se=36,省略了rv和ne布尔功能(即false)。支持的功能如下所示。
sl=,用于整个选定行的SGR子字符串(即-v命令行选项省略时的匹配行,或指定-v时不匹配的行)。但是,如果指定了布尔rv功能和-v命令行选项,则它将应用于上下文匹配行。默认值为空(即终端的默认颜色对)。
            cx=,用于整个上下文行的SGR子字符串(即省略-v命令行选项时的非匹配行,或指定-v时的匹配行)。但是,如果指定了布尔RV功能和-v命令行选项,则它将适用于选定的非匹配行。默认值为空(即终端的默认颜色对)。
rv,当指定-v命令行选项时,逆转(掉期)“sl=”和“cx=”功能的布尔值。缺省值为false(即省略了功能)。
            mt=01;31,用于匹配任何行中的非空文本的sgr子字符串。(这仅在省略-v命令行选项时使用。)当启动时,sl=(或cx=)能力的效果保持活跃。默认值是当前行背景上的粗体红色文本前景。
            ms=01;31,用于匹配选定行中的非空文本的sgr子字符串。(这仅在省略-v命令行选项时使用。)当启动时,sl=(或cx=)能力的效果保持活跃。默认值是当前行背景上的粗体红色文本前景。
            mc=01;31,用于匹配上下文行中的非空文本的sgr子字符串。(这仅在省略-v命令行选项时使用。)当启动时,sl=(或cx=)能力的效果保持活跃。默认值是当前行背景上的粗体红色文本前景。
            fn=35,用于任何内容行前缀的文件名的SGR子字符串。默认值是终端默认背景上的洋红色文本前景。
            ln=32,任何内容行前缀的行号的SGR子字符串。默认值是终端默认背景上的绿色文本前景。
            bn=32,用于任何内容行前缀的字节偏移的SGR子字符串。默认值是终端默认背景上的绿色文本前景。
            se=36,当指定了非零上下文(--),SGR子字符串用于在选定的行字段(:)、上下文行字段之间(-)和相邻行组之间插入分隔符。默认值是终端默认背景上的青色文本前景。
            ne,布尔值,该值防止在每次彩色项结束时使用擦除入行(EL)对右(\33[K]清除到行尾的值。这是在不支持EL的终端上需要的。对于没有应用Back_COLOR_ERASE(BCE)布尔终止功能的终端、所选择的高亮颜色不影响背景、或者当EL太慢或导致过多闪烁时,它在其他情况下是有用的。默认值为false(即省略功能)
      LC_ALL, LC_COLLATE, LANG,这些变量指定LC_COLLATE类别的区域设置,该类别确定用于解释范围表达式(如[a-z])的排序序列。
      LC_ALL, LC_CTYPE, LANG,这些变量指定LC_CTYPE类别的区域设置,它决定字符的类型,例如,哪些字符是空格。
      LC_ALL, LC_MESSAGES, LANG,这些变量指定LC_MESSAGES类别的区域设置,它确定grep用于消息的语言。默认的C语言环境使用美式英语消息。
      POSIXLY_CORRECT,如果设置,grep的行为与POSIX.2所要求的一样;否则,grep的行为更像其他GNU程序。POSIX.2要求必须将文件名后面的选项视为文件名;默认情况下,这些选项被排到操作数列表的前面,并被视为选项。此外,POSIX.2还要求将未被承认的选项诊断为“非法”,但由于它们并不真正违反法律,默认情况是将它们诊断为“无效”。POSIXLY_RIDER还禁用_N_GNU_NOOPTION_ARGV_LANGS_,如下所述。
      _N_GNU_nonoption_argv_flags_,(这里N是grep的数字进程ID。)如果此环境变量值的ith字符为1,则不要将grep的ith操作数视为选项,即使它似乎是选项之一。shell可以为其运行的每个命令在环境中放置此变量,指定哪些操作数是文件名通配符展开的结果,因此不应被视为选项。此行为仅在GNU C库中可用,且仅在未设置POSIXLY_RIDER时才可用。

4、退出码
      通常,如果找到选定的行,则退出状态为0,否则为1。但是,如果发生错误,退出状态为2,除非使用-q、--quite、--slient选项,并找到选定的行。但是,请注意,对于grep、CMP和diff等程序,POSIX只要求在出现错误时的退出状态大于1;因此,出于可移植性的考虑,建议使用对此一般条件进行测试的逻辑,而不是与2严格相等的逻辑。

5、实例
1)显示文件中以2开头的行
      [root@localhost weijie]# cat 2.c
      123
      23
      212
      [root@localhost weijie]# grep ^2 2.c         //显示以2开头的行
      23
      212
2)显示不包含23的行 
      [root@localhost weijie]# grep -v 23 2.c
      212
3)显示整个字都匹配的行 
      [root@localhost weijie]# grep -w 23 2.c
      23
<think>好的,我需要解释Linux下的grep -v命令。首先,我得确认自己对它的理解是否正确。grep本身是用于搜索文本的工具,而-v选项应该是一个反转匹配的参数。也就是说,它会显示不包含匹配模式的行。 接下来,我应该回忆基本语法,确保格式正确。用户提到的系统级指令要求行内数学表达式用$...$,但这里可能用不上数学公式。不过还是要检查是否需要处理其他格式要求,比如独立成段的公式,但这里可能不涉及。 用户需要结构清晰的回答,所以应该分步骤或分点说明。可能需要包括用途、语法、示例、注意事项等部分。需要确保用中文,并且例子要具体,方便用户理解。 还要注意LaTeX语法是否正确,但在这个问题中可能不需要数学表达式,除非举例时需要特殊符号。不过如果有涉及,比如正则表达式中的符号,可能需要转义或处理,但一般grep的例子可能不需要复杂的LaTeX。 然后,思考常见的用例。比如排除空行,过滤日志中的某些信息。需要举实际例子,比如在文件中查找不包含某个关键词的行,或者结合其他命令如ps aux来排除特定进程。 另外,可能需要提到-v选项的全称是--invert-match,以增强专业性和完整性。同时,注意提示用户该选项可以与其他grep选项组合使用,比如-i(忽略大小写),但需要说明顺序的影响,比如-i放在-v前后的区别。 还要检查是否有常见错误,比如用户可能误用正则表达式导致结果不符,或者忘记引号包裹模式,导致shell解释特殊字符。这时候需要提醒用户正确引用模式。 最后,总结使用场景,强调-v在过滤不需要的内容时的实用性,帮助用户高效处理文本数据。确保语言简洁明了,避免技术术语过于复杂,适合不同层次的用户理解。</think>在 Linux 系统中,`grep -v` 是一个常用的文本过滤命令,其核心功能是**反向匹配**。以下是逐步说明: --- ### 1. **基本用途** - **作用**:从输入中筛选出**不包含**指定模式的行。 - **全称选项**:`--invert-match`(与 `-v` 等效) - **适用场景**:排除不需要的文本行,例如过滤日志中的干扰信息或清理数据。 --- ### 2. **命令语法** ```bash grep -v "模式" 文件名 ``` - `模式`:需排除的文本或正则表达式。 - `文件名`:要操作的目标文件(可省略,表示从标准输入读取)。 --- ### 3. **典型示例** #### 示例 1:排除包含特定关键词的行 ```bash # 查找 /etc/passwd 中不包含 "/bin/bash" 的行 grep -v "/bin/bash" /etc/passwd ``` #### 示例 2:结合管道过滤输出 ```bash # 查看运行中的进程,但排除 "ssh" 相关进程 ps aux | grep -v "ssh" ``` #### 示例 3:排除空行 ```bash # 清理文件中的空行(显示非空行) grep -v "^$" filename.txt ``` --- ### 4. **组合其他选项** `-v` 可与其他 `grep` 选项联合使用: - **忽略大小写**:`grep -vi "pattern"`(`-i` 不区分大小写) - **统计行数**:`grep -vc "pattern"`(`-c` 统计匹配行数) --- ### 5. **注意事项** - **正则表达式**:若模式包含特殊字符(如 `$`, `*`),需用引号包裹。 - **多条件排除**:需结合正则表达式逻辑符,例如: ```bash # 排除包含 "error" 或 "warning" 的行(需转义 |) grep -v "error\|warning" log.txt ``` --- ### 6. **底层原理** `grep -v` 通过逐行扫描输入,标记**不匹配**模式的行并输出。其时间复杂度为 $O(n)$,适合处理大文件。 --- 通过灵活使用 `grep -v`,可以高效清理和筛选文本数据,尤其适合日志分析、配置文件处理等场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值