grep、egrep、fgrep命令与基本正则表达式及文本处理工具
grep: Global search REgular exprseeion and Print out the line
作用:文本搜索工具,根据用户指定的模式对目标文本逐行进行匹配检查:打印匹配到的行
模式:由正则表达式的元字符及文本字符所编写出的过滤条件;
正则表达式引擎:
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
OPTIONS:
--color=auto:对匹配到的文本着色后高亮显示
-l:lgnorecase,忽略字符的大小写
-o:仅显示匹配到的字符本身
-v,--invert-match:显示不能被模式匹配到的行
-E:支持使用扩展的正则表达式元字符
-q,--quiet,--silent:静默模式,不输出任何内容
-A#:显示后#行
-B#:显示前#行
-C#:显示前后#行
基本正则表达式元字符:
字符匹配:
.:匹配任意单个字符;
[]:匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符
匹配次数:用于要指定其出现的次数的字符后面,:默认工作与贪婪模式
*:匹配其前面字符的任意次:0,1,多次
例如:grep "x*y":匹配y钱的任意x到第一个y
.*:匹配任意长度的任意字符
\?:匹配其前面的字符0次货1次:即前面的字符式可有可无的
\+:匹配其前面的字符一次或多次:即前面的字符出现至少一次
\{m}\:匹配其前面的字符m次
\{m,n\}:匹配其前面的字符至少m次,至多n次
\[0,n}:至多n次 ; \{m,\}:至少m次
位置锚定
^:行首锚定:用于模式的最左侧;
$:行尾锚定:用于模式的最右侧;
^PATTERN$:用PATTRNS来匹配整行;
^$:空白行;
^[[:space:]]*$:空行或包含空白字符的行;
单词:非特殊字符组成的连续字符(字符串)都称为单词;
\< 或 \b:词首锚定,用于单词模式的左侧
\> 或 \b:词尾锚定,用于单词模式的右侧
\<PATTERN\>:匹配完整单词;
练习:
1、显示/etc/passwd文件中不以/bin/bash结尾的行;grep -v "/bin/bash$" /etc/passwd
2、找出/etc/passwd文件中两位数或三位数;grep "\<[0-9]\{2,3\}\>" /etc/passwd
3、找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中,至少一一个空白字符开头,且以非空白字符结尾;grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg
4、找出“netstat -tan”命令结果中以LISTE后跟0、1或多个空白字符结尾的行;netstat -tan | grep "LISTEN[[:space:]]*$"
分组及引用:
\(\):将一个或多个字符捆绑在一起,当作一个整体进行处理:
\(xy\)*ab
Note:分组括号中的模式匹配到的内容会被正则表达式引擎自动内部的变量中,这些变量为:
\1:模式从左侧起,第一个左括号与之匹配的右括号直接的模式所匹配到的字符
\2:模式从左侧起,第二个左括号与之匹配的右括号直接的模式所匹配到的字符
He loves his loves
He likes his lover
She likes his lover
She loves her liker
grep "\(l..e).*\1"
后向引用:引用前面的分组括号中的模式所匹配到的字符;
egrep:
支持扩展的正则表达式实现类似于grep文本的过滤功能:grep -E
egrep [OPTIONS] PATTERN [FILE...]
-l, -o, -v, -q, -A, -B, -C
-G:支持基本正则表达式
扩展正则表达式:
字符匹配:
.:匹配任意单个字符;
[]:匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符
次数匹配:
*:任意次,0,1或多次
?:0次或1次,其前的字符可有可无
+:其前的字符至少1次
{M}:其前的字符m次
{m,n}:至少m次,至多n次
位置锚定:
^:行首锚定
$:行尾锚定
\<,\b:词首锚定
\>,\b:词尾锚定
分组及引用:
a | b:a或者b:
C | cat:C或者cat
(c | C)at:cat或者Cat
练习:
1、找出proc/meminfo文件中,所有在大写或小写S开头的行:至少三种
# grep -i "^s" /proc/meminfo
# grep "^[sS]" /proc/meminfo
# grep -E "^(s|S)" /proc/meminfo
2、显示当前系统上root、centos或user1用户的相关信息
# grep -E ^"(root|user1|centos)\>" /etc/passwd
3、找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行;
# grep -E -o "[_[[:alnum:]]+\(\)" /etc/rc.d/init.d/functions
4、使用echo命令输出一绝对路径,使用egrop去除基民;
# echo /etc/sysconfig | grep -E -o "[^/]+/?$"
5、找出ifconfig命令结果中的1-255之间的数值
# ifconfig | grep -E -o "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"
6、找出ifconfig命令结果中的IP地址;
ifconfig | grep -o -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
7、添加用户bash,testbash,basher以及nologin(其shell为/sbin/nologin);而后找出/etc/passwd文件中用户名同shell名的行
grep -E -o "^([^:]+\>).*1$" /etc/passwd
fgerp:不支持正则表达式:
当无需用到元字符去编写模式式,使用fgrep性能更好
文本查看及处理工具:wc,cut,sort,uniq,diff,patch
wc:word count
wc [OPTION]... [FILE]...
-l:行数
-w:词数
-c:字节
cut:
cut OPTION... [FILE]...
-d:CHAR以指定的字符为分隔符;
-f FIELDS:挑选出的字段:
#:指定的单个字段
#-#:连续的多个字段
#,#:离散的多个字符
sort:
sort sort [OPTION]... [FILE]...
-n:基于数值大小排序
-t CHAR:指定分隔符;
-k #:用于排序比较的字段
-r:逆序排序
-f:忽略字符大小写
-u:重复的行只保留一份
uniq:报告或移除重复的行
uniq uniq [OPTION]... [INPUT [OUTPUT]]
-c:显示每行的重复次数
-u:仅显示未曾重复过的行
-d:仅显示重复过的行
diff:逐行比较文件的不同内容
diff [OPTION]... FILES
diff
patch:向文件打补丁
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了