目录
1 文本编辑工具之神vim
1.1 使用vim初步
1.1.1 vim命令格式
vim [OPTION]... FILE...
常用选项:
- +# 打开文件后,让光标处于第#行的行首,+默认行尾
- +/PATTERN 让光标处于第一个被PATTERN匹配到的行行首
- -b file 二进制方式打开文件
- -d file1 file2… 比较多个文件,相当于 vimdiff
- -m file 只读打开文件
- -e file 直接进入ex模式,相当于执行ex file
- -y file Easy mode 直接可以操作文件,ctrl+o:wq|q! 保存和不保存退出
说明:
- 如果该文件存在,文件被打开并显示内容
- 如果该文件不存在,当编辑后第一次存盘时创建它
1.1.2 三种主要模式和转换
vim的三种主要模式:
- 命令或普通(Normal)模式:默认模式,可以实现移动光标,剪切/粘贴文本
- 插入(Insert)或编辑模式:用于修改文本
- 扩展命令(extended command )或命令(末)行模式:保存,退出等
三种模式相互转换的方法:
命令模式 --> 插入模式
- i insert, 在光标所在处输入
- I 在当前光标所在行的行首输入
- a append, 在光标所在处后面输入
- A 在当前光标所在行的行尾输入
- o 在当前光标所在行的下方打开一个新行
- O 在当前光标所在行的上方打开一个新行
插入模式 --- ESC-----> 命令模式
命令模式 ---- : ----> 扩展命令模式
扩展命令模式 ----ESC,enter----> 命令模式
1.2 扩展命令模式
按“:”进入Ex模式 ,创建一个命令提示符: 处于底部的屏幕左侧
1.2.1 扩展命令模式基本命令
- w 写(存)磁盘文件
- wq 写入并退出
- x 写入并退出
- X 加密
- q 退出
- q! 不存盘退出,即使更改都将丢失
- r filename 读文件内容到当前文件中
- w filename 将当前文件内容写入另一个文件
- !command 执行命令
- r!command 读入命令的输出
1.2.2 地址界定
格式:
- :start_pos,end_pos CMD
地址界定格式:
# #具体第#行,例如2表示第2行
#,# #从左侧#表示起始行,到右侧#表示结尾行
#,+# #从左侧#表示的起始行,加上右侧#表示的行数,范例:2,+3 表示2到5行
. #当前行
$ #最后一行
.,$-1 #当前行到倒数第二行
% #全文, 相当于1,$
/pattern/ #从当前行向下查找,直到匹配pattern的第一行,即:正则表达式
/pat1/,/pat2/ #从第一次被pat1模式匹配到的行开始,一直到第一次被pat2匹配到的行结束
#,/pat/ #从指定行开始,一直找到第一个匹配patttern的行结束
/pat/,$ #向下找到第一个匹配patttern的行到整个文件的结尾的所有行
地址定界后跟一个编辑命令:
d #删除
y #复制
w file #将范围内的行另存至指定文件中
r file #在指定位置插入指定文件中的所有内容
1.2.3 查找并替换
格式:
- s/要查找的内容/替换为的内容/修饰符
说明:
- 要查找的内容:可使用基本正则表达式模式
- 替换为的内容:不能使用模式,但可以使用\1, \2, ...等后向引用符号;还可以使用“&”引用前面查找时查找到的整个内容
- 查找替换中的分隔符/可替换为其它字符,如:#,@
修饰符:
- i #忽略大小写
- g #全局替换,默认情况下,每一行只替换第一次出现
- gc #全局替换,每次替换前询问
范例:
- s@/etc@/var@g
- s#/boot#/#i
1.2.4 定制vim的工作特性
扩展命令模式的配置只是对当前vim进程有效,可将配置存放在文件中持久保存
配置文件:/
- etc/vimrc #全局
- ~/.vimrc #个人
1.2.4.1 行号
- 显示:set number,简写 set nu
- 取消显示:set nonumber, 简写 set nonu
1.2.4.2 忽略字符的大小写
- 启用:set ignorecase,简写 set ic
- 不忽略:set noic
1.2.4.3 自动缩进
- 启用:set autoindent,简写 set ai
- 禁用:set noai
1.2.4.4 复制保留格式
- 启用:set paste
- 禁用:set nopaste
1.2.4.5 显示Tab和换行符 ^I 和$显示
- 启用:set list
- 禁用:set nolist
1.2.4.6 高亮搜索
- 启用:set hlsearch
- 禁用:set nohlsearch
1.2.4.7 语法高亮
- 启用:syntax on
- 禁用:syntax off
1.2.4.8 文件格式
- 启用windows格式:set fileformat=dos
- 启用unix格式:set fileformat=unix
- 简写 set ff=dos|unix
1.2.4.9 Tab用空格代替
- 启用:set expandtab 默认为8个空格代替Tab
- 禁用:set noexpandtab
- 简写:set et
1.2.4.10 Tab用指定空格的个数代替
- 启用:set tabstop=# 指定#个空格代替Tab
- 简写:set ts=4
1.2.4.11 设置文本宽度
- set textwidth=65 (vim only)
- set wrapmargin=15
1.2.4.12 设置光标所在行的标识线
- 启用:set cursorline,简写 set cul
- 禁用:set nocursorline
1.2.4.13 加密
- 启用: set key=password
- 禁用: set key=
1.2.4.14 了解更多
set 帮助
- :help option-list
- :set or :set all
1.3 命令模式
命令模式,又称为Normal模式,功能强大,只是此模式输入指令并在屏幕上显示,所以需要记忆大量 的快捷按键才能更好的使用。
1.3.1 退出VIM
- ZZ 保存退出
- ZQ 不保存退出
1.3.2 光标跳转
字符间跳转:
- h: 左 L: 右 j: 下 k: 上
- #COMMAND:跳转由#指定的个数的字符
单词间跳转:
- w:下一个单词的词首
- e:当前或下一单词的词尾
- b:当前或前一个单词的词首
- #COMMAND:由#指定一次跳转的单词数
当前页跳转:
- H:页首 M:页中间行 L:页底
- zt:将光标所在当前行移到屏幕顶端
- zz:将光标所在当前行移到屏幕中间
- zb:将光标所在当前行移到屏幕底端
行首行尾跳转:
- ^ 跳转至行首的第一个非空白字符
- 0 跳转至行首
- $ 跳转至行尾
行间移动:
- #G 或者扩展命令模式下
- :# 跳转至由第#行
- G 最后一行
- gg 第一行
句间移动:
- ) 下一句
- ( 上一句
段落间移动:
- } 下一段
- { 上一段
命令模式翻屏操作
- Ctrl+f 向文件尾部翻一屏
- Ctrl+b 向文件首部翻一屏
- Ctrl+d 向文件尾部翻半屏
- Ctrl+u 向文件首部翻半屏
1.3.3 字符编辑
- x 删除光标处的字符
- #x 删除光标处起始的#个字符
- xp 交换光标所在处的字符及其后面字符的位置
- ~ 转换大小写
- J 删除当前行后的换行符
1.3.4 替换命令
- r 只替换光标所在处的一个字符
- R 切换成REPLACE模式(在末行出现-- REPLACE -- 提示),按ESC回到命令模式
1.3.5 删除命令
- d 删除命令,可结合光标跳转字符,实现范围删除
- d$ 删除到行尾
- d^ 删除到非空行首
- d0 删除到行首
- dd: 剪切光标所在的行
- #dd 多行删除
- D:从当前光标位置一直删除到行尾,等同于d$
1.3.6 复制命令
y 复制,行为相似于d命令
- yy:复制行
- #yy 复制多行
- Y:复制整行
1.3.7 粘贴命令
- p 缓冲区存的如果为整行,则粘贴当前光标所在行的下方;否则,则粘贴至当前光标所在处的后面。
- P 缓冲区存的如果为整行,则粘贴当前光标所在行的上方;否则,则粘贴至当前光标所在处的前面。
1.3.8 改变命令
- c: 删除后切换成插入模式
- c$
- c^
- c0
- cb
- ce
- cw #COMMAND
- cc:删除当前行并输入新内容,相当于S
- #cc
- C:删除当前光标到行尾,并切换成插入模式,相当于c$
1.3.9 查找
- /PATTERN:从当前光标所在处向文件尾部查找
- ?PATTERN:从当前光标所在处向文件首部查找
- n:与命令同方向
- N:与命令反方向
1.3.10 撤销更改
u 撤销最近的更改,相当于windows中ctrl+z
- #u 撤销之前多次更改
- U 撤消光标落在这行后所有此行的更改
- Ctrl - r 重做最后的“撤消”更改,相当于windows中crtl+y
- . 重复前一个操作
- #. 重复前一个操作#次
1.3.11 高级用法
常见Command:y 复制、d 删除、gU 变大写、gu 变小写
范例:
- 0y$ 命令
- 0 → 先到行头
- y → 从这里开始拷贝
- $ → 拷贝到本行最后一个字符
范例:粘贴“wang”100次
- 100iwang [ESC]
1.4 可视化模式
在末行有”-- VISUAL -- “指示,表示在可视化模式
允许选择的文本块:
- v 面向字符,-- VISUAL -
- V 面向整行,-- VISUAL LINE --
- ctrl-v 面向块,-- VISUAL BLOCK --
范例:在文件行首插入#
- 输入ctrl+v 进入可视化模式
- 输入 G 跳到最后1行,选中每一行的第一个字符
- 输入 I 切换至插入模式
- 输入 #
- 按 ESC 键
1.5 多文件模式
vim FILE1 FILE2 FILE3 ...
- :next 下一个
- :prev 前一个
- :first 第一个
- :last 最后一个
- :wall 保存所有
- :qall 不保存退出所有
- :wqall保存退出所有
1.6 多窗口模式
1.6.1 多文件分割
- vim -o|-O FILE1 FILE2 ...
- -o: 水平或上下分割
- -O: 垂直或左右分割(vim only)
- 在窗口间切换:Ctrl+w, Arrow
1.6.2 单文件窗口分割
- Ctrl+w,s:split, 水平分割,上下分屏
- Ctrl+w,v:vertical, 垂直分割,左右分屏
- ctrl+w,q:取消相邻窗口
- ctrl+w,o:取消全部窗口
- :wqall 退出
1.7 vim寄存器
有26个命名寄存器和1个无命名寄存器,常存放不同的剪贴版内容,可以在同一个主机的不同会话(终端窗口)间共享。
寄存器名称a,b,…,z,格式: ”寄存器 放在数字和命令之间/
范例:
3"tyy 表示复制3行到t寄存器中 ,末行显示 3 lines yanked into "t
"tp 表示将t寄存器内容粘贴
未指定,将使用无命名寄存器
1.8 标记和宏
ma 将当前位置标记为a,26个字母均可做标记, mb 、 mc 等等
'a 跳转到a标记的位置,实用的文档内标记方法,文档中跳跃编辑时很有用
qa 录制宏 a,a为宏的名称,末行提示:recording @a
q 停止录制宏
@a 执行宏 a
@@ 重新执行上次执行的宏
1.9 编辑二进制文件
#以二进制方式打开文件
vim -b binaryfile
#扩展命令模式下,利用xxd命令转换为可读的十六进制
:%!xxd
#切换至扩展命令模式下,利用xxd命令转换回二进制
:%!xxd -r
1.10 帮助
- :help
- :help topic
- Use :q to exit help
- vimtutor
2 常见的文本处理工具
2.1 文件内容查看命令
2.1.1 查看文本文件内容
cat 查看文本内容
- -E:显示行结束符$
- -A:显示所有控制符
- -n:对显示出的每一行进行编号
- -b:非空行编号
- -s:压缩连续的空行成
nl 查看文件内容并显示行号,相当于cat -b
tac 逆向显示文本内容
rev 将文本的同一行逆向显示
2.1.2 查看非文本文件内容
hexdump 显示文件十六进制格式
- -C 输出规范的十六进制和ASCII码。
- -n 指定格式化输入文件的字节数
- -s 从偏移量开始输出
od 输出文件的八进制、十六进制等格式编码的字节
- -t<输出格式>或--format=<输出格式>:设置输出格式
xxd 命令是一个十六进制转储程序,用于创建输入文件的十六进制转储
2.2 分页查看文件内容
more 可以实现分页查看文件,可以配合管道实现输出信息的分页
- 选项-d: 显示翻页及退出提示
- 快捷键:/文本 搜索文本
- 快捷键:n/N 跳到下一个 或 上一个匹配
less 分屏上下翻页浏览文件内容
2.3 显示文本前或后行的内容
head 可以显示文件或标准输入的前面行
- -c # 指定获取前#字节
- -n # 指定获取前#行
- -# 同上
tail 和head 相反,查看文件或标准输入的倒数行
- -c # 指定获取后#字节
- -n # 指定获取后#行
- -# 同上
- -f 实时查看文件内容,当文件删除再新建同名文件,将无法继续跟踪文件
- -F 实时查看文件内容,当文件删除再新建同名文件,可以继续跟踪文件
范例:只查看最新产生的日志
tail -fn0 /var/log/messages
tail -0f /var/log/messages
2.4 按列抽取文本
cut 命令可以提取文本文件或STDIN数据的指定列
-d DELIMITER: 指明分隔符,默认tab
-f FILEDS:
#: 第#个字段,例如:3
#,#[,#]:离散的多个字段,例如:1,3,6
#-#:连续的多个字段, 例如:1-6
混合使用:1-3,7
-c 按字符切割
--output-delimiter=STRING指定输出分隔符
范例:提取主机IP地址
2.5 合并多个文件
paste 合并多个文件同行号的列到一行
- -d 分隔符:指定分隔符,默认用TAB
- -s : 所有行合成一行显
2.6 分析文本的工具
wc 命令可用于统计文件的行总数、单词总数、字节总数和字符总数
- -l 只计数行数
- -w 只计数单词总数
- -c 只计数字节总数
- -m 只计数字符总数
- -L 显示文件中最长行的长度
sort 命令可以进行文本排序
- -r 执行反方向(由上至下)整理
- -R 随机排序
- -n 执行按数字大小整理
- -f 选项忽略(fold)字符串中的字符大小写
- -u 选项(独特,unique),合并重复项,即去重
- -t c 选项使用c做为字段界定符
- -k # 选项按照使用c字符分隔的 # 列来整理能够使用多次
范例:统计分区利用率最高的值
uniq 命令从输入中删除前后相接的重复的行
- -c: 显示每行重复出现的次数
- -d: 仅显示重复过的行
- -u: 仅显示不曾重复的行
范例1:并发连接最多的远程主机IP
范例2:取两个文件的相同和不同的行
#取出相同行
cat test1.txt test2.txt | sort |uniq -d
#取出不同行
cat test1.txt test2.txt | sort |uniq -u
2.7 比较文件
- diff 命令比较两个文件之间的区别
- patch 复制在其它文件中进行的改变(要谨慎使用)
- cmp 比对二进制文件
范例:比对 /bin/dir 与 /bin/ls 两个而进制文件的不同
3 正则表达式
正则表达式分两类:
- 基本正则表达式:BRE
- 扩展正则表达式:ERE
3.1 基本正则表达式
3.1.1 字符匹配
. 匹配任意单个字符,可以是一个汉字
[] 匹配指定范围内的任意单个字符,示例:[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:] 标点符号
3.1.2 匹配次数
* 匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
.* 任意长度的任意字符
\? 匹配其前面的字符0或1次,即:可有可无
\+ 匹配其前面的字符至少1次,即:肯定有,>=1
\{n\} 匹配前面的字符n次
\{m,n\} 匹配前面的字符至少m次,至多n次
\{,n\} 匹配前面的字符至多n次,<=n
\{n,\} 匹配前面的字符至少n次
3.1.3 位置锚定
位置锚定可以用于定位出现的位置
^ 行首锚定,用于模式的最左侧
$ 行尾锚定,用于模式的最右侧
^PATTERN$ 用于模式匹配整行
^$ 空行
^[[:space:]]*$ 空白行
\< 或 \b 词首锚定,用于单词模式的左侧
\> 或 \b 词尾锚定,用于单词模式的右侧
\<PATTERN\> 匹配整个单词
范例:排除掉空行和#开头的行
grep -v '^$' /etc/profile|grep -v '^#'
3.1.4 分组与或者
分组的正则:\(\) 将多个字符捆绑在一起,当作一个整体处理,如:\(root\)+
- 后向引用:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名 方式为: \1, \2, \3, ...
- \1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
或者的正则:\|
范例:排除空行和#开头的行
grep -v '^#' /etc/httpd/conf/httpd.conf |grep -v ^$
grep -v '^#\|^$' /etc/httpd/conf/httpd.conf
grep -v '^\(#\|$\)' /etc/httpd/conf/httpd.conf
grep "^[^#]" /etc/httpd/conf/httpd.conf
3.2 扩展的正则
说明,扩展的正则表达式在基本的正则表达式前提上,去掉了\转义
在某些命令的参数中支持扩展正则,例如 grep -E。
4 文本处理三剑客之grep
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 递归目录,但处理软链接
范例1:利用grep加正则取出主机IP地址
范例2:算出所有人年龄的总和