一、正则表达式
#参考
https://www.cnblogs.com/chengmo/archive/2010/10/10/1847287.html
1.1 正则的分类
1、基本正则 BREs (Basic Regular Expression )
2、扩展正则 EREs (Extended Regular Expression)
3、Perl正则 (Perl Regular Expression )
4、python 正则
1.2 正则优先级
从上到下计算优先级
运算符 | 描述 |
---|---|
\ | 转义 |
(), (?冒号), (?=), [] | 括号 |
*, +, ?, {n}, {n,}, {n,m} | 限定 |
^, $, \任何元字符、任何字符 | 位置 |
| | 替换 或 |
1.3 正则各类字段意义
非打印字符
字符 | 描述 |
---|---|
\cx | 由x指明的控制字符,如 \cM 匹配control+M,x的值为a—Z之一 |
\f | 匹配一个换页符。等价于 \x0c 和 \cL。 |
\n | 匹配一个换行符。等价于 \x0a 和 \cJ。 |
\r | 匹配一个回车符。等价于 \x0d 和 \cM。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 |
\S | 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 |
\t | 匹配一个制表符。等价于 \x09 和 \cI。 |
\v | 匹配一个垂直制表符。等价于 \x0b 和 \cK。 |
\b | 匹配一个单词边界 |
\B | 非单词边界匹配 |
\d | 匹配数字0-9 |
\D | 非数字,等价于[^0-9] |
\w | 匹配一个字母,数字,下划线a-zA-Z0-9 |
\W | 匹配非字符 |
\xn | 匹配16进制数n |
\num | 匹配一个正整数 |
\nm | 8进制数字 |
\nml | 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。 |
\un | 匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符 |
特殊字符
特殊字符 | 描述 |
---|---|
$ | 匹配结尾 |
() | 匹配子表达式,(123)匹配123 |
* | 0-n次匹配 |
+ | 1-n次匹配 |
. | 匹配一个字符,除换行符外 |
[] | 匹配[123],则表示匹配1或2 或3 |
? | 0次或者1次匹配 |
\ | 转义字符 |
^ | 匹配开始 |
{} | 限定表达式,表示正则匹配多少次 |
| | 匹配两个中的一个,表示或者 |
限定符
字符 | 描述 |
---|---|
* | 匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。 |
+ | 匹配前面的子表达式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。 |
? | 匹配前面的子表达式零次或一次。例如,“do(es)?” 可以匹配 “do” 、 “does” 中的 “does” 、 “doxy” 中的 “do” 。? 等价于 {0,1}。 |
{n} | n 是一个非负整数。匹配确定的 n 次。 |
{n,} | n 是一个非负整数。至少匹配n 次。例如,‘o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。‘o{1,}’ 等价于 ‘o+’。‘o{0,}’ 则等价于 ‘o*’。 |
{n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次 |
1.4 内置正则式
字符簇 | 描述 |
---|---|
[[:alpha:]] | 任何字母 |
[[:digit:]] | 任何数字 |
[[:alnum:]] | 任何字母和数字 |
[[:space:]] | 任何空白字符 |
[[:upper:]] | 任何大写字母 |
[[:lower:]] | 任何小写字母 |
[[:punct:]] | 任何标点符号 |
[[:xdigit:]] | 任何16进制的数字,相当于[0-9a-fA-F] |
1.5 不同类型正则的比较
BREs不支持的字符可以使用 \转义使其支持
字符 | 说明 | Basic RegEx | Extended RegEx | python RegEx | Perl regEx |
---|---|---|---|---|---|
\< | 匹配单词,例如:‘<frog’ (等价于’\bfrog’),匹配以 frog 开头的单词 | \< | \< | 不支持 | 不支持(但可以使用\b来匹配单词,例如:‘\bfrog’) |
\> | 匹配单词,例如:‘frog>’(等价于’frog\b '),匹配以 frog 结尾的单词 | \> | \> | 不支持 | 不支持(但可以使用\b来匹配单词,例如:‘frog\b’) |
\<x\> | 匹配一个单词或者一个特定字符,例如:‘\<frog\>’(等价于’\bfrog\b’)、‘\<G\>’ | \<x\> | \<x\> | 不支持 | 不支持(但可以使用\b来匹配单词,例如:‘\bfrog\b’ |
() | 匹配表达式,例如:不支持’(frog)’ | 不支持(但可以使用(),如:\(dog\) | () | () | () |
+ | 匹配前面的子表达式 1 次或多次(等价于{1, }),例如:zo+能匹配 "zo"以及 “zoo”,但不能匹配 “z” | 不支持(同\+) | + | + | + |
? | 匹配前面的子表达式 0 次或 1 次(等价于{0,1}),例如:where(is)?能匹配"where" 以及"whereis" | 不支持(同?) | ? | ? | ? |
{n} | n 必须是一个 0 或者正整数,匹配子表达式 n 次,例如:zo{2}能匹配 | 不支持(同\{n\}) | {n} | {n} | {n} |
{n,} | “zooz”,但不能匹配 "Bob"n 必须是一个 0 或者正整数,匹配子表达式大于等于 n次,例如:go{2,} | 不支持(同\{n,\}) | {n,} | {n,} | {n,} |
{n,m} | 能匹配 “good”,但不能匹配 godm 和 n 均为非负整数,其中 n <= m,最少匹配 n 次且最多匹配 m 次 ,例如:o{1,3}将配"fooooood" 中的前三个 o(请注意在逗号和两个数之间不能有空格) | 不支持(同\{n,m\}) | {n,m} | {n,m} | {n,m} |
x|y | 匹配 x 或 y,例如: 不支持’z|(food)’ 能匹配 “z” 或"food";‘(z|f)ood’ 则匹配"zood" 或 “food” | 不支持(同x\ | \y) | x|y | x|y |
\d | 匹配从 0 到 9 中的任意一个数字字符(等价于 [0-9]) | 不支持 | 不支持 | \d | \d |
\D | 匹配非数字字符(等价于 [^0-9]) | 不支持 | 不支持 | \D | \D |
\S | 匹配任何非空白字符(等价于[^\f\n\r\t\v]) | 不支持 | 不支持 | \S | \S |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等(等价于[ \f\n\r\t\v]) | 不支持 | 不支持 | \s | \s |
\t | 匹配一个横向制表符(等价于 \x09和 \cI) | 不支持 | 不支持 | \t | \t |
\v | 匹配一个垂直制表符(等价于 \x0b和 \cK) | 不支持 | 不支持 | \v | \v |
\n | 匹配一个换行符(等价于 \x0a 和\cJ) | 不支持 | 不支持 | \n | \n |
\f | 匹配一个换页符(等价于\x0c 和\cL) | 不支持 | 不支持 | \f | \f |
\r | 匹配一个回车符(等价于 \x0d 和\cM) | 不支持 | 不支持 | \r | \r |
\cx | 匹配由 x 指明的控制字符,例如:\cM匹配一个Control-M 或回车符,x 的值必须为A-Z 或 a-z 之一,否则,将 c 视为一个原义的 ‘c’ 字符 | 不支持 | 不支持 | \cx | |
\xn | 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长,例如:‘\x41’ 匹配 “A”。‘\x041’ 则等价于’\x04’ & “1”。正则表达式中可以使用 ASCII 编码 | 不支持 | 不支持 | \xn | |
\num | 匹配 num,其中 num是一个正整数。表示对所获取的匹配的引用 | 不支持 | \num | \num |
1.6 三剑客使用正则式的特点
命令 | 支持的正则类型 | 默认正则类型 | 说明 |
---|---|---|---|
grep | BREs,EREs,PREs | BREs | grep -E 使用EREs grep -P 使用PREs |
egrep | EREs,PREs | EREs | egrep -P 表示使用PREs |
sed | BREs,EREs | BREs | sed -r 表示使用EREs |
awk | EREs | EREs | / |
1.7 匹配控制符
字符 | 描述 |
---|---|
g | 全局匹配(即:一行上的每个出现,而不只是一行上的第一个出现) |
s | 把整个匹配串当作一行处理 |
m | 多行匹配 |
i | 忽略大小写 |
x | 允许注释和空格的出现 |
U | 非贪婪匹配 |
二、grep文本搜索工具
2.1 命令功能
用于过滤/搜索的特定字符。可使用正则表达式能多种命令配合使用,使用上十分灵活。
有grep,egrep,fgrep
2.2 命令格式
grep option pattern file
2.3 命令选项
-a 不要忽略二进制数据。
-A<显示列数> 除了显示符合范本样式的那一行之外,并显示该行之后的内容。
-b 在显示符合范本样式的那一行之外,并显示该行之前的内容。
-c 计算符合范本样式的列数。
-C<显示列数>或-<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之前后的内容。
-d<进行动作> 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。
-e<范本样式> 指定字符串作为查找文件内容的范本样式。
-E 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式。
-f<范本文件> 指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式。
-F 将范本样式视为固定字符串的列表。
-G 将范本样式视为普通的表示法来使用。
-h 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。
-H 在显示符合范本样式的那一列之前,标示该列的文件名称。
-i 忽略字符大小写的差别。
-l 列出文件内容符合指定的范本样式的文件名称。
-L 列出文件内容不符合指定的范本样式的文件名称。
-n 在显示符合范本样式的那一列之前,标示出该列的编号。
-q 不显示任何信息。
-R/-r 此参数的效果和指定“-d recurse”参数相同。
-s 不显示错误信息。
-v 反转查找。
-w 只显示全字符合的列。
-x 只显示全列符合的列。
-y 此参数效果跟“-i”相同。
-o 只输出文件中匹配到的部分。
2.4 常见用法
搜索字串
grep str file_name
grep "str" file_name
在多个文件 查找
grep match_pattern file1 file2 file3 ....
使用 -v 搜索除match_pattern以外的行
grep -v match_pattern file
使用 -E 和 -P 来使用EREs和PREs匹配
grep -E match_pattern file
egrep match_pattern file
grep -p match_pattern file
使用 -o 控制只输出匹配到的字串
echo this is test line. | grep -o -E "[a-z+\.]"
输出 line.
使用 -c 来统计匹配到的行数
echo test test | grep -c test
输出;1
使用 -n 给匹配到的行显示行号
grep -n match_pattern file
输出:
n:match_pattern行
使用 -l 查找字串在哪一个文件中
grep -l str file1 file2 file3...
使用 -r 查找目录 (递归查找)
grep -r str dir
输出
匹配到的文件路径:匹配到的行
-r 也可以增加参数来过滤搜索的文件
--include 只查找后面的文件
--exclude 不查找指定的文件
--exclude-from filelist 不查找文件列表中的文件
grep main . -r --include *.{php,html,txt}
grep main . -r --exclude "reademe"
grep main . -r --exclude-from filelist
使用 -i 忽略大小写
echo "hello world" | grep -i "HELLO"
hello
使用 -e -f 匹配多个正则,-f为读取文件中的多个正则
echo this is a text line | grep -e "is" -e "line" -o
is
line
cat patfile
aaa
bbb
echo aaa bbb ccc ddd eee | grep -f patfile -o
打印匹配文本之前的行和之后的行
-A n 打印后n行
-B n 打印前n行
-C n 打印前后各n行
echo -e "a\nb\nc\na\nb\nc" | grep a -A 1
输出
b
c
三、sed 流编辑器
3.1 命令功能
sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等
3.2 命令格式
sed [option] command [inputfile]
注意:使用正则表达式或者匹配文本时,需要使用 /str/ 两个斜杠将表达式括起来才能识别
#匹配打印从表达式开始到第5行
sed -n '/^ma/,5 p' test1.txt
#输出结果
mail
uuencode
1003605091
01566
3.3 命令选项
3.3.1 option选项
选项 | 描述 |
---|---|
-n | 取消静默输出,如果不加-n会将文件内容全部输出一次 |
-e | 多点编辑,即执行多条命令 |
-f | 从文件中读取sed操作 |
-i | 直接编辑源文件 |
-l | 指定行的长度 |
-r | 使用扩展表达式 |
3.3.2 command 选项
选项 | 描述 |
---|---|
a | 在后方增加一行 |
c | 替换整行 |
d | 删除 |
s | 替换字串 |
p | 打印 |
i | 直接在源文件中改动 |
3.4 常见用法
1.打印1-3行
sed -n "1,3 p" sedtest
1.asdfg
2.zcxccb
3.qwqwrqer
2.打印从正则匹配到的字串开始至第6行
sed -n "/qer$/,6 p" sedtest
3.qwqwrqer
4.kdfopdf
5.kdfjkl
6.liwoeu
3.行递增输出,从第一行开始,每递增3行输出
sed -n "1~3 p" sedtest
1.asdfg
4.kdfopdf
7.lueoru
4.行前-i行后-a增加行
sed "2i newline p" sedtest
1.asdfg
newline p
2.zcxccb
3.qwqwrqer
4.kdfopdf
5.kdfjkl
6.liwoeu
7.lueoru
8.puieuqr
sed "2a newline p" sedtest
1.asdfg
2.zcxccb
newline p
3.qwqwrqer
4.kdfopdf
5.kdfjkl
6.liwoeu
7.lueoru
8.puieuqr
5.替换行-c
sed "3,6c delet3-6" sedtest
1.asdfg
2.zcxccb
delet3-6
7.lueoru
8.puieuqr
sed "3c new line for 3" sedtest
1.asdfg
2.zcxccb
new line for 3
4.kdfopdf
5.kdfjkl
6.liwoeu
7.lueoru
8.puieuqr
3.5 s子命令,字符串替换
用法 不加位置参数时匹配文件中所有符合的字串
#默认匹配首个匹配到的字串
sed "位置参数 s/pattern/replaced/flag" file
sed 's/old str/new str/g' filename
#pattern为要替换的文本,支持正则表达式,replaced表示用来替换的一般字符串(不支持正则表达式)
flag标志列表
flag | 描述 |
---|---|
g | 全局匹配,会替换文本行中所有匹配的字符串 |
n | 替换文本行中第n个匹配的字符串 |
p | 替换第一个匹配的字符串,并且将缓冲区输出到标准输出 |
w | 替换第一个匹配的字符串,并且将改动的行输出到磁盘文件中 |
默认状态
sed "3 s/r/89/" sedtest
1.asdfg
2.zcxccb
3.qwqw89qer
4.kdfopdf
5.kdfjkl
6.liwoeu
7.lueoru
8.puieuqr
不加位置参数状态
#这里不加g的话每行只会替换首个匹配到的字串
sed "s/r/89/" sedtest
1.asdfg
2.zcxccb
3.qwqw89qer
4.kdfopdf
5.kdfjkl
6.liwoeu
7.lueo89u
8.puieuq89
#加g标记
sed "s/r/89/g" sedtest
1.asdfg
2.zcxccb
3.qwqw89qe89
4.kdfopdf
5.kdfjkl
6.liwoeu
7.lueo89u
8.puieuq89
p输出改动后的行
sed -n "4 s/df/8080/p" sedtest
4.k8080opdf
n匹配到指定次数
#修改第2行第2次匹配到的字串
sed "2 s/c/999/2" sedtest
1.asdfg
2.zcx999cb
3.qwqw89qer
4.kdfopdf
5.kdfjkl
6.liwoeu
7.lueo89u
8.puieuq89
使用{指令;指令}对同一行或者多行做多次操作
#第3行原先的值为 3.qwqw89qer
sed -n '3 { s/w/999/2;s/q/1111/g;p }' sedtest
3.1111w1111999891111er
通过读取脚本文件执行
#脚本文件写法
cat sedscript
s/w/999/2;s/q/1111/g;p
执行
sed -n -f sedscript sedtest
1.asdfg
2.zcxccb
3.1111w1111999891111er
4.kdfopdf
5.kdfjkl
6.liwoeu
7.lueo89u
8.puieu111189
四、awk文本分析格式化工具
4.1 命令功能
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。
简单来说awk就是首先把文件逐行的读入,再以空格为默认分隔符将每行切片,分成若干子串,切开的部分再进行各种分析处理。
echo "this is a test" | awk '{print $1}'
this
echo "this is a test" | awk '{print $2}'
is
echo "this is a test" | awk '{print $3}'
a
echo "this is a test" | awk '{print $4}'
test
echo "this is a test" | awk '{print $5}'
输出为空
4.2 命令格式
#注意这里一定要用单引号
awk option 'pattern{script} pattern{script} ...' file
4.3 命令选项
option选项
-F 分隔符 指定切片的分隔符是什么,如指定 :为分隔符则使用 -F :
-v i=1 定义一个变量,供后续脚本使用,直接使用i即可调用
awk -F : -v i=1 '{print i}' awktest
pattern选项
pattern除了使用正则以外,还有一些预置的选项,如下
选项 | 描述 |
---|---|
GEGIN | 在所有数据读取之前执行一次 |
END | 在最后执行一次 |
NR | 行号,NR>1打印结果中行号大于1的行,在是文件中的行号 |
NF | 所有列数的总数,NF-1为倒数第二列 |
FS | 指定分隔符 |
FNR | 记录每个文件自己的行号 |
OFS | 输出时字段的分隔符,默认为空格 |
ORS | 输出时的每行分隔符,默认为换行符 |
FILENAME | 当前文件名 |
4.4 常见用法
在输出的前后输出定义字段,并输出倒数第二列和第一列
$ awk -F ":" 'BEGIN{print "home"} /4790/{print $(NF-1),$1} END{print "end"}' /etc/passwd
#output
home
/home/66294790 66294790
/home/ck141484790 ck141484790
/home/ck151484790 ck151484790
/home/lg51097157 lg51097157
end
各字段输出值
$ awk -F ":" '{print $1,NR,NF,FNR,OFS="---",FILENAME}' passwd.txt
ck162553590---1---7---1---------passwd.txt
ck161049065---2---7---2---------passwd.txt
ck161573329---3---7---3---------passwd.txt
lg56919023---4---7---4---------passwd.txt
ck164126230---5---7---5---------passwd.txt
lg59985209---6---7---6---------passwd.txt
ck162271758---7---7---7---------passwd.txt
ck161057179---8---7---8---------passwd.txt
xly29502270---9---7---9---------passwd.txt
dx43679278---10---7---10---------passwd.txt
5.字段截取cut命令
cut 选项 文件名
-f 列号:提取第几列
-d 分隔符: 指定以什么分隔列,默认是\t
局限
1.分隔符是完全匹配,即一个字符匹配一次
如 以空格分隔 一行中连续的多个空格,则会一个空格识别一列
6. 格式化打印 printf 命令
printf '输出类型输出格式' 输出内容
#输出类型
%ns 输出字符串,n代表输出几个字符
%ni 输出整数,n代表输出第几个整数
%m.nf 输出浮点数,m为总共输出多少位数,n为小数点后显示几点
#输出格式,列出常用
\n 换行
\r 回车
\t tab
#列子
printf '%s %s %s\n' 1 2 3 4 5 6
#输出
1 2 3
4 5 6
print会自动加入换行,只能在awk中使用
printf不会自动加入换行,可以在系统和awk中使用