正则表达式与grep, sed, awk的基本用法

regex-comic
regex-comic

1. Regular Expression 正则表达式

正则表达式常简称为regex。一个regular expression常被成为一种pattern(模式、模板?),用来描述和匹配一系列符合某种规则的字符串。 以下是一些基本用法。

1.1 Quantifier 数量限定符

注意区别通配符‘*’

Char Description Example
? 表示前面的token出现01 app?le 可匹配 aple(0次)、apple(1次)
+ 表示前面的token出现1n go+gle 可匹配 gogle(1次)、google、gooogle……(n次)
* 表示前面的token出现0n ali(ba)* 可匹配 ali(0次)、aliba(1次)、alibaba……(n次)
{n} 表示前面的token固定出现n o{2} 可匹配zoo、moon、book……但是Bob不行
{n,} 表示前面的token至少出现n {1,}相当于+{0,}相当于*
{m,n} 表示前面的token出现m~n As above.

Note: 默认为greedy matching,匹配最长的字符串;当?添加在其他任意quantifier后面时,表示lazy matching,匹配最短的字符串。 e.g. h.+l matches 'hell' in 'hello', greedy. h.+?l matches 'hel' in 'hello', lazy.

1.2 其他常用符号

Char Description Comments
^ 字符串starting position ^a 可匹配'alias',line-based tools中表示每一行的开头
$ 字符串的ending position n$ 可匹配'qq.cn',line-based tools中表示每一行的结尾
() grouping ali(ba)*中‘ba’是一个tokon
. 除了(new-line)之外的任意单个字符 常配合quantifier.+表示1-n个任意字符
\ 转义符 转右边特殊字符为它本身\^=^;转右边普通字符为特殊意义\n=newline;Highest priority

| Boolean OR gr(e|a)y 匹配 'grey'和'gray' 注:由于hexo对markdown的解析还不够完善,此处vertical bar无法成功转义,总是打乱表格,故补充在引用里。


2. grep(Globally search a Regular Expression and Print)

2.1 Syntax

grep [ opt ]... pattern [ file/dir/stdin ]... 支持以下三种RegEx引擎 -E POSIX扩展正则表达式,ERE (使用除了*之外quantifier时,|时) -G POSIX基本正则表达式,BRE(默认) -P Perl正则表达式,PCRE

2.2 Options & Arguments

Options Description
-a --text 将binary-file作为文本来进行匹配
-b --byte-offset 在输出行的行首显示offset
-c --count 打印每个文件匹配到的行数
-i --ignore-case 忽略大小写
-n --line-number 显示匹配文本所在行的行号
-v --invert-match, 反向匹配,输出不匹配行的内容
-r --recursive 递归匹配
-A n after,除了列出匹配行之外,还列出后面的n行
-B n before,除了列出匹配行之外,还列出前面的n行
--color=auto 将输出中的匹配项设置为自动颜色显示
特殊pattern Description
[:digit:] 0-9
[:upper:] A-Z
[:lower:] a-z
[:alpha:] A-Z, a-z
[:alnum:] 0-9, A-Z, a-z
[:punct:] punctuation symbol
[:graph:] [:alnum:]+[:punct:]
[:blank:] [space] and [Tab]
[:space:] whitespace: tab, newline, vertical tab, form feed, carriage return, and space.
[:cntrl:] 控制按键,包括 CR, LF, Tab, Del..等
[:print:] [:alnum:]+[:punct:]+space
[:xdigit:] Hexadecimal:0-9, A-F, a-f

Note: 1. 使用这些special pattern时要额外加一对中括号“[]”。 2. [^]当^在中括号里时,表示排除

2.3 Example

1
2
3
4
$ grep '[[:lower:]]' file1			#匹配含有'a-z'的行。  双重中括号。
$ grep '[^sci]' file2 #排除s、c、i三个字符,而非‘sci’字符串。
$ grep -E '^(w|h)' file3 #匹配以'w'或'h'开头的行。使用'|'需加上'-E'选项。
$ grep -E 'w{3}' file3 #匹配含有'www'的行。 使用quantifier需加上'-E'选项。

3. sed(Stream editor)

sed是一个非交互式(non-interactive)命令行文本编辑器,用于过滤、转换文本,配合script和正则表达式来同时处理一个或多个文本文件。

3.1 Syntax

sed [ opt ]... {script} [ file/stdin ]...

3.2 Options

opt Description
-n --silent 安静模式,只打印受影响的行。默认打印stdin的全部行。
-e --expression 添加script
-f --file 文件中的命令
-r 使用ERE,默认为标准正则表达式
-i 直接修改输入文件内容,而不是打印到stdout
-s --separate 以files为分割,而不是file的每一行。此时stdin为多个文件。

3.3 Script

  • syntax[addr]X[opts]
  • 需用-e选项引导,或作为第一个non-option argument;也可写在file里用-f选项引导。
  • script内多条命令可用semicolon“;”分隔。
  • 命令a, c, i,后不可跟“;”,故muti-cmd时需放在最后一个。
  1. [addr]
    • 单行   :n
    • 连续多行 :n1,n2 从n1至n2。
    • 跳跃多行 :n~s 从n开始,以s为基数跳跃。如1~2奇数行,2~2偶数行。
    • Regex  :用正则表达式取址。如/^foo/以“foo”开头的行。
    • 后面加上“!”表示排除
  2. X[opts] p print 打印 通常配合-n开启安静模式 d delete 删除 s substitute 代替(pattern字符串) a append 向后添加 i insert 向前插入 c change 更换(整行) 其中s/regex/text/[flag],[flag]可以是g(替换行内全部匹配),数字n(替换行内第n个匹配),p替换成功后打印。 其中a, i, c命令可加backslash“”换行后再写text。

3.4 Example

1
2
3
4
5
6
#delete以“foo”开头的行,替换所有行的第3个“hello”为“world”
$ sed ’/^foo/d ; s/hello/world/3’ input.txt > output.txt

#替换所有不含“apple”的行为“hello there”
$ sed ’/apple/!c\
hello there’ input.txt > output.txt

4. awk文本处理语言

4.1 工作原理

按行(record)读取,按空格(FS)进行切片(field),将每片保存在内建变量中,$1,$2,$3....。$0表示全部。 可以对单个片断进行判断,也可以对所有断进行循环判断。

4.2 Syntax

awk [ -F fs ] [ -v var=value ] [ 'script' | -f scriptfile ] [ file ... ]

4.3 Builtin Var

var content
FS field separator 默认为一个空格
RS record separator 默认为一个
NF number of field 默认为片段个数
NR number of record 默认为文件行数
FNR number of record in each file
OFS 输出 field separator
ORS 输出 record separator
ARGC 命令行arguments个数
ARGV 命令行arguments数组
FILENAME 当前输入文件名

4.4 常用

awk '{print $2}' 打印第二field。 和 cut -d‘ ’ -f2掐头去尾的用法异曲同工

5. Reference

[1]魏镇坪:Linux之awk详解 [2]EmanLee: awk 用法(使用入门)

MT4113 Statistic Computing - Revision Syllabus

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×