Linux文本处理工具和正则表达式

jianxm 2020-04-18

文本处理工具和正则表达式
1.vi和vim
vi:Visual editor,文本编辑器,是 Linux 必备工具之一,功能强大,学习曲线较陡峭,学习难度大
vim:VIsual editor iMproved ,和 vi 使用方法一致,但功能更为强大,不是必备软件

vim命令格式:
vim [OPTION]... FILE...
+# 打开文件后,让光标处于第#行的行首,+默认行尾
+/PATTERN 让光标处于第一个被PATTERN匹配到的行行首
-b file 二进制方式打开文件
-d file1 file2… 比较多个文件,相当于 vimdiff
-m file 只读打开文件
-e file   直接进入ex模式,相当于执行ex file
如果该文件存在,文件被打开并显示内容
如果该文件不存在,当编辑后第一次存盘时创建它

vim三种主要模式转换:
命令模式 插入模式 扩展插入模式
命令模式到插入模式:
i insert, 在光标所在处输入
I 在当前光标所在行的行首输入
a append, 在光标所在处后面输入
A 在当前光标所在行的行尾输入
o 在当前光标所在行的下方打开一个新行
O 在当前光标所在行的上方打开一个新行
插入模式 --- ESC-----> 命令模式
命令模式 ---- : ----> 扩展命令模式
扩展命令模式 ----ESC,enter----> 命令模式

扩展命令模式
按“:”进入Ex模式 ,创建一个命令提示符: 处于底部的屏幕左侧
扩展命令模式基本命令:
w 写(存)磁盘文件
wq 写入并退出
x 写入并退出
X  加密
q 退出
q! 不存盘退出,即使更改都将丢失
r   filename 读文件内容到当前文件中
w   filename 将当前文件内容写入另一个文件
!command 执行命令
r!command 读入命令的输出

地址定界:
格式:start_pos,end_pos cmd
# 具体第#行,例如2表示第2行
#,# 从左侧#表示起始行,到右侧#表示结尾行
#,+# 从左侧#表示的起始行,加上右侧#表示的行数,范例:2,+3 表示2到5行
.   当前行
$ 最后一行
.,$-1 当前行到倒数第二行
% 全文, 相当于1,$
地址定界后跟一个编辑命令:
d       删除
y 复制
w file: 将范围内的行另存至指定文件中
r file:在指定位置插入指定文件中的所有内容

查找并替换:
格式: s/要查找的内容/替换为的内容/修饰符

vim配置特性:
配置文件:永久有效
全局: /etc/vimrc
个人: ~/.vimrc
扩展命令模式:当前vim进程有效


行号:
显示: set number, 简写 set nu
取消显示:set nonumber, 简写 set nonu
忽略字符的大小写
启用:set ignorecase, 简写 set ic
不忽略:set noic
自动缩进
启用:set autoindent, 简写 set ai
禁用:set noai
复制保留格式
启用:set paste
禁用:set nopaste
显示Tab和换行符 ^I 和$显示
启用:set list
禁用:set nolist
高亮搜索
启用:set hlsearch
禁用:set nohlsearch
语法高亮
启用:syntax on
禁用:syntax off
文件格式
启用windows格式:set fileformat=dos
启用unix格式: set fileformat=unix
简写 set ff=dos|unix
设置文本宽度
set textwidth=65 (vim only)
set wrapmargin=15
设置光标所在行的标识线
启用:set cursorline,简写 set cul
禁用:set nocursorline
加密
启用: set key=password
禁用: set key=
了解更多
set 帮助
:help option-list
:set or :set all

命令模式:(Normal模式)
命令模式功能强大,只是按键时,看不到输入,所以需要大量的记忆才能更好的使用。
退出VIM:
ZZ 保存退出
ZQ 不保存退出

