12.grep -- 正则表达式
元字符
^- 作用:匹配行首位置。即表示其后的字符必须出现在一行的开头。
- 示例:在文件
test.txt中查找以“hello”开头的行,使用grep '^hello' test.txt。如果文件中有一行是“hello world”,则会被匹配输出;而“world hello”不会被匹配。
$- 作用:匹配行尾位置。即表示其前的字符必须出现在一行的末尾。
- 示例:查找以“world”结尾的行,
grep 'world$' test.txt。若文件中有一行是“hello world”,则能匹配到;“world hello”则不能匹配。
.- 作用:匹配除换行符(
\n)之外的任意单个字符。 - 示例:要查找包含“h.l”形式的行,其中“.”处为任意字符,使用
grep 'h.l' test.txt。像“hal”“hel”“h#l”等形式的行都会被匹配。
- 作用:匹配除换行符(
\- 作用:转义字符。用于将特殊字符(元字符)转换为普通字符,或者赋予普通字符特殊含义。
- 示例:若要查找包含点号(
.)的行,因为点号在正则表达式中有特殊含义,所以需用\转义,即grep '\.' test.txt。若要匹配花括号({和}),同样需要转义,如grep '\{' test.txt(用于匹配左花括号)。
*- 作用:表示其前面的字符可以出现0次或多次(包括0次)。
- 示例:查找包含“go”且“o”可以出现任意次(包括0次)的行,
grep 'go*' test.txt。这会匹配“g”“go”“goo”“gooo”等形式的字符串所在的行。
[]- 作用:字符集合。匹配方括号内的任意一个字符。
- 示例:查找包含“colou?r”(英式英语“colour”和美式英语“color”)的行,可使用
grep 'colou[ou]r' test.txt。或者查找包含数字0 - 9中任意一个数字的行,grep '[0 - 9]' test.txt。
[^]- 作用:反向字符集合。匹配不在方括号内的任意一个字符。
- 示例:查找不包含数字的行,
grep '[^0 - 9]' test.txt。即只要行中存在一个非数字字符,该行就会被匹配。
[n1 - n2]- 作用:字符范围。匹配从
n1到n2的任意一个字符。n1和n2可以是数字、字母等。 - 示例:查找包含小写字母
a到z中任意一个字母的行,grep '[a - z]' test.txt;查找包含数字3到7中任意一个数字的行,grep '[3 - 7]' test.txt。
- 作用:字符范围。匹配从
\{n\}- 作用:表示其前面的字符恰好出现
n次。在基础正则表达式中,花括号需要转义。 - 示例:查找包含连续两个“o”的行,
grep 'o\{2\}' test.txt。只有包含“oo”的行才会被匹配,“o”“ooo”等不会匹配。
- 作用:表示其前面的字符恰好出现
\{n,\}- 作用:表示其前面的字符至少出现
n次。同样,在基础正则表达式中花括号需转义。 - 示例:查找包含至少三个“a”的行,
grep 'a\{3,\}' test.txt。“aaa”“aaaa”“aaaaa”等形式所在的行都会被匹配。
- 作用:表示其前面的字符至少出现
\{n,m\}- 作用:表示其前面的字符出现次数介于
n到m次之间(包括n和m)。在基础正则表达式中花括号需转义。 - 示例:查找包含2到4个“e”的行,
grep 'e\{2,4\}' test.txt。“ee”“eee”“eeee”所在的行都会被匹配,“e”“eeeee”则不会匹配。
- 作用:表示其前面的字符出现次数介于
在扩展正则表达式(ERE,如在 grep -E 或 sed -r 中使用)中,部分元字符不需要转义,
例如 {n}、{n,}、{n,m} 等无需使用 \ 转义。
扩展正则表达式
+- 作用:表示其前面的字符或字符组至少出现一次,即出现一次或多次。它与基础正则表达式中的
*类似,但*允许字符出现0次或多次,而+要求至少出现一次。 - 示例:在文件中查找包含至少一个数字的行,使用扩展正则表达式可写为
grep -E '[0 - 9]+' file.txt。如果文件中有“123”“45”“7” 等包含数字的行,都会被匹配输出,而不包含数字的行则不会被匹配。
- 作用:表示其前面的字符或字符组至少出现一次,即出现一次或多次。它与基础正则表达式中的
?- 作用:表示其前面的字符或字符组出现0次或1次,即该字符或字符组是可选的。
- 示例:若要匹配英式英语“colour”和美式英语“color”,可以用
grep -E 'colou?r' file.txt。这里“u”后面跟着的“?”表示“u”是可选的,所以两种拼写形式所在的行都会被匹配。
|- 作用:逻辑或操作符。用于匹配
|两边的任意一个模式。 - 示例:查找包含“apple”或者“banana”的行,命令为
grep -E 'apple|banana' file.txt。文件中只要包含“apple”或“banana”其中之一的行都会被输出。
- 作用:逻辑或操作符。用于匹配
()- 作用:用于分组,将括号内的内容作为一个整体进行操作。这样可以对一组字符应用
+、*、?等元字符,或者用于逻辑或操作的分组。 - 示例:假设要匹配“redcar”或“bluecar”,可以写成
grep -E '(red|blue)car' file.txt。这里(red|blue)作为一个整体,匹配“red”或者“blue”,然后再匹配后面的“car”。
- 作用:用于分组,将括号内的内容作为一个整体进行操作。这样可以对一组字符应用
()+- 作用:结合了分组
()和+的功能。表示括号内的字符组至少出现一次。 - 示例:若要匹配“ab”“abab”“ababab”等由“ab”重复至少一次组成的字符串所在的行,可以使用
grep -E '(ab)+' file.txt。这里(ab)作为一组,+表示这组至少出现一次。
- 作用:结合了分组
grep
查找特定字符
grep -n ‘the’ text.txt
包含字符串“the”的行,并显示行号。
grep -in ‘the’ text.txt
包含字符串“the”的行,并显示行号,-i选项使搜索不区分大小写。
grep -vn ‘the’ text.txt
不包含字符串“the”的行,并显示行号,-v选项表示反向匹配。
grep -n ‘sh[io]rt’ text.txt
包含“short”或“shirt”的行,并显示行号。中括号内的字符表示匹配其中任意一个字符。
grep -n ‘oo’ text.txt
包含连续两个“o”的行,并显示行号。
grep -n ‘[^w]oo’ text.txt
查找“oo”前面不是“w”的行,并显示行号。中括号内的“^”表示取反。
grep -n ‘[^a-z]oo’ text.txt
查找“oo”前面不是小写字母的行,并显示行号。
grep -n ‘[0-9]’ text.txt
查找包含数字(0 - 9 中的任意一个)的行,并显示行号。
grep -n ‘^the’ text.txt
查找以“the”开头的行,并显示行号。“^”表示匹配行首。
grep -n ‘^ [a-z]’ text.txt
查找以小写字母开头的行,并显示行号。
grep -n ‘^ [A-Z]’ text.txt
查找以大写字母开头的行,并显示行号。
grep -n ‘[a-zA-Z]’ text.txt
查找不以字母(大写或小写)开头的行,并显示行号。
grep -n ‘.$’ text.txt
查找以点号(.)结尾的行,并显示行号。由于点号在正则表达式中有特殊含义,所以需要使用反斜杠转义。
grep -n ‘^$’ text.txt
查找空行,并显示行号。“^”和“$”连在一起表示匹配空行(行首紧接着行尾)。
grep -n ‘w…d’ text.txt
查找以“w”开头,后面跟着任意两个字符,再以“d”结尾的行,并显示行号。点号(.)表示匹配任意单个字符(除换行符外)。
grep -n ‘ooo*’ text.txt
查找包含“o”,并且“o”可以重复0次或多次的行,并显示行号。“*”表示其前面的字符可以出现0次或多次。
grep -n ‘woo*d’ text.txt
查找以“w”开头,中间有一个“o”且“o”可以重复0次或多次,再以“d”结尾的行,并显示行号。
grep -n ‘w*d’ text.txt
查找以“w”开头(“w”可以出现0次或多次),再以“d”结尾的行,并显示行号。
grep -n ‘[0-9][0-9]*’ text.txt
查找包含至少一个数字(第一个数字后可以跟0个或多个数字)的行,并显示行号。
grep -n ‘o{2}’ text.txt
查找包含连续两个“o”的行,并显示行号。这里“{2}" 明确表示前面的字符“o”要连续出现2次。在基础正则表达式中,大括号需要转义。
grep -n ‘wo{2,5}d’ text.txt
查找以“w”开头,中间的“o”连续出现2到5次,再以“d”结尾的行,并显示行号。“{2,5}" 表示前面的字符“o”出现的次数范围。
grep -n ‘wo{2,}d’ text.txt
查找以“w”开头,中间的“o”连续出现至少2次,再以“d”结尾的行,并显示行号。“{2,}" 表示前面的字符“o”出现至少2次。
更多推荐
所有评论(0)