Grep 是 Global Regular Expression Print 的缩写,它搜索指定文件的内容,匹配指定的模式,默认情况下输出匹配内容所在的行。注意,grep 只支持匹配而不能替换匹配到的内容。

基本语法

语法格式:

grep [OPTIONS] PATTERN [FILE...]

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

grep 支持不同的匹配模式,比如默认的 BRE 模式,增强型的 ERE 模式,还有更强悍的 PRE 模式。普通情况下使用默认的 BRE(basic  regular  expression) 模式就可以了,这种方式的特点是支持的正则表达式语法有限。如果需要更进一步的正则表达式语法支持,可以使用 ERE(extended regular expression) 模式。如果要使用复杂的正则表达式语法,可以使用 PRE 模式,它支持 Perl 语言的正则表达式语法。

常用选项:

--help

-V, --version

-G, --basic-regexp        BRE 模式,也是默认的模式

-E, --extended-regexp  ERE 模式

-P, --perl-regexp           PRE 模式

-F, --fixed-strings          指定的模式被解释为字符串

-i 忽略大小写

-o 只输出匹配到的部分(而不是整个行)

-v 反向选择,即输出没有没有匹配的行

-c 计算找到的符号行的次数

-n 顺便输出行号

常见用例

递归目录中的所有文件

默认情况下 grep 会匹配指定定文件中的内容,如果我们指定了一个目录,grep 则直接罢工:

使用选项 -R, -r, --recursive 会递归指定目录下的所有文件,并匹配其内容:$ grep -r 'world' ~/projects/

通过 -d recurse 选项可以实现同样的功能:$ grep 'world' -d recurse ~/projects/

在递归的过程中只输出匹配内容所在的文件名称

如果我们只想查看匹配到的内容所在文件的名称,可以同时使用 r 和 -l, --files-with-matches 选项:$ grep -rl email /home/nick/projects/bash/.git

在递归的过程中排除某些目录

可以在应用选项 r 的同时应用 --exclude-dir 选项来排除一些目录(注意,这里设置的也是正则表达式):$ grep -r --exclude-dir='.git' 'email' .

还可以同时指定多个表达式:$ grep -r --exclude-dir={.git,xgit} 'email' .

在递归的过程中排除指定的文件

可以在应用选项 r 的同时应用 --exclude 选项来排除一些文件(注意,这里采用的是 GLOB模式):

$ grep -r --exclude=*.txt 'email' .

不区分大小写

Grep 默认的匹配规则区分字符的大小写,使用选项 -i (小写字母i), --ignore-case 会在匹配中忽略字符大小写:$ grep -i 'hello' email1

只输出匹配到的部分(而不是整个行)

Grep 默认会输出匹配到的内容所在的整个行,使用选项 -o, --only-matching 则只输出匹配到的内容:$ echo "abc 123 test" | grep -o '[0-9]\{1,3\}'

输出的结果为:123

