学习运维第五天:文本处理工具和正则表达式

文本编辑工具之神VIM

使用 vim 初步
vim 命令格式
vim [OPTION]... FILE...

#常用选项
+n			##打开文件后让光标处于第N行的行首,+默认尾行
+/PATTERN   #让光标处于第一个被PATTERN匹配到的行行首
-b file 	#二进制方式打开文件
-d file1 file2… #比较多个文件,相当于 vimdiff
-m file   	#只读打开文件
-e file   	#直接进入ex模式,相当于执行ex file 
-y file   	#Easy mode (like "evim", modeless),直接可以操作文件,
ctrl+o:wq|q! 	#保存和不保存退出

说明:

  • 如果该文件存在,文件被打开并显示内容

  • 如果该文件不存在,当编辑后第一次存盘时创建它

  • 如果后面打开的是一个目录,则会列出目录中所有内容,可以用方向键进行选择

三种主要模式和转换

vim 是一个模式编辑器,击键行为是依赖于 vim 的“模式”

三种模式:

  • 命令或普通(Normal)模式:默认模式,可以实现移动光标,剪切/粘贴文本

  • 插入(Insert)或编辑模式:用于修改文本

  • 扩展命令(extended command )或命令(末)行模式:保存,退出等

学习运维第五天:文本处理工具和正则表达式_第1张图片

三种模式之间的切换:

vim 是 一个模式编辑器,击键行为是依赖于 vim的 的“模式”,就是说,在不同模式下,相同的按键,是 不同的意思;

插入模式和扩展命令模式之间不能直接切换,要走命令模式中转;

打开vim 默认就是命令模式;

#命令模式 --------------------------> 插入模式
#下列按键皆可

#i insert, 在光标所在处输入
#I 在当前光标所在行的行首输入
#a append, 在光标所在处后面输入
#A 在当前光标所在行的行尾输入
#o 在当前光标所在行的下方打开一个新行
#O 在当前光标所在行的上方打开一个新行


#命令模式 --------------------------> 扩展命令模式
#直接敲冒号 :


#################################################################


#插入模式 -------------------------> 命令模式
#按ESC键


#插入模式 -------------------------> 扩展命令模式
#按ESC到命令模式,再按冒号 : 到扩展命令模式


#################################################################


#扩展命令模式 ----------------------> 命令模式
#ESC键或Enter键或退格健

#扩展命令模式 ---------------------> 插入模式
#ESC|Enter|退格键 到命令模式,再i|I|a|A|o|O 到插入模式

扩展命令模式

按:进入Ex模式 ,创建一个命令提示符: 处于底部的屏幕左侧

扩展命令模式基本命令
w 		#写(存)磁盘文件
wq 		#写入并退出
x 		#写入并退出
X   	#加密
q 		#退出
q!   	#不存盘退出,即使更改都将丢失
r filename #读文件内容到当前文件中
w filename    #将当前文件内容写入另一个文件
!command 	#执行命令
r!command 	#读入命令的输出、


#示例:
:w 		#保存当前更改,不退出
:q! 	#不保存退出
:r /etc/fstab #将/etc/fstable
:w test 	#将当前打开的文件保存至另外一个文件
:!hostname 	#执行hostname
:r!uname -a #将 uname -a 的命令执行结果读到当前文件中
:X #加密码
Enter encryption key: ******
Enter same key again: ******
地址定界

格式:

:start_pos,end_pos CMD

N 		#具体第N行,例如2表示第2行
M,N 	#从左侧M表示起始行,到右侧N表示结尾行
M,+N 	#从左侧M表示起始行,右侧表示从光标所在行开始,再往后+N行结束
M,-N 	#从左侧M表示起始行,右侧表示从光标所在行开始,-N所在的行结束
M;+N 	#从第M行处开始,往后数N行,2;+3 表示第2行到第5行,总共取4行
M;-N 	#从第M-N行开始,到第M行结束
.   	#当前行
$ 		#最后一行
.,$-1 	#当前行到倒数第二行
% 		#全文, 相当于1,$
/pattern/   	#从当前行向下查找,直到匹配pattern的第一行,即正则匹配
/pat1/,/pat2/ 	#从第一次被pat1模式匹配到的行开始,一直到第一次被pat2匹配到的行结束
N,/pat/     	#从指定行开始,一直找到第一个匹配pattern的行结束
/pat/,$     	#向下找到第一个匹配patttern的行到整个文件的结尾的所有行


