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 讲》。

相关推荐
讯捷蓝达1 小时前
戴尔R720xd服务器卡死在 “Configuring Memory...Done“,换了内存还是卡?问题根本不在内存
运维·服务器
且从容.2 小时前
ubuntu安装flink
linux·ubuntu·flink
爱和冰阔落4 小时前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
程序员沉梦听雨4 小时前
WSL2的安装与使用
linux·wsl
微小的鱼4 小时前
Linux的渲染与显示系统链路
android·java·linux
lisanmengmeng4 小时前
alertmanger 标签 rules 打上分组标签
linux·运维·服务器
Android系统攻城狮5 小时前
Linux FFmpeg深度解析之av_write_frame调用流程与实战(三十三)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频
上火的金鱼妹5 小时前
k8s生产实际问题排查(网关,数据库读写等)
运维·服务器
孙克旭_5 小时前
k8s基础组件与创建资源
运维·docker·容器·kubernetes
孙克旭_6 小时前
云原生基础之Containerd容器运行时
运维·云原生