linux三剑客与正则

一、正则表达式

#参考
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匹配一个正整数
\nm8进制数字
\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 RegExExtended RegExpython RegExPerl 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|yx|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 三剑客使用正则式的特点

命令支持的正则类型默认正则类型说明
grepBREs,EREs,PREsBREsgrep -E 使用EREs
grep -P 使用PREs
egrepEREs,PREsEREsegrep -P 表示使用PREs
sedBREs,EREsBREssed -r 表示使用EREs
awkEREsEREs/

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中使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值