#地址定界后跟一个编辑命令
p 			#输出
d       	#删除
y 			#复制
w file 		#将范围内的行另存至指定文件中
r file 		#在指定位置插入指定文件中的所有内容
t行号         #将前面指定的行复制到N行后
m行号         #将前面指定的行移动到N行后


#示例
[root@rocky8 ~]# seq 10 > 10.txt

:2d #删除第2行
:2,4d #删除第2到第4行
:2;+3y #复制第2到第5行,总共4行
:2;+4w test #将第2到第6行,总共5行内容写入新文件
:5r /etc/issue #将/etc/issue 文件读取到第5行的下一行
:t2 #将光标所在行复制到第2行的下一行
:2;+3t10 #将第2到第5行,总共4行内容复制到第10行之后
:.d #删除光标所在行
:$y #复制最后一行
查找并替换

 格式:

:s/要查找的内容/替换为的内容/修饰符
:%s 表示全文查找替换

#要查找的内容:可使用基本正则表达式模式
#替换为的内容:不能使用模式,但可以使用\1, \2, ...等后向引用符号;还可以使用“&”引用前面查找时查找到的整个内容

#修饰符
i 		#忽略大小写
g 		#全局替换,默认情况下,每一行只替换第一次出现
gc 		#全局替换,每次替换前询问

#查找替换中的分隔符/可替换为其它字符,如:#,@主要还是使用/

#示例
:s/root/ROOT/ #替换当前行第一个root
:s/root/ROOT/g #替换当前行所有root
:%s/root/ROOT/g #全文替换
:%s/root/test/ig #不区分大小写全文替换
:%s/#// #将每行第一个#替换成空

定制vim的工作特性

扩展命令模式的配置只是对当前vim进程有效,可将配置存放在文件中持久保存;

写配置文件必须保证能识别,有些短格式在配置文件中无法识别

配置文件

/etc/vimrc 		#全局配置
~/.vimrc 		#个人配置

#行号
:set number|set nu     #显示行号
:set nonumber|set nonu #取消显示行号

#忽略字符的大小写
:set ignorecase|set ic #忽略字符大小写
:set noignorecase|set noic #不忽略

#自动缩进
:set autoindent|set ai #启用自动缩进
:set noautoindent|set noai #禁用自动缩进

#复制保留格式
:set paste #复制时保留格式
:set nopaste #禁用复制时保留格式选项

#显示Tab ^I和换行符 和$显示
:set list #显示系统字符
:set nolist #隐藏系统字符

#高亮搜索
:set hlsearch #高亮显示搜索结果
:set nohlsearch|nohl #不高亮显示搜索结果

#语法高亮
:syntax on #语法高亮
:syntax off #关闭语法高亮

#文件格式
:set fileformat=dos|set ff=dos #启用windows格式
:set fileformat=unix|set ff=unix #启用unix格式

#Tab 用空格代替
:set expandtab|set et  #使用空格代替Tab,默认8个空格
:set noexpandtab|set noet #禁用空格代替Tab

#Tab用指定空格的个数代替
:set tabstop=N|set ts=N #指定N个空格代替Tab

#设置缩进宽度
>> 		#向右缩进 命令模式
<< 		#向左缩进 命令模式

:set shiftwidth=4 #设置缩进为4个字符

#设置光标所在行的标识线
:set cursorline|set cul   #给光标所在行加下划线
:set nocursorline|set nocul #取消光标下划线

#加密
:set key=password #加密文档
:set key= #取消加密

#set 帮助
:help option-list 
:set|:set all 
命令模式

命令模式,又称为Normal模式,功能强大,但是在此模式下输入的命令不会在屏幕上显示,只能靠记忆 记住到底输入了什么,所以此处我们要记住大量快捷键;

退出VIM
ZZ 			#保存退出
ZQ 			#不保存退出
光标跳转

字符间跳转:

h 			#左
L 			#右,小写字母
j 			#下
k 			#上
Nh|Nl|Nj|Nk #每次跳转N个长度 2h表示向左移两个字符,3j表示向下走3行

单词间跳转:

w 			#下一个单词的词首
e 			#当前或下一单词的词尾
b 			#当前或前一个单词的词首
Nw|Ne|Nb 	#一次跳N个单词

当前页跳转:

H 			#页首     
M 			#页中间行     
L 			#页底
zt 			#将光标所在当前行移到屏幕顶端
zz 			#将光标所在当前行移到屏幕中间
zb 			#将光标所在当前行移到屏幕底端

