文章目录
6、grep之正则表达式
1.自学书上的
- 在正则表达式中,空格和其他字符没有什么区别。
- 正则表达式识别的字符包括:
*[]^${}\+?|()
,如果要使用某个字符作为文本字符就必须要使用转义字符\
。 - 正则表达式模式都区分大小写。
- 默认情况下,当指定一个正则表达式模式时,只要模式出现在数据流中的任何地方,它就能匹配。有两个特殊字符可以用来将模式锁定在数据流中的行首或行尾。
- 脱字符
^
定义从数据流中文本行的行首开始的模式。如果模式出现在行首之外的位置,正则表达式模式则无法匹配。 - 跟在行首查找模式相反的就是在行尾查找。特殊字符美元符
$
定义了行尾锚点。将这个特殊字符放在文本模式之后来指明数据行必须以该文本模式结尾。 - 特殊字符点号
.
用来匹配除换行符之外的任意单个字符。它必须匹配一个字符,如果在点号字符的位置没有字符,那么模式就不成立。 - 使用方括号来定义一个字符组。方括号
[]
中包含所有你希望出现在该字符组中的字符。方括号加上方括号中的所有东西就相当于一个点,只不过有限制条件,而这个限制条件就是方括号中的内容。当不确定字符的大小写,字符组会非常的有用。 - 在正则表达式模式中,也可以反转字符组的作用。可以寻找组中没有的字符,而不是去寻找组中含有的字符。要这么做的话,只要在字符组的开头加个脱字符
^
。 - 可以用单破折线符号
-
在字符组中表示字符区间。只需要指定区间的第一个字符、单破折线以及区间的最后一个字符就行了。 - 在字符后面放置星号
*
表明该字符必须在匹配模式的文本中出现0次或多次。 - 记住,sed编辑器和gawk程序的正则表达式引擎之间是有区别的。 gawk程序可以使用大多数扩展正则表达式模式符号,并且能提供一些额外过滤功能,而这些功能都是sed编辑器所不具备的。但正因为如此, gawk程序在处理数据流时通常才比较慢。
ERE
- 问号
?
类似于星号,不过有点细微的不同。问号表明前面的字符可以出现0次或1次,但只限于此。它不会匹配多次出现的字符。 - 加号
+
是类似于星号的另一个模式符号,但跟问号也有不同。加号表明前面的字符可以出现1次或多次,但必须至少出现1次。如果该字符没有出现,那么模式就不会匹配。 - ERE中的花括号
{}
允许你为可重复的正则表达式指定一个上限。这通常称为间隔(interval)。可以用两种格式来指定区间
- m:正则表达式准确出现m次。
- m, n:正则表达式至少出现m次,至多n次。
- 默认情况下, gawk程序不会识别正则表达式间隔。必须指定gawk程序的
--re- interval
命令行选项才能识别正则表达式间隔。
- 管道符号
|
允许你在检查数据流时,用逻辑OR方式指定正则表达式引擎要用的两个或多个模式。如果任何一个模式匹配了数据流文本,文本就通过测试。如果没有模式匹配,则数据流文本
匹配失败。注意 正则表达式和管道符号之间不能有空格,否则它们也会被认为是正则表达式模式的一部分。管道符号两侧的正则表达式可以采用任何正则表达式模式(包括字符组)来定义文本。 - 正则表达式模式也可以用圆括号
()
进行分组。当你将正则表达式模式分组时,该组会被视为一个标准字符。可以像对普通字符一样给该组使用特殊字符。
实际操作实例:
echo "The book store" | sed -n '/^book/p' #啥也不返回
echo "Books are great" | sed -n '/^Book/p' #返回这行字符串
echo "This is a good book" | sed -n '/book$/p' #返回这行字符串
echo "This book is good" | sed -n '/book$/p' #啥也不返回
sed -n '/^this is a test$/p' test.txt #返回文本文件中特定行
sed '/^$/d' test.txt #滤掉文本中的空行,将其他行输出。
sed -n '/.at/p' test.txt
sed -n '/[ch]at/p' test.txt #匹配存在 cat 或者 hat 的行并输出
sed -n '/[^ch]at/p' test.txt #匹配除了ch之外的其他字符+at,并输出
echo "I'm getting too fat." | sed -n '/[a-ch-m]at/p'
echo "iek" | sed -n '/ie*k/p' #iek
echo "bt" | gawk --re-interval '/be{1}t/{print $0}' #null
echo "bet" | gawk --re-interval '/be{1}t/{print $0}' #bet
echo "beet" | gawk --re-interval '/be{1}t/{print $0}' #null
echo "The cat is asleep" | gawk '/cat|dog/{print $0}' #The cat is asleep
echo "sat" | gawk '/sat(urday)?/{print $0}' #sat
2.课件上的
global regular expression printing(grep)
正则表达式是使用某种模式(pattern)去匹配(matching)一类字符串的一个公式。
• 通常使用正则表达式进行查找、替换等操作。
• 在适当的情况下使用正则表达式可以极大地提高工作效率。
• 有两种风格的正则表达式:
- POSIX 风格的正则表达式
- Perl 风格的正则表达式( Perl‐compatible regular expression)
POSIX基础正则表达式( basic regular expression, BRE)引擎
POSIX扩展正则表达式( extended regular expression,ERE)引擎
正则表达式由一些普通字符和一些元字符(metacharacters)组成。
- 普通字符包括大小写的字母、数字(即所有非元字符)
- 元字符则具有特殊的含义
元字符 | 含义 | 类型 | 举例 | 说明 |
---|---|---|---|---|
^ |
匹配首字符 | BRE | ^x |
以字符x开始的字符串 |
$ |
匹配尾字符 | BRE | x$ |
以x字符结尾的字符串 |
. |
匹配任意一个字符 | BRE | l..e |
love, life, live … |
? |
匹配任意一个可选字符 | ERE | xy? |
x, xy |
* |
匹配零次或多次重复 | BRE | xy* |
x, xy, xyy, xyyy … |
+ |
匹配一次或多次重复 | ERE | xy+ |
xy, xyy, xyyy… |
[...] |
匹配任意一个字符 | BRE | [xyz] |
x, y,z |
() |
对正则表达式分组 | ERE | (xy)+ |
xy, xyxy, xyxyxy, … |
\{n\} |
匹配n次 | BRE | go\{2\}gle |
|
\{n,\} |
匹配最少n次 | BRE | go\{2,\}gle |
google, gooogle,goooogle … |
\{n,m\} |
匹配n到m次 | BRE | go\{2,4\}gle |
google,gooogle,goooogle |
{n} |
匹配n次 | ERE | go{2}]gle |
|
{n,} |
匹配最少n次 | ERE | go{2,}gle |
google,gooogle, |
{n,m} |
匹配n到m次 | ERE | go{2,4}gle |
google,gooogle,goooogle |
| |
以或逻辑连接多个匹配 | ERE | good|bon |
匹配good或bon |
\ |
转义字符 | BRE | \* |
* |
^ |
非 | BRE | [^xyz] |
匹配xyz之外的任意一个字符 |
- |
用于指明字符范围 | BRE | [a-zA-Z] |
匹配任意一个字母 |
\ |
转义字符 | BRE | [.] |
. |
BRE 特殊字符组 - 常用范围表示区间:
字符 | 含义 |
---|---|
[[:digit:]] |
表示所有数字[0‐9] |
[[:lower:]] |
表示所有小写字母,等同于[a‐z] |
[[:upper:]] |
表示所有大写字母,等同于[A‐Z] |
[[:alpha:]] |
表示所有字母,等同于[a‐zA‐Z] |
[[:alnum:]] |
表示所有字母和数字,等同于[a‐zA‐Z0‐9] |
[[:graph:]] |
表示所有非空字符(不包含空格和控制字符) |
[[:cntrl:]] |
表示所有控制字符 |
[[:punct:]] |
表示所有标点符号 |
[[:print:]] |
表示所有非空字符(包含空格) |
[[:space:]] |
表示空白字符 |
grep [选项] ‘匹配模式’ 搜索的文件
参数
- ‐v :反向选取,列出不匹配串或正则表达式的行
- ‐c:对匹配的行计数
- ‐l :只显示包含匹配的文件的文件名
- ‐h :抑制包含匹配文件的文件名的显示
- ‐n :每个匹配行只按照相对的行号显示
- ‐i :产生不区分大小写的匹配,缺省状态是区分大小写
- ‐o :仅显示匹配到的内容
- -A n 匹配行+后面n行
- -B n 匹配行+前面n行
- -C n 匹配行+前后的行
- –color=auto 高亮显示匹配的字符,放在最后
- -f 模式匹配文件,
grep ‐f pattern_file grep_test_file
,这个目前不会 - -e 多模式匹配,类似于sed 里面的 -e
.*
nb
grep 用法简单示例:
正则表达式 | 含义 | 例子 |
---|---|---|
^this |
所有以this开始的字符串 | echo ‐e "this testing\nhello"|grep '^this' |
testing$ |
所有以testing结尾的字符串 | echo ‐e "this testing\nhello"|grep 'testing$' |
^hello$ |
hello字符串 | echo ‐e "this testing\nhello"|grep '^hello$' |
this |
任意位置含有this的字符串 | echo ‐e "testing this\nhello"|grep 'this' |
tes* |
任意位置含有tes字符的字符串 | echo ‐e "testing this\nhello"|grep 'tes*' |
te. |
任意位置含有te.的字符 | echo ‐e "test\nstet\ntt"|grep 'te.' |
[st]t |
任意位置含有st或tt或stt | echo ‐e "test\nabc\ntt"|grep '[st]t' |
[s|t]t |
任意位置含有st或tt或stt | echo ‐e "test\nattb\nct\nstt"|grep '[s|t]t' |
ab\{2\} |
a后面跟着2个b (abb) | echo ‐e "ab\nabb\nabc"|grep 'ab\{2\}' |
ab\{1,2\} |
a后面跟着1到2个b (ab,abb) | echo ‐e "ab\nabb\nabc"|grep 'ab\{1,2\}' |
ab[0‐9] |
ab后面跟着0到9的一个数字 | echo ‐e "ab\nab1\nab2"|grep 'ab[0‐9]' |
\(ab\).*\1 |
查找abab或者 abxxxab | echo ‐e "abab\nab ab\nabc"|grep '\(ab\).*\1' |
grep用法之位置锁定
^
:行首锚定;用于模式的最左侧,^PATTERN
$
:行尾锚定;用于模式的最右侧,PATTERN$
^PATTERN$
:要让PATTERN完全匹配一整行^$
:空行^[[:space:]]*$
:空行或者只有空白字符的行\<
:词首锚定,用于单词模式的左侧,格式为\<PATTER
\>
:词尾锚定,用于单词模式的右侧,格式为PATTERN\>
\<PATTERN\>
:单词锚定
grep用法之分组与后向引
\( \)
:对某字符串进行分组匹配\(PATTERN\)
:将此PATTERN
匹配到的字符当作一个整体进
行处理;- 注意:分组括号中的模式匹配到的字符会被正则表达式引擎自动记录于内部的变量中
- 后向引用:模式中,如果使用
\(\)
实现了分组,在某行文本的检查中,如果()的模式匹配到了某内容,此内容在后面可以被引用; - 对前面的分组进行引用的符号为: \1 , \2 ,\3
一个nb的例子:
echo -e "\"ab\"\n'cd'\nef\n\"gh'\n'ij\"\nthis\nit's\n\"'sgg\"'"
echo -e "\"ab\"\n'cd'\nef\n\"gh'\n'ij\"\nthis\nit's\n\"'sgg'\"" | grep "\([\"']\).*\1"
#"ab"
#'cd'
#"'sgg'" 把最后的' 和" 调换位置,结果不变,但是最后的'不会高亮显示了
echo -e "\"ab\"\n'cd'\nef\n\"gh'\n'ij\"\nthis\nit's\n\"'sgg\"'" | grep "\([\"']\).*\1" | sed "/\"'.*\"'/d"
对其解释如下:
第一个命令将这一大串东西是啥搞出来
第二个命令查找
第三个命令把查找的结果作为sed的输入,删除符合某种条件的字符。
3.总结
上面记得有点乱,现将主要的内容总结如下:
1、gawk程序可以使用大多数扩展正则表达式模式符号,并且能提供一些额外过滤功能,而这些功能都是sed编辑器所不具备的。但正因为如此, gawk程序在处理数据流时通常才比较慢。
2、.*
nb
3、元字符*[]^${}\+?|()
元字符 | 含义 | 类型 |
---|---|---|
^ |
匹配首字符 | BRE |
$ |
匹配尾字符 | BRE |
. |
匹配任意一个字符 | BRE |
? |
匹配任意一个可选字符 | ERE |
* |
匹配零次或多次重复 | BRE |
+ |
匹配一次或多次重复 | ERE |
[...] |
匹配任意一个字符 | BRE |
() |
对正则表达式分组 | ERE |
\{n\} |
匹配n次 | BRE |
\{n,\} |
匹配最少n次 | BRE |
\{n,m\} |
匹配n到m次 | BRE |
{n} |
匹配n次 | ERE |
{n,} |
匹配最少n次 | ERE |
{n,m} |
匹配n到m次 | ERE |
| |
以或逻辑连接多个匹配 | ERE |
\ |
转义字符 | BRE |
^ |
非 | BRE |
- |
用于指明字符范围 | BRE |
\ |
转义字符 | BRE |
4、grep [选项] '匹配模式' 搜索的文件
参数
- ‐v :反向选取,列出不匹配串或正则表达式的行
- ‐c:对匹配的行计数
- ‐l :只显示包含匹配的文件的文件名
- ‐h :抑制包含匹配文件的文件名的显示
- ‐n :每个匹配行只按照相对的行号显示
- ‐i :产生不区分大小写的匹配,缺省状态是区分大小写
- ‐o :仅显示匹配到的内容
- -A n 匹配行+后面n行
- -B n 匹配行+前面n行
- -C n 匹配行+前后的行
- –color=auto 高亮显示匹配的字符,放在最后
- -f 模式匹配文件,
grep ‐f pattern_file grep_test_file
,这个目前不会 - -e 多模式匹配,类似于sed 里面的 -e