Linux学习之正则表达式元字符和grep命令

cat /etc/redhat-release看到操作系统的版本是CentOS Linux release 7.6.1810 (Core),uname -r可以看到内核版本是3.10.0-957.21.3.el7.x86_64。

正则表达式是一种搜索字符串的模式,通俗点理解,也就是普通字符和元字符共同组成的字符集合匹配模式。正则表达式的主要作用是文本搜索和字符串处理。

正则表达式有两种:基本正则表达式;扩展正则表达式。

元字符就是一些具有特殊含义的字符,用于表示某种特定的字符类型或者行为,它的含义就不是显示在计算机上的含义了。基本正则表达式具有如下的元字符:

元字符 名称 作用 举例
. 点 .匹配除换行符之外的任意一个字符,只能匹配一个字符 234.6,就可以23416、23426、23436、23446、23456、23466、23476、234a6、234b6等,这里有点多,不一一列举了
* 星号 匹配*前一个字符或者一个正则表达式0至若干次 234*,就可匹配23+零个4或者多个4,比如23、234、2344、234444、234444...,而f[ae]*ll会匹配fall、fell、faall、faa...ll、fae...ll、feall、fea...ll、feell、fee...ll
^ 脱字符,插入符号,折字符 1.匹配一行的开始 2.否定正则表达式中一个字符串的意思 1.^123会匹配每行以123开头的字符串,2.[^a]会匹配没有a的字符串
$ 美元符号 匹配行尾 456$会匹配以456结尾的字符串
[] 方框号 匹配方括号内指定的字符集中的一个字符 [an]会匹配a和n,[b-d]会匹配b、c和d三个字符
\ 反斜线 转义一个特殊的字符,使这个字符得到字面意义的解释 \^就表示字符串^,不再表示匹配一行开始的意义,而\.就是表示字面含义的.,不再能够匹配任意字符
\<\> 转义尖括号 标记单词边界 尖括号必须是转义的,否则它们只有字符的字面含义。\<you\>就只能匹配you,不能匹配your

grep

grep命令在 Linux 中用于在文件中搜索特定的文本模式。

接下来使用grep来验证上边元字符的使用实例:

先使用下边的命令把一下字符串写到当前greptest.txt文件里边:

bash 复制代码
echo "god is good" >> greptest.txt
echo "good" >> greptest.txt
echo "good learning" >> greptest.txt
echo "a good learner" >> greptest.txt
echo "gold" >> greptest.txt
echo "1. gold jewelry" >> greptest.txt
echo "2. gold coins" >> greptest.txt
echo "3. gold medal" >> greptest.txt
echo "4. gold standard" >> greptest.txt
echo "5. gold mine" >> greptest.txt
echo "6. gold rush" >> greptest.txt
echo "7. goldsmith" >> greptest.txt
echo "8. gold bar" >> greptest.txt
echo "9. gold leaf" >> greptest.txt
echo "10. gold price" >> greptest.txt
echo "11. gold reserves" >> greptest.txt
echo "12. gold market" >> greptest.txt
echo "13. gold investment" >> greptest.txt
echo "14. gold necklace" >> greptest.txt
echo "15. gold watch" >> greptest.txt
echo "1 gold jewelry" >> greptest.txt
echo "2 gold coins" >> greptest.txt
echo "3 gold medal" >> greptest.txt
echo "4 gold standard" >> greptest.txt
echo "5 gold mine" >> greptest.txt
echo "6 gold rush" >> greptest.txt
echo "7 goldsmith" >> greptest.txt
echo "8 gold bar" >> greptest.txt
echo "9 gold leaf" >> greptest.txt
echo "10 gold price" >> greptest.txt
echo "11 gold reserves" >> greptest.txt
echo "12 gold market" >> greptest.txt
echo "13 gold investment" >> greptest.txt
echo "14 gold necklace" >> greptest.txt
echo "15 gold watch" >> greptest.txt


cat -n greptest.txt可以把行号在前,内容在后显示出来。

grep "." greptest.txt发现全部匹配了,可以看到所有的字符都显示红色了,需要注意的是grep会整行显示,就是说一行中只有有匹配的字符串,那么文件中这一行字符串都会显示,但是匹配的字符串会以红色显示。

grep -n "g.d" greptest.txt可以看到匹配greptest.txt里边的god,grep "g..d" greptest.txt匹配的是good和gold,注意冒号之前的绿色数字是文件内容里边对应的行号。

grep -n "go*d" greptest.txt可能匹配到god和good,使用cat -n greptest.txt | grep "go*d"也可以匹配到god和good,并且把内容中的行号也显示出来。这种显示格式有些不一样。

grep -n "^12" greptest.txt可以把以12开头的字符串匹配上,同样的,cat greptest.txt | grep "^12",也可以转换格式输出,但是可以实现相同的匹配功能,cat -n greptest.txt | grep "^12"就无法进行匹配了,因为cat -n在使用时会先输出多个空格然后在输出内容行号,之后再输出文件里边的内容。

grep "e$" greptest.txt可以匹配以e结尾的字符串,grep "good$" greptest.txt可以匹配以good结尾的字符串。

grep -n go[ol]d greptest.txt能够匹配good和gold,grep -n "1[234]" greptest.txt能够匹配12、13和14。

bash 复制代码
echo "$ ." >> greptest.txt
echo "*" >> greptest.txt

往greptest.txt里边写入$ .和*。

cat -n greptest.txt看一下内容。

grep "\$ \." greptest.txt能够匹配到$ .,grep -n "\*" greptest.txt能够匹配到*。

grep -n "goo" greptest.txt是匹配含有goo的字符串,而grep -n "\<goo\>" greptest.txt是完全匹配goo的字符串。

此文章为8月Day 4学习笔记,内容来源于极客时间《Linux 实战技能 100 讲》。

相关推荐
北京中科新远科技10 分钟前
高速接口兼容排查实战:OSFP、QSFP112与QSFP56如何逐层验证
linux·运维·网络
Ruiery15 分钟前
Linux 6.6内核 CPU 深度解析(零):x86 内核引导协议 — 从 bootloader 到 main()
linux·运维·服务器
Ruiery15 分钟前
Linux 6.6内核 CPU 深度解析(十六):x86 保护机制 — 从 ring 到页表的权限防线
linux·运维·服务器
qetfw26 分钟前
Linux 文件清理:find、mtime 与安全传参验证
linux·shell·1024程序员节
不老刘1 小时前
异构双 Agent 协同:构建无人值守的长任务自动化研发流水线
运维·人工智能·自动化·ai编程·1024程序员节
可乐_不渴1 小时前
【Linux】 项目自动化构建工具makefile&& 版本管理Git&&第一个程序
linux·git·自动化·1024程序员节
织码weavecodes1 小时前
医疗、零售、物业培训怎么落地?织码在线教育系统的三类行业案例
运维·服务器·零售
智能运维指南2 小时前
企业运维监控平台哪家好?2026年五大全栈可观测方案对比与选型推荐
大数据·运维·人工智能
乔旭伟2 小时前
部署形态选型笔记:多租户 SaaS 与单机本地部署的运维模型对比
运维·服务器·1024程序员节
西安同步电子2 小时前
时统卡驱动踩坑:Windows 和 Linux 下时间同步的底层差异
linux·stm32·单片机