
1. Regular Expression 正则表达式
正则表达式常简称为regex。一个regular expression常被成为一种pattern(模式、模板?),用来描述和匹配一系列符合某种规则的字符串。 以下是一些基本用法。
1.1 Quantifier 数量限定符
注意区别通配符‘*’
Char | Description | Example |
---|---|---|
? |
表示前面的token出现0或1次 | app?le 可匹配 aple(0次)、apple(1次) |
+ |
表示前面的token出现1或n次 | go+gle 可匹配 gogle(1次)、google、gooogle……(n次) |
* |
表示前面的token出现0或n次 | 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 ORgr(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 | $ grep '[[:lower:]]' file1 #匹配含有'a-z'的行。 双重中括号。 |
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时需放在最后一个。
- [addr]
- 单行 :
n
- 连续多行 :
n1,n2
从n1至n2。 - 跳跃多行 :
n~s
从n开始,以s为基数跳跃。如1~2
奇数行,2~2
偶数行。 - Regex :用正则表达式取址。如
/^foo/
以“foo”开头的行。 - 后面加上“!”表示排除
- 单行 :
- 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 | #delete以“foo”开头的行,替换所有行的第3个“hello”为“world” |
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 用法(使用入门)
Comments