在需要把匹配的内容存入变量时 -o 选项非常有用,比如下面的示例把从文件中匹配到的 IP 地址保存在变量 ip 中:ip=$(grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' file.log)if test -z "${ip}"; then

exit 1fiecho ${ip}

把匹配条件当成一个字符串

有时候我们想要匹配一个固定的字符串,但是其中包含了特殊字符,比如:$ grep '.*' email1.txt

这样的条件会返回文件中的每一行内容,这不是我们想要的。可以通过转义符来解决这个问题:$ grep '\.\*' email1.txt

当然,我们还可以通过选项 F 来优美的解决这个问题,此时指定的条件会被当成一个字符串来匹配:$ grep -F '.*' email1.txt

同时输出匹配行后的 n 行

使用选项 -A n 可以输出匹配行后的 n 行,结合 ps 命令,可以用来查找某个进程的子进程。下面的例子通过 -A 1 输出容器运行的进程(bash):$ ps fxa | grep -A 1 docker

同时输出匹配行前后的行

有时我们想要看到匹配行的前后行的内容,使用选项 -C n 可以实现这个功能,比如下面的命令会同时输出匹配行前后 1 行的内容:$ grep -C 1 'grey' email1.txt

在输出中显示行号

使用选 -n 可以在输出中显示行号:

统计匹配到的行的数量

使用选项 -c 可以统计匹配到的行的数量:

反转匹配条件

如果我们想要获取正则表达式没有匹配到的行,可以使用选项 -v, --invert-match:$ grep -v '^[a-zA-Z].*' email1.txt

上面的输出为不是以字母开头的行。

只匹配完整的行

如果我们只对一个完整的行感兴趣,可以使用选项 -x, --line-regexp。这样会忽略那些包含在行中的内容:

从文件中读取正则表达式

如果正则表达式太长,或者是需要指定多个正则表达式,可以把它们放在文件中,然后使用 选项 -f FILE, --file=FILE 来指定这个文件。如果指定了多个正则表达式(每行一个),任何一个匹配到的结果都会被输出:

使用预定义的命名字符类$ grep '[[:digit:]]\{1,3\}' email1.txt

BRE(basic  regular  expression)语法说明解释

.匹配一个任意的字符在 [] 中 . 号并不是元字符

^行的起始^ 和 $ 匹配的是一个位置而不是具体的文本

$行的结束^ 和 $ 匹配的是一个位置而不是具体的文本

*匹配 0 次或多次不匹配上一次表达式,匹配上一次或匹配多次,并生成所有可能的匹配

匹配尽可能多的次数,如果实在无法匹配,也不要紧

[]匹配若干个字符之一又叫字符组、字符类,比如 [0-9]、[a-z]、[A-Z]

只有在字符组内部 - 才是元字符,表示一个范围

[^...]排除型字符组字符组以 ^ 开头,它会匹配一个任何未列出的字符

\?可选元素在 BRE 中需要使用转义符 \

出现一次或者不出现

\+匹配 1 次或多次在 BRE 中需要使用转义符 \

匹配前面表达式的至少一个搜索项

匹配尽可能多的次数,如果实在无法匹配,也不要紧

\{min,max\}量词区间在 BRE 中需要使用转义符 \

\|或(多选结构)在 BRE 中需要使用转义符 \

bob\|nick 能够同时匹配其中任意一个的正则表达式,此时的子表达式被称为 "多选分支"

多选结构可以包括很多字符,但不能超越括号的界限

\(\)分组在 BRE 中需要使用转义符 \

括号能够 "记住" 它们包含的子表达式匹配的文本

反向引用(backreference)是正则表达式的特性之一,它允许我们匹配与表达式先前部分匹配的同样的文本

\单词分界符在 BRE 中需要使用转义符 \

< 和 > 本身并不是源字符,只有它们与反斜线结合时才具有单词分界符的含义

\转义符如果需要匹配的某个字符本身就是元字符,就需要使用转义符

命名的字符类命名的预定义字符类[[:upper:]]   [A-Z]

[[:lower:]]   [a-z]

[[:digit:]]   [0-9]

[[:alnum:]]   [0-9a-zA-Z]

[[:space:]]   空格或 tab

[[:alpha:]]   [a-zA-Z]

ERE(extended regular expression)

与 BRE 相比 ERE 最大的优点是支持更多的元字符,也就是在使用这些字符时不需要 \ 了。比如上面 BRE 中使用的 \ 符可以全部去掉。

本文来自投稿,不代表访得立场,如若转载,请注明出处:http://www.found5.com//view/594.html

linux grep -v多个关键字,Linux grep 命令详解相关推荐

  1. linux中的 ip addr 和 ip link命令详解

    linux中的 ip addr 和 ip link命令详解 一.ip addr命令 我是使用的linux系统是redhat7.3,其它linux的相关操作大同小异(在这里不做赘述) 1.查看 (1). ...

  2. 【linux】循序渐进学运维-基础篇-netstat命令详解

    大家好,我是高胜寒,本文是Linux运维-循序渐进学运维-基础篇的第62篇文章 文章目录 前言 一. netstat命令详解 作用 1. 常用参数 2. 命令使用 1) 参数作用详解 2) 网络连接状 ...

  3. linux dd iflag oflag,【转】dd命令详解及利用dd测试磁盘性能

    linux下dd命令详解 名称: dd 使用权限: 所有使用者 manpage 定义: convert and copy a file 使用方式: dd [option] dd --help info ...

  4. linux搜索指定文件夹里文件是否存在,Linux文件操作之文件查询与搜索命令详解...

    文件的查询和搜索也是最常用的操作,在嵌入式 Linux 开发中常常需要在 Linux 源码文件中查询某个文件是否存在,或者搜索哪些文件都调用了某个函数等等.本节我们就讲解两个最常用的文件查询和搜索命令 ...

  5. linux怎么强制解挂,linux下强制卸载挂接点——umount+Fuser命令详解

    fuser -km /soft umount /soft Linux命令Fuser详解 使用文件或者套节字来表示识别进程.我常用的他的两个功能:查看我需要的进程和我要杀死我查到的进程 比如当你想umo ...

  6. linux系统中安装和使用rz/sz命令详解

    对于经常使用Linux系统的人员来说,少不了将本地的文件上传到服务器或者从服务器上下载文件到本地,rz / sz命令很方便的帮我们实现了这个功能,但是很多Linux系统初始并没有这两个命令.今天,我们 ...

  7. Linux基础系列4(ls,cp命令详解)

    Linux系统操作离不开命令,基础命令更显得尤为重要,下面几个让我们来一一尝试 ls:列出当前目录的内容或指定目录 用法:ls [options] [files_or_dirs] ls -a包含隐藏文 ...

  8. 在LINUX中怎样用FIDISK分区,fdisk分区命令详解与fdisk非交互式分区

    1.说明:fdisk如何来学习 fdisk,就是在linux中用来分区的一个命令了,至于详细的参数,可以man一下,这里给出实际应用过程中最常用的用法,因为这样比起单纯讲命令的语法功能更能掌握一个命令 ...

  9. Linux学习之文件系统zfs文件系统之zpool命令详解

    ZPOOL(8) System Manager's Manual ZPOOL(8)NAMEzpool - configure ZFS storage poolsSYNOPSISzpool -?zpoo ...

  10. linux系统cpu内存等资源查看top命令详解

    top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.top显示系统当前的进程和其他状况,是一个动态显示过程,即可以通过用户按键来不断 ...

