正则表达式旨在对字符串进行匹配,这在几乎所有语言中都有用到。当然bash中自然也不例外。linux支持正则表达式的工具主要有一下几种,即:vim、grep、awk、sed等等。首先对这些命令做一下简单
正则表达式旨在对字符串进行匹配,这在几乎所有语言中都有用到。当然bash中自然也不例外。linux支持正则表达式的工具主要有一下几种,即:vim、grep、awk、sed等等。首先对这些命令做一下简单的介绍。
grep命令用以以行为单位,对字符串进行匹配,输出符合匹配逻辑的行。grep的使用权限是所有用户。
- 格式:grep [OPTIONS] PATTERN [FILE...]
- 主要参数:
-c:只输出匹配行的计数。
-I:不区分大 小写(只适用于单字符)。
-h:查询多文件时不显示文件名。
-l:查询多文件时只输出包含匹配字符的文件名。
-n:显示匹配行及 行号。
-s:不显示不存在或无匹配文本的错误信息。
-v:显示不包含匹配文本的所有行。
- 示例:
grep -n 'the' test.txt #n显示行号8:I can't finish the test.12:the symbol '*' is represented as start.15:You are the best is mean you are the no. 1.16:The world <Happy> is the same with "glad".18:google is the best tools for search keyword.
grep -nvi 'A' test.txt #v是选择不满足条件的项、i不区分大小写4:this dress doesn't fit me.13:Oh! My god!17:I like dog.19:goooooogle yes!20:go! go! Let's go.
sed命令同样是以行为单位处理字符串,但是它可以对字符串进行增删改操作,然后输出至屏幕或者是文件
- 格式:sed [OPTION]... {script-only-if-no-other-script} [input-file]
- 主要参数:
-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。 -e :直接在命令列模式上进行 sed 的动作编辑; -f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作; -r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法) -i :直接修改读取的文件内容,而不是输出到终端。
- 函数:
a :新增,在下一行新增字符串 c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行! d :删除, i :插入,在上一行新增字符串 p :列印,在每一行后面输出字符串 s :替换,类似vim的替换
- 示例:
nl /etc/passwd | sed '2,5d' #按行打印passwd,删除2至5行1 root:x:0:0:root:/root:/bin/bash6 games:x:5:60:games:/usr/games:/usr/sbin/nologin7 man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
nl /etc/passwd | sed '2a hello' #在第三行加上hello1 root:x:0:0:root:/root:/bin/bash2 daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologinhello
nl /etc/passwd | sed -n '5,7p' #相当于 nl /etc/passwd | head -n 7 | tail -n 35 sync:x:4:65534:sync:/bin:/bin/sync6 games:x:5:60:games:/usr/games:/usr/sbin/nologin7 man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
介绍了使用正则的几个命令,接下来就是正则表达式的基本语法:
基础正则表达式匹配模式:
[abc]:满足方括号其中一个[a-z]:全体小写字母[A-Z]:全体大写字母[0-9]:全体数字 #在ascii表中连续就可以如此标示[^]:对条件取反 #方括号里^:行首 #eg. ^the:以the单词开头的行$:行末 #eg. /!$:以叹号结尾的行.:任意一个符号*:前一个符号重复任意多次(0~无穷){2}:限定前一符号重复次数(重复2次){2,5}:重复2-5次
上面是这些模式是grep等工具常用的匹配模式,当然这些有时候并不能满足我们的需要。因此,还有延伸正则表达式。
+:前一个字符重复一次以上?:零个或者是一个字符|:或():意义:找出“群组”字串 范例:搜寻 (glad)或 (good)这两个字串,因为g与d是重复的,所以我就可以将la与oo列于(la|oo)当中。
要使用这些匹配模式,需要用到egrep命令,相当与grep -e
egrep -n 'go+d' test.txtegrep -n 'go?d' test.txtegrep -n 'gd|good' test.txt egrep -n 'gd|good|dog' test.txt egrep -n 'g(la|oo)d' test.txt echo 'AxyzxyzxyzxyzC' | egrep 'A(xyz)+C'