行首行尾跳转:

^ 			#跳转至行首的第一个非空白字符
0 			#跳转至行首
$ 			#跳转至行尾

行间移动:

NG|:N 		#跳转至指定行,N表示正整数,比如 10G,或在扩展命令模式下:10,都表示跳转到第10行
G 			#最后一行
gg|1G 		#第一行

句间移动:

) 		#下一句
( 		#上一句

段落间移动:

} 		#下一段
{ 		#上一段

命令模式翻屏操作

Ctrl+f 			#向文件尾部翻一屏,相当于Pagedown
Ctrl+b 			#向文件首部翻一屏,相当于Pageup
Ctrl+d 			#向文件尾部翻半屏
Ctrl+u 			#向文件首部翻半屏

字符编辑

x 		#剪切光标处的字符
Nx 		#剪切光标处起始的N个字符,N为正整数
xp 		#交换光标所在处的字符及其后面字符的位置,本质是先剪切,再粘贴
~ 		#转换大小写
J 		#删除当前行后的换行符,就是把下一行接到当前行后面

替换命令(replace)

r 		#只替换光标所在处的一个字符,先敲r,再输入想要替换的新字符
R 		#切换成REPLACE模式(在末行出现-- REPLACE -- 提示),按ESC回到命令模式

删除命令(delete)

d 			#删除命令,可结合光标跳转字符,实现范围删除

d$|D 		#删除光标处到行尾
d^ 			#删除光标处到非空行首
d0 			#删除光标处到处行首
dw 			#从光标处删到下一个单词的词首
de 			#从光标处删到当前单词词尾或下一单词的词尾
db 			#从光标处删到当前单词词首或前一单词的词首
dG   		#删除光标所在的行到文件末尾
dgg   		#删除光标所在的行到文件开始
dd   		#删除光标所在行
Ndd 		#从当前行开始,删N行,N表示正整数,2dd表示从当前行开始,总共删2行

复制命令(yank)

y 			#复制,行为相似于d命令

y$ 			#复制光标处到行尾
y0 			#复制光标处到行首
y^ 			#复制光标处到非空行首
yy|Y 		#复制整行,yy前面加数字,表示从当前处往后复制多少行; 3yy 表示往下复制3行
Nyy 		#从当前处往后复制N行, N表示正整数,2yy表示从当前行开始,总共复制2行 
yw   		#从光标处复制到下一个单词的词首
ye     		#从光标处复制到当前单词词尾或下一单词的词尾
yb     		#从光标处复制到当前单词词首或下一单词的词首

粘贴命令(paste)

p 			#小写 p 缓冲区存的如果为整行,则粘贴当前光标所在行的下方;否则,则粘贴至当前光标所在处的后面
P 			#大写 p 缓冲区存的如果为整行,则粘贴当前光标所在行的上方;否则,则粘贴至当前光标所在处的前面
改变命令(change)

命令 c 删除后切换成插入模式

c$|C 		#删除光标处到行尾,并切换成插入模式 
c^ 			#删除光标处到非空行首,并切换成插入模式
c0   		#删除光标处到行首,并切换成插入模式
cc   		#删除当前行并输入新内容,相当于S,加数字表示向下删除多少行,然后切换成插入模式
Ncc 		#N表示正整数
cw   		#从光标处删到下一个单词的词首,并切换成插入模式
ce  	 	#从光标处删到当前单词词尾或下一单词的词尾,并切换成插入模式
cb   		#从光标处删到当前单词词首或下一单词的词首,并切换成插入模式

查找

/PATTERN 		#从当前光标所在处向文件尾部查找
?PATTERN   		#从当前光标所在处向文件首部查找
n 				#与命令同方向
N 				#与命令反方向

撤消更改

u 			#撤销最近的更改,相当于windows中ctrl+z
Nu 			#撤销之前多次更改,N表示正整数
U 			#撤消光标落在这行后所有此行的更改
Ctrl+r 		#重做最后的“撤消”更改,相当于windows中crtl+y
. 			#重复前一个操作
N. 			#重复前一个操作N次,N为正整数
高级用法

常见Command:y 复制、d 删除、gU 变大写、gu 变小写

#START COMMAND END

0y$ #复制整行,0表示到行首,y表示复制,$表示行尾,连起来就是复制整行
di"   #光标在" "之间,则删除" "之间的内容
yi(   #光标在()之间,则复制()之间的内容
vi[   #光标在[]之间,则选中[]之间的内容
dtx #删除字符直到遇见光标之后的第一个 x 字符
ytx #复制字符直到遇见光标之后的第一个 x 字符
10iabc ESC #在光标处插入10个abc
可视化模式

在末行有”-- VISUAL -- “指示,表示在可视化模式

允许选择的文本块

  • v 面向字符,-- VISUAL --

  • V 面向整行,-- VISUAL LINE --

  • ctrl-v 面向块,-- VISUAL BLOCK --

可视化键可用于与移动键结合使用

w ) } 箭头等

突出显示的文字可被删除,复制,变更,过滤,搜索,替换等

#示例:在文件指定行的行首插入#
1、先将光标移动到指定的第一行的行首
2、输入ctrl+v 进入可视化模式
3、向下移动光标,选中希望操作的每一行的第一个字符
4、输入大写字母 I 切换至插入模式
5、输入 # 
6、按 ESC 键

#示例:在指定的块位置插入相同的内容
1、光标定位到要操作的地方
2、CTRL+v 进入“可视块”模式,选取这一列操作多少行
3、SHIFT+i(I)
4、输入要插入的内容
5、按 ESC 键
多窗口模式
多文件分割
vim FILE1 FILE2...

#多文件之间切换
:next
:prev

vim -o|-O FILE1 FILE2 ...

-o 			#水平或上下分割
-O 			#垂直或左右分割(vim only)
:wqall 		#退出
Ctrl+w, Arrow #在窗口间切换

单文件窗口分割

Ctrl+w,s 		#split, 水平分割,上下分屏
Ctrl+w,v 		#vertical, 垂直分割,左右分屏
ctrl+w,q 		#取消相邻窗口
ctrl+w,o 		#取消全部窗口
:wqall 			#退出
Ctrl+w, Arrow 	#在窗口间切换,Arrow 表示方向键

帮助

:help
:help topic #topic 是指主题,比如 :help yy 就表示查看yy命令的用法
:q 			#退出help
:help index #列出所有主题

#vim帮助程序
vimtutor
[root@ubuntu2204 ~]# vimtutor

文本常见处理工具

文件内容查看命令
查看文本文件内容
cat

cat 可以查看文本内容

cat [OPTION]... [FILE]...

#常见选项
-E|--show-ends #显示行结束符$
-A|--show-all #显示所有控制符
-n|--number #对显示出的每一行进行编号
-b|--number-nonblank #非空行编号
-s|--squeeze-blank #压缩连续的空行成一行
nl

显示行号,相当于cat -b

tac

逆向显示文本内容,行倒序显示

rev

将同一行的内容逆向显示,同一行倒序

查看非文本文件内容

hexdump

#示例
hexdump  -C -n 512 /dev/sda
00000000 eb 63 90 10 8e d0 bc 00 b0 b8 00 00 8e d8 8e c0 |.c..............|
echo {a..z} | tr -d ' '|hexdump  -C
00000000  61 62 63 64 65 66 67 68  69 6a 6b 6c 6d 6e 6f 70 |abcdefghijklmnop|
00000010  71 72 73 74 75 76 77 78  79 7a 0a                 |qrstuvwxyz.|
分页查看文件内容
more

可以实现分页查看文件,可以配合管道实现输出信息的分页

格式:

more [OPTIONS...] FILE...

#常用选项
-d #在底部显示提示
-s #压缩连续空行

#命令选项
空格键 		  #翻页
回车键 		  #下一行
!cmd  			#执行命令
h 				#显示帮助
:f  			#显示文件名和当前行号
=  				#显示行号
less

less也可以实现分页查看文件或STDIN输出,less 命令是man命令使用的分页器

格式:

less [OPTIONS...] FILE...、

#常用选项
-e #显示完成后自动退出
-N #显示行号
-s #压缩连续空行
-S #不换行显示较长的内容

#命令选项
:h #显示帮助
/string #搜索
:!cmd #执行命令
b #向上翻
显示文本前面或后面的行内容
head

可以显示文件或标准输入的前面行

格式:

head [OPTION]... [FILE]...

#常用选项
-c|--bytes=N 		#指定获取前N字节
-n|--lines=N 		#指定获取前N行,N如果为负数,表示从文件头取到倒数第N前
-N 					#同上
-q|--quiet|--silent #不输出文件名
-v|--verbose        #输出文件名
-z|--zero-terminated     #以NULL字符而非换行符作为行尾分隔符
tail

tail 和 head 相反,查看文件或标准输入的倒数行

格式:

tail [OPTION]... [FILE]...

#常用选项
-c|--bytes=N #指定获取后N字节
-n|--lines=N #指定获取后N行,如果写成+N,表示从第N行开始到文件结束
-N #同上
-f|--follow=descriptor #跟踪显示文件fd新追加的内容,常用日志监控,当删除再新建同名文
件,将无法继续跟踪
-F|--follow=name --retry #跟踪文件名,相当于--follow=name --retry,当删除文件再新建
同名文件,可继续追踪
-q|--quiet|--silent #不输出文件名
-z|--zero-terminated     #以NULL字符而非换行符作为行尾分隔符


tailf #类似 tail –f,当文件不增长时并不访问文件,节约资源,CentOS8已经无此工具

#示例
[root@ubuntu2204 ~]# tail -n +3 /data/f1.txt #从第三行到最后一行
3
4
5
6
7
8
9
10
head 和 tail 总结
命令 含义 示例
head -n k file 取file前k行内容 head -n 3 /etc/passwd
head -k file 取file前k行内容 head -3 /etc/passwd
head -n +k file 取file前k行内容 head -n +3 /etc/passwd
head -n -k file 取file 第1行到倒数第k行内容 head -n -3 /etc/passwd
tail -n k file 从后往前数,取file 第1行到第k行内容 tail -n 3 /etc/passwd
tail -k file 从后往前数,取file 第1行到第k行内容 tail -3 /etc/passwd
tail -n -k file 从后往前数,取file 第1行到第k行内容 tail -n -3 /etc/passwd
tail -n +k file 从后往前数,取file 第1行到倒数第k行内容 tail -n +3 /etc/passwd

学习运维第五天:文本处理工具和正则表达式_第2张图片

按列抽取文本 cut

cut 命令可以提取文本文件或STDIN数据的指定列

格式:

cut OPTION... [FILE]...

#常用选项
-b|--bytes=LIST       	#以字节分割,指定要显示的列
-c|--characters=LIST   	#以字符分割,指定要显示的列
***********
-d|--delimiter=DELIM   	#指定分割符,默认是tab
-f|--fields=LIST       	#要显示的列,-f1, -f1,2,3, -f 1-3,4
************
-s|--only-delimited   	#不显示没有包括分割符的内容
--output-delimiter=STRING #输出的时候用指定字符代替分割符
-z|--zero-terminated       #以 NUL 字符而非换行符作为行尾分隔符


#一个中文是三个字节,一个字符
合并多个文件 paste

paste 合并多个文件同行号的行到一行

格式:

paste [OPTION]... [FILE]...

#常用选项
-d|--delimiters=LIST   	#指定分割符,默认用TAB
-s|--serial           	#合成一行显示
-z|--zero-terminated 	#以 NUL 字符而非换行符作为行尾分隔符
分析文本的工具

文本数据统计:wc

整理文本:sort

比较文件:diff和patch

收集文本统计数据 wc

wc 命令可用于统计文件的行总数、单词总数、字节总数和字符总数,可以对文件或STDIN(标准输入)中的数据统计

格式:

wc [OPTION]... [FILE]...

#常用选项
-l|--lines #只统计数行数
-w|--words #只统计数单词总数
-c|--bytes #只统计数字节总数
-m|--chars #只统计数字符总数
-L|--max-line-length #显示文件中最长行的长度
文本排序 sort

把整理过的文本显示在STDOUT(标准输出),不改变原始文件

格式:

sort [OPTION]... [FILE]...

#常用选项
-b|--ignore-leading-blanks #忽略文件中的空白
-f|--ignore-case           #忽略大小写
-h|--human-numeric-sort #人类可读排序
-M|--month-sort           #以月份排序
-n|--numeric-sort         #以数字大小排序
-R|--random-sort           #随机排序
-r|-reverse               #倒序
-t|--field-separator=SEP   #指定列分割符
-k|--key=KEYDEF           #指定排序列
-u|--unique               #去重
-z|--zero-terminated       #以 NUL 字符而非换行符作为行尾分隔符
去重 uniq

uniq 命令从输入中删除前后相接的重复的行,常和 sort 配合使用

格式:

uniq [OPTION]... [INPUT [OUTPUT]]

#常见选项
-c|--count             #显示每行出现次数
-d|--repeated          #仅显示有重复行
-D                     #显示所有重复行具体内容
-u|--unique            #仅显示不重复的行
-z|--zero-terminated   #以 NUL 字符而非换行符作为行尾分隔符
比较文件diff

diff 命令比较两个文件之间的区别

格式:

diff [OPTION]... FILES

#常用选项
-u #选项来输出“统一的(unified)”diff格式文件,最适用于补丁文件

patch

复制在其它文件中进行的改变(要谨慎使用)

格式:

patch [OPTION]... [ORIGFILE [PATCHFILE]]

#常用选项
-b|--backup   #备份
比较文件vimdiff

相当于 vim -d

cmp
 示例:查看二进制文件的不同
[root@ubuntu2204 ~]# ll /usr/bin/dir /usr/bin/ls 
-rwxr-xr-x 1 root root 138208 Feb  8  2022 /usr/bin/dir*
-rwxr-xr-x 1 root root 138208 Feb  8  2022 /usr/bin/ls*

[root@ubuntu2204 ~]# ll /usr/bin/dir /usr/bin/ls -i
918119 -rwxr-xr-x 1 root root 138208 Feb  8  2022 /usr/bin/dir*
918278 -rwxr-xr-x 1 root root 138208 Feb  8  2022 /usr/bin/ls*

[root@ubuntu2204 ~]# diff /usr/bin/dir /usr/bin/ls
Binary files /usr/bin/dir and /usr/bin/ls differ

[root@ubuntu2204 ~]# cmp /bin/dir /bin/ls
/bin/dir /bin/ls differ: byte 25, line 1

#跳过前20个字节,观察后面10个字节
[root@ubuntu2204 ~]# hexdump -s 20 -Cn 10 /bin/ls
00000014  01 00 00 00 b0 6a 00 00  00 00                   |.....j....|
0000001e
[root@ubuntu2204 ~]# hexdump -s 20 -Cn 10 /bin/dir
00000014  01 00 00 00 90 6a 00 00  00 00                   |.....j....|
0000001e

正则表达式

REGEXP: Regular Expressions,由一类特殊字符及文本字符所编写的模式;其中有些字符(元字符) 不表示字符字面意义,而表示控制或通配的功能,类似于增强版的通配符功能;但与通配符不同,通配 符功能是用来处理文件名,而正则表达式是处理文本内容中字符;

正则表达式分两类:

  • 基本正则表达式:BRE Basic Regular Expressions;

  • 扩展正则表达式:ERE Extended Regular Expressions;

正则表达式的元字符分类:

字符匹配、匹配次数、位置锚定、分组

帮助:man 7 regex

基本正则表达式元字符
字符匹配
.   			#匹配任意单个字符(除了\n),可以是一个汉字或其它国家的文字
[]   			#匹配指定范围内的任意单个字符,示例:[wang]   [0-9]   [a-z]   [a-zA-Z]
[^] 			#匹配指定范围外的任意单个字符,示例:[^wang] 
[:alnum:] 		#字母和数字
[:alpha:] 		#代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 		#小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 		#大写字母
[:blank:] 		#空白字符(空格和制表符)
[:space:] 		#包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白,比[:blank:]包含的范围广
[:cntrl:] 		#不可打印的控制字符(退格、删除、警铃...)
[:digit:] 		#十进制数字
[:xdigit:] 		#十六进制数字
[:graph:] 		#可打印的非空白字符
[:print:] 		#可打印字符
[:punct:] 		#标点符号
---------------------------------------
\s     		#匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [\f\r\t\v], 
Unicode正则表达式会匹配全角空格符
\S     		#匹配任何非空白字符。等价于 [^\f\r\t\v]
\w 			#匹配一个字母,数字,下划线,汉字,其它国家文字的字符,等价于[_[:alnum:]字]
\W 			#匹配一个非字母,数字,下划线,汉字,其它国家文字的字符,等价于[^_[:alnum:]字]
匹配次数

用在要指定次数的字符后面,用于指定前面的字符要出现的次数

* 		#匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
.* 		#任意长度的任意字符
\? 		#匹配其前面的字符出现0次或1次,即:可有可无
\+ 		#匹配其前面的字符出现最少1次,即:肯定有且 >=1 次
\{n\} 	#匹配前面的字符n次
\{m,n\} #匹配前面的字符至少m次,至多n次
\{,n\} 	#匹配前面的字符至多n次,<=n
\{n,\} 	#匹配前面的字符至少n次
位置锚定

位置锚定可以用于定位出现的位置

^ 			#行首锚定, 用于模式的最左侧
$ 			#行尾锚定,用于模式的最右侧
^PATTERN$ 	#用于模式匹配整行
^$ #空行
^[[:space:]]*$ 	#空白行
\< 或 \b     	#词首锚定,用于单词模式的左侧
\> 或 \b         #词尾锚定,用于单词模式的右侧
\       #匹配整个单词
#注意: 单词是由字母,数字,下划线组成
分组其它
分组

分组:() 将多个字符捆绑在一起,当作一个整体处理,如:(root)+

后向引用:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名 方式为: \1, \2, \3, ...

\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符

注意: \0 表示正则表达式匹配的所有字符

或者

或者:|

扩展正则表达式元字符
字符匹配
. 			#任意单个字符
[wang] 		#指定范围的字符
[^wang] 	#不在指定范围的字符
[:alnum:] 	#字母和数字
[:alpha:] 	#代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 	#小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 	#大写字母
[:blank:] 	#空白字符(空格和制表符)
[:space:] 	#水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 	#不可打印的控制字符(退格、删除、警铃...)
[:digit:] 	#十进制数字
[:xdigit:] 	#十六进制数字
[:graph:] 	#可打印的非空白字符
[:print:] 	#可打印字符
[:punct:] 	#标点符号
匹配次数
*   	#匹配前面字符任意次
? 		#0或1次
+ 		#1次或多次
{n} 	#匹配n次
{m,n} 	#至少m,至多n次

位置锚定

^ 		#行首
$ 		#行尾
\<, \b 	#词首
\>, \b 	#词尾
分组其它
() 		#分组 	#后向引用:\1, \2, ... 注意: \0 表示正则表达式匹配的所有字符
| 		#或者
a|b 	#a或b
C|cat 	#C或cat
(C|c)at #Cat或cat

文本处理三剑客

grep 命令主要对文本的(正则表达式)行基于模式进行过滤

sed:stream editor,文本编辑工具

awk:Linux上的实现gawk,文本报告生成器

文本处理三剑客之 grep

grep: Global search REgular expression and Print out the line

作用:文本搜索工具,根据用户指定的 “模式” 对目标文本逐行进行匹配检查;打印匹配到的行

模式:由正则表达式字符及文本字符所编写的过滤条件

格式:

grep [OPTIONS...] PATTERN [FILE...]


#常见选项:
-E|--extended-regexp         #使用ERE,相当于egrep

-F|--fixed-strings           #不支持正则表达式,相当于fgrep
-G|--basic-regexp            #将样式视为普通的表示法来使用
-P|--perl-regexp             #支持Perl格式的正则表达式
-e|--regexp=PATTERN          #实现多个选项间的逻辑or关系,如:grep –e ‘cat ' -e ‘dog' file
-f|--file=FILE               #从文件中读取匹配规则,每行一条
-i|--ignore-case             #忽略字符大小写
-w|--word-regexp             #匹配整个单词
-x|--line-regexp             #整行匹配
-s|--no-messages             #不显示错误信息

-v|--invert-match            #显示没有被匹配上的行,即取反

-B|--before-context=N        #显示匹配到的字符串所在的行及其前N行
-A|--after-context=N         #显示匹配到的字符串所在的行及其后n行
-C|--context=N               #显示匹配到的字符串所在的行及其前后各N行
-N                           #同 --context=N
--color=auto     #对匹配到的内容高亮显示[always|never|auto]
-m|--max-count=N           	#只匹配N行,是行,不是次数,一行可能匹配两个,但是,这里是行
-b|--byte-offset            #显示匹配行第一个字符的编号
-n|--line-number            #显示匹配的行号
-H|--with-filename         	#显示匹配行所在的文件名
-h|--no-filename       		#不显示匹配行所在的文件名
-o|--only-matching     		#仅显示匹配到的字符串
-q|--quiet|--silent     	#静默模式,不输出任何信息,结果要从变量$?拿
--binary-files=TYPE   		#指定二进制文件类型 [binary|text|without-match]
-a|--text               	#同 --binary-files=text
-I                          #同 --binary-files=without-match
-d|--directories=ACTION 	#怎样查找目录 [read|recurse|skip]
-D|--devices=ACTION     	#怎样查找设备文件 [read|skip]
-r|--recursive           	#递归目录,但不处理软链接
-R|--dereference-recursive 	#递归目录,但处理软链接
-L|--files-without-match 	#显示没有匹配上的文件名,只显示文件名
-l|--files-with-matches 	#显示匹配上的文件名,只显示文件名
-c|--count                   #统计匹配的行数,是行数,一行可以匹配一次到多次
文本处理三剑客之 sed
sed 工作原理

sed 即 Stream EDitor,和 vi 不同,sed 是行编辑器

Sed是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行,直到 最后一行。

每当处理一行时,把当前处理的行存储在临时缓冲区 模式空间(Pattern Space) 中,接着用sed命令 处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到 文件末尾。

一次处理一行的设计模式使得sed性能很高,sed在读取大文件时不会出现卡顿的现象。

如果使用vi命令打开几十M上百M的文件,明显会出现有卡顿的现象,这是因为vi命令打开文件是一次性 将文件加载到内存,然后再打开。Sed就避免了这种情况,一行一行的处理,打开速度非常快,执行速 度也很快。

sed 基本用法

格式:

sed [OPTION]... {script-only-if-no-other-script} [input-file]...

#常用选项
-n|--quiet|--silent 				#不输出模式空间内容到屏幕,即不自动打印
-e script|--expression=script 		#多个script,or 的关系
-f script-file|--file=script-file 	#从指定文件中读取编辑脚本
-i[SUFFIX]|--in-place[=SUFFIX] 		#-i 直接修改文件,-i.bak 以.bak后缀备份原文件
-c|--copy 				#配合i一起使用,保留原文件
-l N|--line-length=N 	#指定每行长度,如果过长,就拆分成多行,要加 `l'
--posix 				#禁用GNU扩展
-E|-r|--regexp-extended #扩展正则表达式
-s|--separate 			#将多个文件视为独立文件,而不是单个连续的长文件流


-ir 		#此组合不支持
-ri 		#支持
-i -r 		#支持
-ni 		#此组合危险,会清空文件

#script 格式:
'AddrCmd' 	#地址命令 在哪些行,执行什么操作

#地址格式:
#为空,则表示对全文进行处理

#单地址,指定行
N #具体行号
$ #最后一行
/pattern/ #能被匹配到的每一行

#范围地址
M,N 				#第M行到第N行
M,+N 				#第M行到第M+N行 3,+4 表示从第3行到第7行
/pattern1/,/pattern2/ #从第一个匹配行开始,到第二个匹配行中间的行
M,/pattern/ 		#行号开始,匹配结束
/pattern/,N 		#匹配开始,行号结束

#步长
1~2 #奇数行
2~2 #偶数行

p 		#打印当前模式空间内容,追加到默认输出之后
Ip 		#忽略大小写输出
d 		#删除模式空间匹配的行,并立即启用下一轮循环
a [\]text   #在指定行后面追加文本,支持使用\n实现多行追加
i [\]text   #在行前面插入文本
c [\]text   #替换行为单行或多行文本
w file 		#保存模式匹配的行至指定文件
r file 		#读取指定文件的文本至模式空间中匹配到的行后
= 			#为模式空间中的行打印行号
! 			#模式空间中匹配行取反处理
q           #结束或退出sed


#查找替代

s/pattern/replace/修饰符  #查找替换,支持使用其它分隔符,可以是其它形式:s@@@,s###
#修饰符
g 			#行内全局替换
p 			#显示替换成功的行
w file 		#将替换成功的行保存至文件中
I|i   		#忽略大小写

#后向引用
\1 		#第一个分组
\2 		#第二个分组
\N 		#第N个分组
& 		#所有搜索内容
sed 高级用法(了解)

sed 中除了模式空间,还另外还支持保持空间(Hold Space),利用此空间,可以将模式空间中的数据, 临时保存至保持空间,从而后续接着处理,实现更为强大的功能。

常见的高级命令

P 		#打印模式空间开端至\n内容,并追加到默认输出之前
h 		#把模式空间中的内容覆盖至保持空间中
H 		#把模式空间中的内容追加至保持空间中
g 		#从保持空间取出数据覆盖至模式空间
G 		#从保持空间取出内容追加至模式空间
x 		#把模式空间中的内容与保持空间中的内容进行互换
n 		#读取匹配到的行的下一行覆盖至模式空间
N 		#读取匹配到的行的下一行追加至模式空间
d 		#删除模式空间中的行
D 		#如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环
文本处理三剑客之 awk

你可能感兴趣的:(学习,运维,正则表达式)