最新文章

  1. 谷歌某程序员抱怨“招人难”:招了小半年,8个岗位才招到1个,现在又空出6个岗位!...
  2. Linux中的动态库和静态库(.a/.la/.so/.o)
  3. python-装饰器,类与对象,私有字段,析构,__call__,继承,多继承,接口
  4. spring-boot-starter-parent 作用
  5. 计算力学专业和计算机专业区别,力学类包括哪些专业
  6. 如何在eclipse调试mapreduce程序
  7. Linux下tomcat的服务器自启动配置
  8. ×××与字符串的相互转换
  9. SAP漏洞:为什么补丁没有发挥作用?
  10. python命名空间,类成员,对象成员
  11. PMP考试试题是什么样?
  12. rgba通道转rgb_image – 将RGBA颜色转换为RGB
  13. COMSOL模拟卡门涡街的模型
  14. 上海交大教授:何援军——包围盒(包容体/包围盒子)
  15. Android三级目录、ListView单选/GridView单选、ListView多选/GridView多选
  16. 详细描述Tomcat体系结构(图文并茂)
  17. android 校园 源码,android 校园交易APP
  18. 非主流照片的PS教程!
  19. graphpad细胞增殖曲线_应用GraphPad Prism制作生存曲线详细图文过程
  20. 应届学弟咨询:是去华为拿1万多低薪,还是去二线自研公司拿2万多高薪?.....

热门文章

  1. 深度优先搜索解决迷宫最短路径问题
  2. 老毛桃u盘装系统linux,老毛桃如何安装iso系统_老毛桃u盘启动安装iso系统教程
  3. MentoHUST讲解教程(锐捷破解)
  4. 全国省份城市区域代码
  5. cognos报表导出excel_Cognos制作报表常见问题
  6. 如何让文章的内容更吸引人
  7. 手摸手教你阅读和调试大型开源项目 ZooKeeper
  8. 斗鱼php开发面经,斗鱼面经
  9. 生成CFree 5.0 注册码
  10. 带滤镜拍照的app_这8款拍照修图APP,简直就是逼格神器!