元字符

  1. ^
    • 作用:匹配行首位置。即表示其后的字符必须出现在一行的开头。
    • 示例:在文件 test.txt 中查找以“hello”开头的行,使用 grep '^hello' test.txt。如果文件中有一行是“hello world”,则会被匹配输出;而“world hello”不会被匹配。
  2. $
    • 作用:匹配行尾位置。即表示其前的字符必须出现在一行的末尾。
    • 示例:查找以“world”结尾的行,grep 'world$' test.txt。若文件中有一行是“hello world”,则能匹配到;“world hello”则不能匹配。
  3. .
    • 作用:匹配除换行符(\n)之外的任意单个字符。
    • 示例:要查找包含“h.l”形式的行,其中“.”处为任意字符,使用 grep 'h.l' test.txt。像“hal”“hel”“h#l”等形式的行都会被匹配。
  4. \
    • 作用:转义字符。用于将特殊字符(元字符)转换为普通字符,或者赋予普通字符特殊含义。
    • 示例:若要查找包含点号(.)的行,因为点号在正则表达式中有特殊含义,所以需用 \ 转义,即 grep '\.' test.txt。若要匹配花括号({}),同样需要转义,如 grep '\{' test.txt(用于匹配左花括号)。
  5. *
    • 作用:表示其前面的字符可以出现0次或多次(包括0次)。
    • 示例:查找包含“go”且“o”可以出现任意次(包括0次)的行,grep 'go*' test.txt。这会匹配“g”“go”“goo”“gooo”等形式的字符串所在的行。
  6. []
    • 作用:字符集合。匹配方括号内的任意一个字符。
    • 示例:查找包含“colou?r”(英式英语“colour”和美式英语“color”)的行,可使用 grep 'colou[ou]r' test.txt。或者查找包含数字0 - 9中任意一个数字的行,grep '[0 - 9]' test.txt
  7. [^]
    • 作用:反向字符集合。匹配不在方括号内的任意一个字符。
    • 示例:查找不包含数字的行,grep '[^0 - 9]' test.txt。即只要行中存在一个非数字字符,该行就会被匹配。
  8. [n1 - n2]
    • 作用:字符范围。匹配从 n1n2 的任意一个字符。n1n2 可以是数字、字母等。
    • 示例:查找包含小写字母 az 中任意一个字母的行,grep '[a - z]' test.txt;查找包含数字 37 中任意一个数字的行,grep '[3 - 7]' test.txt
  9. \{n\}
    • 作用:表示其前面的字符恰好出现 n 次。在基础正则表达式中,花括号需要转义。
    • 示例:查找包含连续两个“o”的行,grep 'o\{2\}' test.txt。只有包含“oo”的行才会被匹配,“o”“ooo”等不会匹配。
  10. \{n,\}
    • 作用:表示其前面的字符至少出现 n 次。同样,在基础正则表达式中花括号需转义。
    • 示例:查找包含至少三个“a”的行,grep 'a\{3,\}' test.txt。“aaa”“aaaa”“aaaaa”等形式所在的行都会被匹配。
  11. \{n,m\}
    • 作用:表示其前面的字符出现次数介于 nm 次之间(包括 nm)。在基础正则表达式中花括号需转义。
    • 示例:查找包含2到4个“e”的行,grep 'e\{2,4\}' test.txt。“ee”“eee”“eeee”所在的行都会被匹配,“e”“eeeee”则不会匹配。

在扩展正则表达式(ERE,如在 grep -Esed -r 中使用)中,部分元字符不需要转义,
例如 {n}{n,}{n,m} 等无需使用 \ 转义。

扩展正则表达式

  1. +
    • 作用:表示其前面的字符或字符组至少出现一次,即出现一次或多次。它与基础正则表达式中的 * 类似,但 * 允许字符出现0次或多次,而 + 要求至少出现一次。
    • 示例:在文件中查找包含至少一个数字的行,使用扩展正则表达式可写为 grep -E '[0 - 9]+' file.txt。如果文件中有“123”“45”“7” 等包含数字的行,都会被匹配输出,而不包含数字的行则不会被匹配。
  2. ?
    • 作用:表示其前面的字符或字符组出现0次或1次,即该字符或字符组是可选的。
    • 示例:若要匹配英式英语“colour”和美式英语“color”,可以用 grep -E 'colou?r' file.txt。这里“u”后面跟着的“?”表示“u”是可选的,所以两种拼写形式所在的行都会被匹配。
  3. |
    • 作用:逻辑或操作符。用于匹配 | 两边的任意一个模式。
    • 示例:查找包含“apple”或者“banana”的行,命令为 grep -E 'apple|banana' file.txt。文件中只要包含“apple”或“banana”其中之一的行都会被输出。
  4. ()
    • 作用:用于分组,将括号内的内容作为一个整体进行操作。这样可以对一组字符应用 +*? 等元字符,或者用于逻辑或操作的分组。
    • 示例:假设要匹配“redcar”或“bluecar”,可以写成 grep -E '(red|blue)car' file.txt。这里 (red|blue) 作为一个整体,匹配“red”或者“blue”,然后再匹配后面的“car”。
  5. ()+
    • 作用:结合了分组 ()+ 的功能。表示括号内的字符组至少出现一次。
    • 示例:若要匹配“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次。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