光标跳转:
字符间跳转:
h: 左 L: 右 j: 下 k: 上
#COMMAND:跳转由#指定的个数的字符
单词间跳转:
w:下一个单词的词首
e:当前或下一单词的词尾
b:当前或前一个单词的词首
#COMMAND:由#指定一次跳转的单词数
当前页跳转:
H:页首 M:页中间行 L:页底
zt:将光标所在当前行移到屏幕顶端
zz:将光标所在当前行移到屏幕中间
zb:将光标所在当前行移到屏幕底端
行首行尾跳转:
^ 跳转至行首的第一个非空白字符
0 跳转至行首
$ 跳转至行尾
行间移动:
#G 或者扩展命令模式下:# 跳转至由第#行
G 最后一行
1G, gg 第一行
句间移动:(有逗号为一句)
) 下一句 ( 上一句
段落间移动:(有空行为一段落)
} 下一段 { 上一段
命令模式翻屏操作
Ctrl+f 向文件尾部翻一屏
Ctrl+b 向文件首部翻一屏
Ctrl+d 向文件尾部翻半屏
Ctrl+u 向文件首部翻半屏

字符编辑
x 删除光标处的字符(相当于剪切,只剪切最后一个字符)
#x 删除光标处起始的#个字符
xp 交换光标所在处的字符及其后面字符的位置(p为粘贴)
~ 转换大小写
J 删除当前行后的换行符

替换命令(replace)
r 只替换光标所在处的一个字符
R 切换成REPLACE模式,按ESC回到命令模式

删除命令(delete)(相当于剪切命令)
d 删除命令,可结合光标跳转字符,实现范围删除
d$ 删除到行尾
d^ 删除到非空行首
d0 删除到行首
dw
de
db
#COMMAND
dd: 删除光标所在的行
#dd 多行删除
D: 从当前光标位置一直删除到行尾,等同于d$

复制命令(yank)
y 复制,行为相似于d命令
y$
y0
y^
ye
yw
yb
#COMMAND
yy:复制行
#yy 复制多行
Y: 复制整行

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

改变命令(change) 模式会切换
c: 删除后切换成插入模式
c$
c^
c0
cb
ce
cw
#COMMAND
cc:删除当前行并输入新内容,相当于S
#cc
C: 删除当前光标到行尾,并切换成插入模式,相当于c$

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

撤消更改
u 撤销最近的更改,相当于windows中Ctrl+z
#u 撤销之前多次更改
U 撤消光标落在这行后所有此行的更改
Ctrl - r 重做最后的“撤消”更改,相当于windows中Ctrl+y
. 重复前一个操作
#. 重复前一个操作#次
100 i wang wang粘贴100次(i进出插入模式)

高级用法:<start position><command><end position>
常见Command:y 复制、d 删除、gU 变大写、gu 变小写
0y$ 命令
0 → 先到行头
y → 从这里开始拷贝
$ → 拷贝到本行最后一个字符

di" 光标在”“之间,则删除”“之间的内容
yi( 光标在()之间,则复制()之间的内容
vi[ 光标在[]之间,则选中[]之间的内容
dtx 删除字符直到遇见光标之后的第一个 x 字符
ytx 复制字符直到遇见光标之后的第一个 x 字符

可视化模式
在末行“--VISUAL--”指示,表示可视化模式
v 面向字符(可选中光标字符)
V 面向整行(可选中光标所在整行)
ctrl-v 面向块 (可选中光标所在的矩形)
可视化键可用于与移动键结合使用
w ) } 箭头等
突出显示的文字可被删除,复制,变更,过滤,搜索,替换等

多文件模式
vim FILE1 FILE2 FILE3 ...
:next 下一个
:prev 前一个
:first 第一个
:last 最后一个
:wall 保存所有
:qall 不保存退出所有
:wqall保存退出所有

多窗口模式
多文件分割:
vim -o|-O FILE1 FILE2 ...
-o: 水平或上下分割
-O: 垂直或左右分割(vim only)
在窗口间切换:Ctrl+w, Arrow
单文件窗口分割
Ctrl+w,s:split, 水平分割
Ctrl+w,v:vertical, 垂直分割
ctrl+w,q:取消相邻窗口
ctrl+w,o:取消全部窗口
:wqall 退出

vim的寄存器:
有26个命名寄存器和1个无命名寄存器,常存放不同的剪贴版内容,可以不同会话间共享
寄存器名称a,b,…,z,格式:“寄存器 放在数字和命令之间
3"tyy 表示复制3行到t寄存器中
"tp 表示将t寄存器内容粘贴
10个数字寄存器,用0,1,…,9表示,0存放最近复制内容,1存放最近删除内容。当新的文本变更
和删除时,1转存到2,2转存到3,以此类推。数字寄存器不能在不同会话间共享

标记和宏:(记录操作执行录制操作)
ma 将当前位置标记为a,26个字母均可做标记, mb 、 mc 等等
‘a 跳转到a标记的位置,实用的文档内标记方法,文档中跳跃编辑时很有用
qa 录制宏 a,a为宏的名称
q 停止录制宏
@a 执行宏 a
@@ 重新执行上次执行的宏

编辑二进制文件:
#以二进制方式打开文件
vim -b binaryfile
#扩展命令模式下,利用xxd命令转换为可读的十六进制
:%!xxd
#插入模式下,编辑二进制文件
#扩展命令模式下,利用xxd命令转换回二进制
:%!xxd -r
#保存退出

帮助:
:help
:help topic
Use :q to exit help

文本常见处理工具:

查看文本文件内容
cat 可以查看文本内容
-E:显示行结束符$
-A:显示所有控制符
-n:对显示出的每一行进行编号
-b:非空行编号
-s:压缩连续的空行成一行
cat [OPTION]... [FILE]...

tac 逆向显示文本内容
nl 显示行号,相当于cat -b
rev 将同一行的内容逆向显示
(都支持标准输入)

查看非文本文件内容:
hexdump -C
od -t x
xxd

分页查看文件内容
more 可以实现分页查看文件,可以配合管道实现输出信息的分页
-d: 显示翻页及退出提示
less 也可以实现分页查看文件或STDIN输出
/文本 搜索 文本
n/N 跳到下一个 或 上一个匹配
less 命令是man命令使用的分页器

显示文本前或后行内容
head 可以显示文件或标准输入的前面行(默认前十行)
-c # 指定获取前#字节
-n # 指定获取前#行
-# 同上
tail 和head 相反,查看文件或标准输入的倒数行
-c # 指定获取后#字节
-n # 指定获取后#行
-# 同上
-f 跟踪显示文件fd新追加的内容,常用日志监控,相当于 --follow=descriptor,当文件删除再新建同名文
件,将无法继续跟踪文件
-F 跟踪文件名,相当于--follow=name --retry,当文件删除再新建同名文件,将可以继续跟踪文件

tail -f /var/log/messages
logger 生成日志
dmesg 监控事件

按列抽取文本
cut 命令可以提取文本文件或STDIN数据的指定列
-d DELIMITER: 指明分隔符,默认tab
-f FILEDS:
#: 第#个字段,例如:3
#,#[,#]:离散的多个字段,例如:1,3,6
#-#:连续的多个字段, 例如:1-6
混合使用:1-3,7
-c 按字符切割
--output-delimiter=STRING指定输出分隔符

合并多个文件:
paste 合并多个文件同行号的列到一行
-d 分隔符:指定分隔符,默认用TAB
-s : 所有行合成一行显示

分析文本的工具
收集文本统计数据
wc 命令可用于统计文件的行总数、单词总数、字节总数和字符总数
可以对文件或STDIN中的数据统计
-l 只计数行数
-w 只计数单词总数
-c 只计数字节总数
-m 只计数字符总数
-L 显示文件中最长行的长度

文本排序sort
把整理过的文本显示在STDOUT,不改变原始文件
-r 执行反方向(由上至下)整理
-R 随机排序
-n 执行按数字大小整理
-f 选项忽略(fold)字符串中的字符大小写
-u 选项(独特,unique)删除输出中的重复行
-t c 选项使用c做为字段界定符
-k # 选项按照使用c字符分隔的 # 列来整理能够使用多次

去重uniq
uniq命令从输入中删除前后相接的重复的行(必须是连续的)
-c: 显示每行重复出现的次数
-d: 仅显示重复过的行
-u: 仅显示不曾重复的行

比较文件
diff 命令比较两个文件之间的区别
-u 选项来输出“统一的(unified)”diff格式文件,最适用于补丁文件
patch 复制在其它文件中进行的改变(要谨慎使用)
适用 -b 选项来自动备份改变了的文件(原文件文件名会加.orig 后缀)
cmp 命令查看二进制文件的不同

正则表达式
REGEXP: Regular Expressions,由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)
不表示字符字面意义,而表示控制或通配的功能,类似于增强版的通配符功能,与通配符不通,通配符用来处理文件名,正则表达式用来处理文本文件内容中的字符
正则表达式被很多程序和开发语言所广泛支持:vim, less,grep,sed,awk, nginx,mysql 等
正则表达式分两类:
基本正则表达式:BRE
扩展正则表达式:ERE
正则表达式引擎:
采用不同算法,检查处理正则表达式的软件模块,如:PCRE(Perl Compatible Regular
Expressions)
正则表达式的元字符分类:字符匹配、匹配次数、位置锚定、分组
帮助:man 7 regex
字符匹配
.   匹配任意单个字符
[]   匹配指定范围内的任意单个字符,示例:[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:] 标点符号

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

