【Linux】一步一步学Linux——egrep命令(50)
00. 目录
文章目录
- 00. 目录
- 01. 命令概述
- 02. 命令格式
- 03. 常用选项
- 04. 参考示例
- 05. 附录
01. 命令概述
egrep命令用于在文件内查找指定的字符串。egrep执行效果与grep -E
相似,使用的语法及参数可参照grep指令,与grep的不同点在于解读字符串的方法。egrep是用extended regular expression语法来解读的,而grep则用basic regular expression 语法解读,extended regular expression比basic regular expression的表达更规范。
egrep支持扩展的正则表达式
02. 命令格式
egrep [选项]... PATTERN [FILE]...
在每个 FILE 或是标准输入中查找 PATTERN。
PATTERN 是一个可扩展的正则表达式(缩写为 ERE)。例如: egrep -i 'hello world' menu.h main.c
注意: pattern如果是表达式或者超过两个单词的, 需要用引号引用. 可以是单引号也可双引号, 区别是单引号无法引用变量而双引号可以.
03. 常用选项
在每个 FILE 或是标准输入中查找 PATTERN。
PATTERN 是一个可扩展的正则表达式(缩写为 ERE)。
例如: egrep -i 'hello world' menu.h main.c正则表达式选择与解释:-e, --regexp=PATTERN 用 PATTERN 来进行匹配操作-f, --file=FILE 从 FILE 中取得 PATTERN-i, --ignore-case 忽略大小写-w, --word-regexp 强制 PATTERN 仅完全匹配字词-x, --line-regexp 强制 PATTERN 仅完全匹配一行-z, --null-data 一个 0 字节的数据行,但不是空行杂项:-s, --no-messages 不显示错误信息-v, --invert-match 选中不匹配的行-V, --version 显示版本信息并退出--help 显示此帮助并退出--mmap 忽略向后兼容性输入控制:-m, --max-count=NUM 匹配的最大数-b, --byte-offset 打印匹配行前面打印该行所在的块号码。-n, --line-number 显示的加上匹配所在的行号--line-buffered 刷新输出每一行-H, --with-filename 当搜索多个文件时,显示匹配文件名前缀-h, --no-filename 当搜索多个文件时,不显示匹配文件名前缀-o, --only-matching 只显示一行中匹配PATTERN 的部分-q, --quiet, --silent 不显示所有输出--binary-files=TYPE 假定二进制文件的TYPE 类型;TYPE 可以是`binary', `text', 或`without-match'-a, --text 等同于 --binary-files=text-I 等同于 --binary-files=without-match-d, --directories=ACTION 操作目录的方式;ACTION 可以是`read', `recurse',或`skip'-D, --devices=ACTION 操作设备、先入先出队列、套接字的方式;ACTION 可以是`read'或`skip'-R, -r, --recursive 等同于 --directories=recurse--include=FILE_PATTERN 只查找匹配FILE_PATTERN 的文件--exclude=FILE_PATTERN 跳过匹配FILE_PATTERN 的文件和目录--exclude-from=FILE 跳过所有除FILE 以外的文件--exclude-dir=PATTERN 跳过所有匹配PATTERN 的目录。-L, --files-without-match 只打印不匹配FILEs 的文件名-l, --files-with-matches 只打印匹配FILES 的文件名-c, --count 只打印每个FILE 中的匹配行数目-T, --initial-tab 行首tabs 分隔(如有必要)-Z, --null 在FILE 文件最后打印空字符文件控制:-B, --before-context=NUM 打印以文本起始的NUM 行-A, --after-context=NUM 打印以文本结尾的NUM 行-C, --context=NUM 打印输出文本NUM 行-NUM 等同于 --context=NUM--color[=WHEN],--colour[=WHEN] 使用标志高亮匹配字串;WHEN 可以是`always', `never'或`auto'-U, --binary 不要清除行尾的CR 字符(MSDOS 模式)-u, --unix-byte-offsets 当CR 字符不存在,报告字节偏移(MSDOS 模式)不带 FILE 参数,或是 FILE 为 -,将读取标准输入。如果少于两个 FILE 参数
就要默认使用 -h 参数。如果选中任意一行,那退出状态为 0,否则为 1;
如果有错误产生,且未指定 -q 参数,那退出状态为 2。
正则表达式
元字符 | 描述 |
---|---|
\ | 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“\n”匹配字符“n”。“\n”匹配一个换行符。序列“\”匹配“\”而“(”则匹配“(”。 |
^ | 匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置。 |
$ | 匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置。 |
* | 匹配前面的子表达式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等价于{0,}。 |
+ | 匹配前面的子表达式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。 |
? | 匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“does”或“does”中的“do”。?等价于{0,1}。 |
{n} | n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。 |
{n,} | n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。 |
{n,m} | m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。 |
? | 当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o?”将匹配所有“o”。 |
.点 | 匹配除“\n”之外的任何单个字符。要匹配包括“\n”在内的任何字符,请使用像“(.|\n)”的模式。 |
(pattern) | 匹配pattern并获取这一匹配。所获取的匹配可以从产生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中则使用$0…$9属性。要匹配圆括号字符,请使用“”。 |
(?:pattern) | 匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分是很有用。例如“industr(?:y|ies)”就是一个比“industry|industries”更简略的表达式。 |
(?=pattern) | 正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 |
(?!pattern) | 正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 |
(?<=pattern) | 反向肯定预查,与正向肯定预查类似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。 |
(?<!pattern) | 反向否定预查,与正向否定预查类似,只是方向相反。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。 |
x|y | 匹配x或y。例如,“z|food”能匹配“z”或“food”。“(z|f)ood”则匹配“zood”或“food”。 |
[xyz] | 字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。 |
[^xyz] | 负值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”。 |
[a-z] | 字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。 |
[^a-z] | 负值字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符。 |
\b | 匹配一个单词边界,也就是指单词和空格间的位置。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。 |
\B | 匹配非单词边界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。 |
\cx | 匹配由x指明的控制字符。例如,\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一。否则,将c视为一个原义的“c”字符。 |
\d | 匹配一个数字字符。等价于[0-9]。 |
\D | 匹配一个非数字字符。等价于[^0-9]。 |
\f | 匹配一个换页符。等价于\x0c和\cL。 |
\n | 匹配一个换行符。等价于\x0a和\cJ。 |
\r | 匹配一个回车符。等价于\x0d和\cM。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。 |
\S | 匹配任何非空白字符。等价于[^ \f\n\r\t\v]。 |
\t | 匹配一个制表符。等价于\x09和\cI。 |
\v | 匹配一个垂直制表符。等价于\x0b和\cK。 |
\w | 匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]”。 |
\W | 匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。 |
\xn | 匹配n,其中n为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,“\x41”匹配“A”。“\x041”则等价于“\x04&1”。正则表达式中可以使用ASCII编码。 |
\num | 匹配num,其中num是一个正整数。对所获取的匹配的引用。例如,“(.)\1”匹配两个连续的相同字符。 |
\n | 标识一个八进制转义值或一个向后引用。如果\n之前至少n个获取的子表达式,则n为向后引用。否则,如果n为八进制数字(0-7),则n为一个八进制转义值。 |
\nm | 标识一个八进制转义值或一个向后引用。如果\nm之前至少有nm个获得子表达式,则nm为向后引用。如果\nm之前至少有n个获取,则n为一个后跟文字m的向后引用。如果前面的条件都不满足,若n和m均为八进制数字(0-7),则\nm将匹配八进制转义值nm。 |
\nml | 如果n为八进制数字(0-3),且m和l均为八进制数字(0-7),则匹配八进制转义值nml。 |
\un | 匹配n,其中n是一个用四个十六进制数字表示的Unicode字符。例如,\u00A9匹配版权符号(©)。 |
04. 参考示例
4.1 grep使用正则表达式示例
grep '\<Tom\>' file 包含单词Tom的行
grep 'Tom savage' file 包含Tom savage的行
grep '^Tommy' file 包含以Tommy开头的行
grep '\.bak$' file 包含以.bak结束的行
grep '[Pp]yramid' file 包含pyramid 或Pyramid的单词的行
grep '[A-Z]' file 包含至少一个大写字母的行
grep '[0-9]' file 包含至少一个数字的行
grep '[A-Z]...[0-9]' file 包含五个字符,以大写开头, 和一个数字结尾的行.
grep -w '[tT]est' file 包含单词和test的行.
grep -s 'ken sun' file 找到包含ken sun的行, 但不打印行, 而是用来检查退出状态.
grep -v aaa file 打印不包含aaa的行.
grep -i cathy file 打印所有包含cathy的行, 而不考虑大小些.
grep -l 'dear cathy' * 打印包含dear cathy的文件的文件名清单.
grep -n tom file 打印匹配的行并追加行号.
grep "$LOGNAME" file 包含变量内容的行, 注意必须用双引号, 单引号则无法引用变量.
grep '$name' file 打印包含字符$name的行.
4.2 扩展的正则表达式
扩展表达式:
+ 匹配一个或者多个先前的字符, 至少一个先前字符.
? 匹配0个或者多个先前字符.
a|b|c 匹配a或b或c
() 字符组, 如: love(able|ers) 匹配loveable或lovers.
(..)(..)\1\2 模板匹配. \1代表前面第一个模板, \2代第二个括弧里面的模板.
x{m,n} =x\{m,n\} x的字符数量在m到n个之间
4.3 以一个或者多个a开头的行
[deng@localhost test]$ egrep '^a+' file
afkldjfkas
adskfjasld
或者
[deng@localhost test]$ grep '^aa*' file
afkldjfkas
adskfjasld
[deng@localhost test]$
4.4 包含deng或者root的行
[deng@localhost test]$ egrep '(deng|root)' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
deng:x:1000:1000:deng:/home/deng:/bin/bash
[deng@localhost test]$
4.5 至少包含一个root的行
[deng@localhost test]$ egrep '(root)+' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[deng@localhost test]$
4.6 包含x或者x后面跟着0个或者多个数字的行
[deng@localhost test]$ egrep 'x[0-9]?' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
4.7 所有以bash结尾的行
[deng@localhost test]$ egrep 'bash$' /etc/passwd
root:x:0:0:root:/root:/bin/bash
deng:x:1000:1000:deng:/home/deng:/bin/bash
oracle:x:1001:1002::/home/oracle:/bin/bash
itcast:x:1002:1003::/home/itcast:/bin/bash
[deng@localhost test]$
4.8 至少包含一个大写字母的行
[deng@localhost test]$ egrep '[A-Z]+' /etc/passwd
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
4.9 至少一个数字的行
[deng@localhost test]$ egrep '[0-9]' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
4.10 有五个字符, 第一个式大写, 最后一个是数字的行
[deng@localhost test]$ egrep '[A-Z]...[0-9]' /etc/passwd
[deng@localhost test]$
4.11 包含单词test或Test的行
[deng@localhost test]$ egrep '[tT]est' /etc/passwd
4.12 包含root的行
[deng@localhost test]$ egrep "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[deng@localhost test]$
4.13 不包含root的行
[deng@localhost test]$ egrep -v "root" /etc/passwd
4.14 忽略大小写
[deng@localhost test]$ egrep -i "Root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[deng@localhost test]$
4.15 包含root所有文件列表
[deng@localhost test]$ egrep -I "root" ./*
./file:root
./passwd:root:x:0:0:root:/root:/bin/bash
./passwd:operator:x:11:0:operator:/root:/sbin/nologin
./passwd1:root:x:0:0:root:/root:/bin/bash
./passwd1:operator:x:11:0:operator:/root:/sbin/nologin
[deng@localhost test]$
4.16 显示包含root的行,前面添加行号
[deng@localhost test]$ egrep -n "root" /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
[deng@localhost test]$
4.17 不显示错误信息
[deng@localhost test]$ egrep -s "rooot" /etc/passwd
[deng@localhost test]$
4.18 查找所有出现数字或者字母的行
[deng@localhost test]$ egrep [[:alnum:]] /etc/passwd
05. 附录
参考:【Linux】一步一步学Linux系列教程汇总
【Linux】一步一步学Linux——egrep命令(50)相关推荐
- 学linux作用,linux有必要学吗?学linux有什么作用,学linux能干什么
Linux是一种自由和开放源码的类UNIX操作系统.Linux有必要学吗?学Linux有什么作用,学Linux能干什么?Linux最大的作用就是提高效率.当你习惯在Linux命令行下工作,再回到win ...
- LINUX学习之路(学LINUX必看)
很多同学接触Linux不多,对Linux平台的开发更是一无所知.而现在的趋势越来越表明,作为一 个优秀的软件开发人员,或计算机IT行业从业人员,掌握Linux是一种很重要的谋生资源与手段.下来我将会结 ...
- linux学习需要什么基础,学linux需要什么基础?
近几年来,随着计算机网络的发展,越来越多的人学习 linux.对于想要从事运维工作或者从事智能开发方面的同学来说,学习 linux 是必要的.linux 的学习并不简单,那么这篇文章 w3cschoo ...
- 分享--linux 学习之路(学linux必看)
很多同学接触Linux不多,对Linux平台的开发更是一无所知. 而现在的趋势越来越表明,作为一个优秀的软件开发人员,或计算机IT行业从业人员, 掌握Linux是一种很重要的谋生资源与手段. 下来我将 ...
- 英语不好学linux运维难吗,学Linux系统难吗?学好Linux运维需要多久
随着近年来经济的快速发展,企业对Linux人才的需求也越来越高.许多人认为,Linux是一个非常简单的行业,然而,Linux行业是一个综合了云计算.Linux运维.Linux开发.Linux编程等多方 ...
- 不会linux的php难找工作,学linux系统难吗
这是 Linux初学者经常会问的问题,其实Linux和Windows一样都属于操作系统,对于大部分人来说,对Windows操作系统十分熟悉,而对Linux操作系统没有使用过,所以觉得很难,其实,只要熟 ...
- linux lamp实验报告,新手学Linux--构建lamp
本人前不久开始学习Linux,俗话说得好,好记性不如烂笔头,于是决定将平日所学所做实验,记录下来,以备回顾.由于本人是个初学者,所以借鉴了很多网上的资料,但在此处写出来的都是经过本人思考和多次实验的记 ...
- Linux其实没那么难学
互联网技术总是更新迭代的,因为2020年的一场疫情,影响着中国乃至整个世界,就在这一年,网络直播,远程办公,在线教育等等的互联网产物进入了众多人的世界,当然,这其中离不开程序员的功劳. 李开复曾经说过 ...
- 大学生为什么要学Linux?Linux有什么优点?
前言 Linux是一种自由和开放源码的类UNIX操作系统.Linux有必要学吗?学Linux有什么作用,学Linux能干什么?Linux最大的作用就是提高效率.当你习惯在Linux命令行下工作,再回到 ...
最新文章
- 设备物理像素、设备独立像素
- 再见 Maven,我用它!!!
- java删除指定的文件夹_java脚本删除指定目录下的所有指定名称的文件夹
- SQL SERVER数据库中 是否可以对视图进行修改删除
- WeChat授权Token验证体系:用token来隐藏微信用户的openid不用用户名与密码了, 与cookie与session很相似
- express框架+fetch/axios.js(本机实现跨域请求)
- nslookup查询结果详解
- java 泛型 类型形参(Type Parameters)Type Parameters 边界(Bound)
- 【DFS】LeetCode 51. N-Queens
- ps如何调出参考线?
- 利用python-pptx包批量修改ppt格式
- 动态规划经典例题——最长公共子序列和最长公共子串(python)
- 洪泰智造工场腾讯云创业加速营全球招募
- C++读取csv文件
- c++ 中字符串的字符数与字节数
- Linux服务器绑定mac与ip,Linux实现ip和mac绑定
- “大力神”正式由欧派接管
- MoviePy - 中文文档4-MoviePy实战案例-给MoviePy Logo做一个闪动的阴影效果
- FleaPHP 开发指南 - 7. 数据表关联
- KITTI结果评测流程
热门文章
- 7-2 jmu-Java-01入门-取数字 (2 分)
- Java黑皮书课后题第6章:*6.4(反序显示一个整数)使用下面的方法体编写方法,反序显示一个整数…例如reverse(3456)返回6543,编写一个测试程序,提示用户输入一个整数,然后显示它的反序
- android dp工具类,Android 单位px、dp、sp转换工具类
- window 任务管理器
- OpenCV C++ 08 - Homogeneous Blur on Images with OpenCV
- 进入Linux单用户模式
- bzoj 3277 串 后缀树+子树不同数个数
- 记一个简单的保护if 的sh脚本
- delphi VCL研究之消息分发机制(转)
- 内存泄漏了,咋回事?