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 [options] [pattern] [file]
在grep命令中输入的字符串最好用双引号括起来。这样做一是以防被误解为shell命令,二是可以用来查找多个单词组成的字符串。在调用变量时,也应该使用双引号;在调用模式匹配时,应该使用单引号。
- -c 只输出匹配行的计数
- -i 不区分大小写匹配(只适用于单个字符)
- -h 查询多文件时不显示文件名
- -l 查询多文件时只输出包含匹配字符的文件名
- -n 显示匹配行及行号
- -s 不显示不存在或无匹配文本的错误信息
- -v 显示不包含匹配文件的所有行
- -e 使用正则表达式匹配相应的内容的文件
- -E 使用egrep等扩展正则表达式匹配相应内容的文件
- -r,-R 递归在子目录中查找
- --color 高亮显示匹配项
-
模式范围
用[]来指定字符串范围:
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是扩展的grep,接受所有的正则表达式,一个显著特性是可以以一个文件作为保存的字符串,然后将之传给egrep作为参数,为此使用-f开关,如
pg grepstrings
484
47
egrep -f grepstrings data.txt
来匹配data.txt中包含484或47的所有记录