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
文件里边:
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
。
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 讲》。