位置锚定
位置锚定可以用于定位出现的位置
^ 行首锚定,用于模式的最左侧
$ 行尾锚定,用于模式的最右侧
^PATTERN$ 用于模式匹配整行
^$ 空行
^[[:space:]]*$ 空白行
\< 或 \b 词首锚定,用于单词模式的左侧
\> 或 \b 词尾锚定,用于单词模式的右侧
\<PATTERN\> 匹配整个单词

单词边界:除了字母数字下划线都是单词边界

分组其它
\( \) 分组
后向引用:\1, \2, ...
\| 或者
a\|b #a或b
C\|cat #C或cat
\(C|\c)at #Cat或cat

扩展正则表达式
. 任意单个字符
[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, ...
| 或者
a|b #a或b
C|cat #C或cat
(C|c)at #Cat或cat

文本处理三剑客之 grep
grep [OPTIONS] PATTERN [FILE...]
作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行
模式:由正则表达式字符及文本字符所编写的过滤条件
egrep 默认扩展正则表达式
grep 默认正则表达式
--color=auto 对匹配到的文本着色显示
-m # 匹配#次后停止
-v 显示不被pattern匹配到的行
-i 忽略字符大小写
-n 显示匹配的行号
-c 统计匹配的行数
-o 仅显示匹配到的字符串
-q 静默模式,不输出任何信息
-A # after, 后#行
-B # before, 前#行
-C # context, 前后各#行
-e 实现多个选项间的逻辑or关系,如:grep –e ‘cat ’ -e ‘dog’ file
-w 匹配整个单词
-E 使用ERE,相当于egrep
-F 相当于fgrep,不支持正则表达式
-f file 根据模式文件处理
-r 递归目录,但不处理软链接
-R 递归目录,但处理软链接

文本处理三剑客之 sed
sed 工作原理:sed 即 Stream EDitor,和 vi 不同,sed是行编辑器
Sed是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行,直到
最后一行。每当处理一行时,把当前处理的行存储在临时缓冲区中,称为模式空间(Pattern
Space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下
一行,这样不断重复,直到文件末尾。一次处理一行的设计模式使得sed性能很高,sed在读取大文件时
不会出现卡顿的现象。如果使用vi命令打开几十M上百M的文件,明显会出现有卡顿的现象,这是因为
vi命令打开文件是一次性将文件加载到内存,然后再打开。Sed就避免了这种情况,一行一行的处理,
打开速度非常快,执行速度也很快

sed 基本用法
格式:
sed [option]... ‘script;script;...‘ inputfile...

常用选项:
-n 不输出模式空间内容到屏幕,即不自动打印
-e 多点编辑
-f /PATH/SCRIPT_FILE 从指定文件中读取编辑脚本
-r, -E 使用扩展正则表达式
-i.bak 备份文件并原处编辑

script格式:
‘地址命令‘

地址格式:
1. 不给地址:对全文进行处理
2. 单地址:
  #:指定的行,$:最后一行
  /pattern/:被此处模式所能够匹配到的每一行
3. 地址范围:
  #,#     #从#行到第#行,3,6 从第3行到第6行
  #,+#   #从#行到+#行,3,+4 表示从3行到第7行
  /pat1/,/pat2/
  #,/pat/
4. 步进:~
  1~2 奇数行
  2~2 偶数行

命令:
p 打印当前模式空间内容,追加到默认输出之后
Ip 忽略大小写输出
d 删除模式空间匹配的行,并立即启用下一轮循环
a [\\]text 在指定行后面追加文本,支持使用\n实现多行追加
i [\\]text 在行前面插入文本
c [\\]text 替换行为单行或多行文本
w /path/file 保存模式匹配的行至指定文件
r /path/file 读取指定文件的文本至模式空间中匹配到的行后
= 为模式空间中的行打印行号
! 模式空间中匹配行取反处理
s/pattern/string/ 修饰符 查找替换,支持使用其它分隔符,可以是其它形式:@@,s###替换修饰符:
g 行内全局替换
p 显示替换成功的行
w   /PATH/FILE 将替换成功的行保存至文件中
I,i  忽略大小写

相关推荐