grep与正则 - pingdongyi/blog-2 GitHub Wiki

正则表达式

  • . ----匹配除换行符以外的任意单个字符。在awk中,句点也能匹配换行符。
    • ----匹配任意一个(包括0个)在它前面的字符
  • [……] ---匹配方括号中的字符类中的任意一个。如果方括号中第一个字符为脱字符号^,则表示否定匹配,即匹配除了换行符和类中列出的那些字符以外的所有字符。在awk中,也匹配换行符。连字符(-)用于表示字符的范围。
  • ^ ----如果作为正则表达式的第一个字符,则表示匹配行的开始
  • $ ----如果作为正则表达式的最后一个字符,则表示匹配行的结尾。
  • {n,m} ---匹配它前面某个范围内单个字符出现的次数。{n}将匹配n次出现,{n.}至少匹配n次出现,{n,m}匹配n和m之间的任意次出现。
  • \ ----转义随后的特殊字符
    • ---匹配前面的正则表达式的一次或多次出现
  • ?----匹配前面的正则表达式的0次或一次出现
  • |----指定可以匹配其前面的或后面的正则表达式
  • ()---对正则表达式分组
  • [:alnum:]--可打印的字符(包括空白字符)
  • [:alpha:]--字母字符
  • [:blank:]--空格和制表符
  • ["cntrl:"]--控制字符
  • [:digit:]--数字字符
  • [:graph:]--可打印的和可见的(非空格)字符
  • [:lower:]--小写字符
  • [:print:]--可打印的字符(包括空白字符)
  • [:punct:]--标点符号字符
  • [:space:]--空白字符
  • [:upper:]--大写字符
  • [:xdigit:]--十六进制数字

grep命令

语法

grep [options] [pattern] [file]

在grep命令中输入的字符串最好用双引号括起来。这样做一是以防被误解为shell命令,二是可以用来查找多个单词组成的字符串。在调用变量时,也应该使用双引号;在调用模式匹配时,应该使用单引号。

常用options

  • -c 只输出匹配行的计数
  • -i 不区分大小写匹配(只适用于单个字符)
  • -h 查询多文件时不显示文件名
  • -l 查询多文件时只输出包含匹配字符的文件名
  • -n 显示匹配行及行号
  • -s 不显示不存在或无匹配文本的错误信息
  • -v 显示不包含匹配文件的所有行
  • -e 使用正则表达式匹配相应的内容的文件
  • -E 使用egrep等扩展正则表达式匹配相应内容的文件
  • -r,-R 递归在子目录中查找
  • --color 高亮显示匹配项

grep与正则表达式

  • 模式范围

    用[]来指定字符串范围:grep '48[34]' data.txt

  • 不匹配行首

    行首不是48的:grep '^[^48]' data.txt

  • 设置大小写

    使用-i关闭大小写匹配,即不区分大小写,这里可以使用[]抽取包含sep和Sep的信息:grep '[Ss]ep' data.txt

  • 匹配任意字符

    代码长度为5个字符且以L开头,以D结尾的:grep 'L...D' data.txt

  • 范围组合

    匹配第一个任意字符,第二个在0-5之间,第三个在0-6之间:grep '[0-9][0-5][0-6]' data.txt

  • 模式出现机率

    抽取包含数字4至少重复出现两次的所有行:grep '4\{2,\}' data.txt

  • 使用grep匹配'与'或'或'模式

    加参数-E,可以使用扩展模式匹配:grep -E '219|216' data.txt

  • 匹配特殊字符

    查询特殊含义的字符,要加转义符,如:grep '\.' data.txt 查询包含'.'的所有行

  • 空行

    结合使用^和$可查询空行。使用-n参数显示实际行数:grep '^$' data.txt

egrep

egrep是扩展的grep,接受所有的正则表达式,一个显著特性是可以以一个文件作为保存的字符串,然后将之传给egrep作为参数,为此使用-f开关,如

pg grepstrings
484
47
egrep -f grepstrings data.txt

来匹配data.txt中包含484或47的所有记录

⚠️ **GitHub.com Fallback** ⚠️