七、文本处理工具
内容概述
文本编辑工具VIM 各种文本工具 基本正则表达式和扩展正则表达式 文本处理三剑客之grep
7.1 文本编辑工具之神VIM
7.1.1 vi和vim简介
在Linux中我们经常编辑修改文本文件,即由ASCII, Unicode 或其它编码的纯文字的文件。之前介绍过nano,实际工作中我们会使用更为专业,功能强大的工具。 文本编辑种类:
全屏编辑器:nano(字符工具), gedit(图形化工具),vi,vim 行编辑器:sed VI
Visual editor,文本编辑器,是 Linux 必备工具之一,功能强大,学习曲线较陡峭,学习难度大 VIM
其他相关编辑器:gvim 一个Vim编辑器的图形版本 VIM 小抄
7.1.2 使用 vim 初步
7.1.2.1 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
说明:
如果该文件存在,文件被打开并显示内容 如果该文件不存在,当编辑后第一次存盘时创建它 如果后面打开的是一个目录,则会列出目录中所有内容,可以用方向键进行选择 范例:
[ root@ubuntu2204 ~ ] # vim f1. txt #光标在第一行
[ root@ubuntu2204 ~ ] # vim + 3 f1. txt #光标在第3 行
[ root@ubuntu2204 ~ ] # vim + f1. txt #光标在最后一行
[ root@ubuntu2204 ~ ] # vim + / ^ abc f2. txt #模式匹配定位
[ root@ubuntu2204 ~ ] # vim + / ^ bc* f2. txt #模式匹配定位
7.1.2.2 三种主要模式和转换
vim 是一个模式编辑器,击键行为是依赖于 vim 的 的“模式”
三种模式:
命令或普通(Normal)模式:默认模式,可以实现移动光标,剪切/粘贴文本 插入(Insert)或编辑模式:用于修改文本 扩展命令(extended command )或命令(末)行模式:保存,退出等 三种模式之间的切换:
vim 是 一个模式编辑器,击键行为是依赖于 vim的 的“模式”,就是说,在不同模式下,相同的按键,是不同的意思;
插入模式和扩展命令模式之间不能直接切换,要走命令模式中转;
打开vim 默认就是命令模式;
#命令模式 -- -- -- -- -- -- -- -- -- -- -- -- -- > 插入模式
#下列按键皆可
#i insert, 在光标所在处输入
#I 在当前光标所在行的行首输入
#a append, 在光标所在处后面输入
#A 在当前光标所在行的行尾输入
#o 在当前光标所在行的下方打开一个新行
#O 在当前光标所在行的上方打开一个新行
#命令模式 -- -- -- -- -- -- -- -- -- -- -- -- -- > 扩展命令模式
#直接敲冒号 :
#################################################################
#插入模式 -- -- -- -- -- -- -- -- -- -- -- -- -> 命令模式
#按ESC 键
#插入模式 -- -- -- -- -- -- -- -- -- -- -- -- -> 扩展命令模式
#按ESC 到命令模式,再按冒号 : 到扩展命令模式
#################################################################
#扩展命令模式 -- -- -- -- -- -- -- -- -- -- -- > 命令模式
#ESC 键或Enter 键或退格健
#扩展命令模式 -- -- -- -- -- -- -- -- -- -- -> 插入模式
#ESC | Enter | 退格键 到命令模式,再i| I | a| A | o| O 到插入模式
[ root@ubuntu2204 ~ ] # echo - e '\e[ 1 ; 31 mhello\e[ 0 m'
vim 中实现
1️⃣ 切换至插入模式 2️⃣ 按ctrl+v+[ 三个键,显示 ^[ 3️⃣ 后续输入颜色信息,如:^[[32mhello^[[0m 4️⃣ 切换至扩展命令模式,保存退出 5️⃣ cat 文件可以看到下面显示
7.1.3 扩展命令模式
按:进入Ex模式 ,创建一个命令提示符: 处于底部的屏幕左侧
7.1.3.1 扩展命令模式基本命令
常用选项 含义 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: * * * * * *
: X #解密码
Enter encryption key: 直接回车键
Enter same key again: 直接回车键
7.1.3.2 地址定界
: start_pos, end_pos CMD
7.1.3.2.1 地址定界格式
常用选项 含义 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的行到整个文件的结尾的所有行
7.1.3.2.2 地址定界后跟一个编辑命令
常用选项 含义 p 输出 d 删除 y 复制 w file 将范围内的行另存至指定文件中 r file 在指定位置插入指定文件中的所有内容 t行号 将前面指定的行复制到N行后 m行号 将前面指定的行移动到N行后
[ root@rocky8 ~ ] # seq 10 > 10. txt
: 2d #删除第2 行
: 2 , 4d #删除第2 到第4 行
: 2 ; + 3 y #复制第2 到第5 行,总共4 行
: 2 ; + 4 w test #将第2 到第6 行,总共5 行内容写入新文件
: 5 r / etc/ issue #将/ etc/ issue 文件读取到第5 行的下一行
: t2 #将光标所在行复制到第2 行的下一行
: 2 ; + 3 t10 #将第2 到第5 行,总共4 行内容复制到第10 行之后
: . d #删除光标所在行
: $y #复制最后一行
: . , $d #删除光标所在行到最后一行
7.1.3.3 查找并替换
: 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/#// 将每行第一个#替换成空
: s/ root/ ROOT / #替换当前行第一个root
: s/ root/ ROOT / g #替换当前行所有root
: % s/ root/ ROOT / g #全文替换
: % s/ root/ test/ ig #不区分大小写全文替换
: % s/ #
7.1.3.4 定制vim的工作特性
扩展命令模式的配置只是对当前vim进程有效,可将配置存放在文件中持久保存; 写配置文件必须保证能识别,有些短格式在配置文件中无法识别 配置文件;
/ etc/ vimrc #全局配置
~ / . vimrc #个人配置
7.1.3.4.1 行号
: set number| set nu #显示行号
: set nonumber| set nonu #取消显示行号
7.1.3.4.2 忽略字符的大小写
: set ignorecase| set ic #忽略字符大小写
: set noignorecase| set noic #不忽略
7.1.3.4.3 自动缩进
: set autoindent| set ai #启用自动缩进
: set noautoindent| set noai #禁用自动缩进
7.1.3.4.4 复制保留格式
: set paste #复制时保留格式
: set nopaste #禁用复制时保留格式选项
7.1.3.4.5 显示Tab ^I和换行符 和$显示
: set list #显示系统字符
: set nolist #隐藏系统字符
7.1.3.4.6 高亮搜索
: set hlsearch #高亮显示搜索结果
: set nohlsearch| nohl #不高亮显示搜索结果
7.1.3.4.7 语法高亮
: syntax on #语法高亮
: syntax off #关闭语法高亮
7.1.3.4.8 文件格式
: set fileformat= dos| set ff= dos #启用windows格式
: set fileformat= unix| set ff= unix #启用unix格式:
7.1.3.4.9 Tab 用空格代替
: set expandtab| set et #使用空格代替Tab ,默认8 个空格
: set noexpandtab| set noet #禁用空格代替Tab
7.1.3.4.10 Tab用指定空格的个数代替
: set tabstop= N | set ts= N #指定N 个空格代替Tab
7.1.3.4.11 设置缩进宽度
>> #向右缩进 命令模式
<< #向左缩进 命令模式
: set shiftwidth= 4 #设置缩进为4 个字符
7.1.3.4.12 设置光标所在行的标识线
: set cursorline| set cul #给光标所在行加下划线
: set nocursorline| set nocul #取消光标下划线
7.1.3.4.13 加密
: set key= password #加密文档
: set key= #取消加密
7.1.3.4.14 了解更多
: help option- list
: set| : set all
7.1.4 命令模式
命令模式,又称为Normal模式,功能强大,但是在此模式下输入的命令不会在屏幕上显示,只能靠记忆 记住到底输入了什么,所以此处我们要记住大量快捷键;
7.1.4.1 退出VIM
7.1.4.2 光标跳转
常用命令 含义 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 向文件首部翻半屏
7.1.4.3 字符编辑
常用命令 含义 x 剪切光标处的字符 Nx 剪切光标处起始的N个字符,N为正整数 xp 交换光标所在处的字符及其后面字符的位置,本质是先剪切,再粘贴 ~ 转换大小写 J 删除当前行后的换行符,就是把下一行接到当前行后面
7.1.4.4 替换命令(replace)
常用命令 含义 r 只替换光标所在处的一个字符,先敲r,再输入想要替换的新字符 R 切换成REPLACE模式(在末行出现-- REPLACE – 提示),按ESC回到命令模式
7.1.4.5 删除命令(delete)
常用命令 含义 d 删除命令,可结合光标跳转字符,实现范围删除 d$ | D 删除光标处到行尾 d^ 删除光标处到非空行首 d0 删除光标处到处行首 dw 从光标处删到下一个单词的词首 de 从光标处删到当前单词词尾或下一单词的词尾 db 从光标处删到当前单词词首或前一单词的词首 dG 删除光标所在的行到文件末尾 dgg 删除光标所在的行到文件开始 dd 删除光标所在行 Ndd 从当前行开始,删N行,N表示正整数,2dd表示从当前行开始,总共删2行 这些内容都在缓冲区,可以用p键粘贴出来
7.1.4.6 复制命令(yank)
常用命令 含义 y 复制,行为相似于d命令 y$ 复制光标处到行尾 y0 复制光标处到行首 y^ 复制光标处到非空行首 yy|Y 复制整行,yy前面加数字,表示从当前处往后复制多少行; 3yy 表示往下复制3行 Nyy 从当前处往后复制N行, N表示正整数,2yy表示从当前行开始,总共复制2行 yw 从光标处复制到下一个单词的词首 ye 从光标处复制到当前单词词尾或下一单词的词尾 yb 从光标处复制到当前单词词首或下一单词的词首
7.1.4.7 粘贴命令(paste)
常用命令 含义 p 小写 p 缓冲区存的如果为整行,则粘贴当前光标所在行的下方;否则,则粘贴至当前光标所在处的后面 P 大写 p 缓冲区存的如果为整行,则粘贴当前光标所在行的上方;否则,则粘贴至当前光标所在处的前面
7.1.4.8 改变命令(change)
常用命令 含义 c$ | C 删除光标处到行尾,并切换成插入模式 c^ 删除光标处到非空行首,并切换成插入模式 c0 删除光标处到行首,并切换成插入模式 cc 删除当前行并输入新内容,相当于S,加数字表示向下删除多少行,然后切换成插入模式 Ncc N表示正整数 cw 从光标处删到下一个单词的词首,并切换成插入模式 ce 从光标处删到当前单词词尾或下一单词的词尾,并切换成插入模式 cb 从光标处删到当前单词词首或下一单词的词首,并切换成插入模式
常用命令 Change(replace) Delete(cut) Yank(copy) Line cc dd yy Letter cl dl yl Word cw dw yw Sentence ahead c) d) y) Sentence behind c( d( y( Paragraph above c{ d{ y{ Paragraph below c} d} y}
7.1.4.9 查找
常用命令 含义 /PATTERN 从当前光标所在处向文件尾部查找 ?PATTERN 从当前光标所在处向文件首部查找 n 与命令同方向 N 与命令反方向
7.1.4.10 撤消更改
常用命令 含义 u 撤销最近的更改,相当于windows中ctrl+z Nu 撤销之前多次更改,N表示正整数 U 撤消光标落在这行后所有此行的更改 Ctrl+r 重做最后的“撤消”更改,相当于windows中crtl+y . 重复前一个操作 N. 重复前一个操作N次,N为正整数
7.1.4.11 高级用法
< start position> < command> < end position>
常见Command:y 复制、d 删除、gU 变大写、gu 变小写 范例:
范例 含义 #START COMMAND END 0y$ 复制整行,0表示到行首,y表示复制,$表示行尾,连起来就是复制整行 di" 光标在" “之间,则删除” "之间的内容 yi( 光标在()之间,则复制()之间的内容 vi[ 光标在[]之间,则选中[]之间的内容 dtx 删除字符直到遇见光标之后的第一个 x 字符 ytx 复制字符直到遇见光标之后的第一个 x 字符 10iabc ESC 在光标处插入10个abc
7.1.5 可视化模式
7.1.6 多窗口模式
7.1.6.1 多文件分割
vim FILE1 FILE2 . . .
#多文件之间切换
: next
: prev
vim - o| - O FILE1 FILE2 . . .
- o #水平或上下分割
- O #垂直或左右分割(vim only)
: wqall #退出
Ctrl + w, Arrow #在窗口间切换
[ root@rocky8 ~ ] # vim - o f1. txt f2. txt
[ root@rocky8 ~ ] # vim - O f1. txt f2. txt
7.1.6.2 单文件窗口分割
常用命令 含义 Ctrl+w,s split, 水平分割,上下分屏 Ctrl+w,v vertical, 垂直分割,左右分屏 ctrl+w,q 取消相邻窗口 ctrl+w,o 取消全部窗口 :wqall 退出 Ctrl+w, Arrow 在窗口间切换,Arrow 表示方向键
7.1.7 帮助
: help
: help topic #topic 是指主题,比如 : help yy 就表示查看yy命令的用法
: q #退出help
: help index #列出所有主题
[ root@ubuntu2204 ~ ] # vimtutor
7.1.8 vim 总结图
7.2 文本常见处理工具
7.2.1 文件内容查看命令
7.2.1.1 查看文本文件内容
7.2.1.1.1 cat
cat [ OPTION ] . . . [ FILE ] . . .
常用选项 含义 -E|–show-ends 显示行结束符$ -A|–show-all 显示所有控制符 -n|–number 对显示出的每一行进行编号 -b|–number-nonblank 非空行编号 -s|–squeeze-blank 压缩连续的空行成一行
[ root@ubuntu2204 ~ ] # cat - A / data/ fa. txt
a b$
c $
d^ Ib ^ Ic $
[ root@ubuntu2204 ~ ] # cat / data/ fa. txt
a b
c
d b c
[ root@ubuntu2204 ~ ] # cat / data/ fb. txt
a
b
c
[ root@ubuntu2204 ~ ] # hexdump - C / data/ fb. txt
00000000 61 0d 0 a 62 0d 0 a 63 0d 0 a | a. . b. . c. . |
00000009
[ root@ubuntu2204 ~ ] # cat - A / data/ fb. txt
a^ M $
b^ M $
c^ M $
[ root@ubuntu2204 ~ ] # file / data/ fb. txt
/ data/ fb. txt: ASCII text, with CRLF line terminators
7.2.1.1.2 nl : 显示行号,相当于cat -b
[ root@ubuntu2204 ~ ] # cat / data/ f1. txt
a
b
c
d
e
f
g
h
[ root@ubuntu2204 ~ ] # nl / data/ f1. txt
1 a
2 b
3 c
4 d
5 e
6 f
7 g
8 h
7.2.1.1.3 tac : 逆向显示文本内容,行倒序显示
[ root@ubuntu2204 ~ ] # cat / data/ fa. txt
1
2
3
4
5
[ root@ubuntu2204 ~ ] # tac / data/ fa. txt
5
4
3
2
1
[ root@ubuntu2204 ~ ] # tac
a
bb
ccc 按ctrl+ d
ccc
bb
a
[ root@ubuntu2204 ~ ] # seq 10 | tac
10
9
8
7
6
5
4
3
2
1
7.2.1.1.4 rev : 将同一行的内容逆向显示,同一行倒序
[ root@ubuntu2204 ~ ] # cat / data/ fa. txt
1 2 3 4 5
a b c
#上下顺序逆向
[ root@ubuntu2204 ~ ] # tac / data/ fa. txt
a b c
1 2 3 4 5
#逐行逆向
[ root@ubuntu2204 ~ ] # rev / data/ fa. txt
5 4 3 2 1
c b a
#标准输入
[ root@ubuntu2204 ~ ] #rev
abcdef
fedcba
[ root@ubuntu2204 ~ ] # echo { 1. .10 } | rev
01 9 8 7 6 5 4 3 2 1
[ root@ubuntu2204 ~ ] $ vim xyz
[ root@ubuntu2204 ~ ] $ cat xyz
1234
5678
abcd
ABCD
[ root@ubuntu2204 ~ ] $ tac xyz
ABCD
abcd
5678
1234
[ root@ubuntu2204 ~ ] $ cat xyz | tac
ABCD
abcd
5678
1234
[ root@ubuntu2204 ~ ] $ cat xyz | tac | rev
DCBA
dcba
8765
4321
[ root@ubuntu2204 ~ ] $ cat xyz | rev
4321
8765
dcba
DCBA
[ root@ubuntu2204 ~ ] $ cat xyz | rev | tac
DCBA
dcba
8765
4321
7.2.1.2 查看非文本文件内容
hexdump - C - n 512 / dev/ sda
echo { a. . z} | tr - d ' ' | hexdump - C
[ root@Rockey9 - 1 ~ ] # hexdump - C - n 512 / dev/ sda
00000000 eb 63 90 10 8 e d0 bc 00 b0 b8 00 00 8 e d8 8 e c0 | . c. . . . . . . . . . . . . . |
00000010 fb be 00 7 c bf 00 06 b9 00 02 f3 a4 ea 21 06 00 | . . . |. . . . . . . . . !. . |
00000020 00 be be 07 38 04 75 0 b 83 c6 10 81 fe fe 07 75 | . . . .8 . u. . . . . . . . u|
00000030 f3 eb 16 b4 02 b0 01 bb 00 7 c b2 80 8 a 74 01 8 b | . . . . . . . . . |. . . t. . |
00000040 4 c 02 cd 13 ea 00 7 c 00 00 eb fe 00 00 00 00 00 | L . . . . . |. . . . . . . . . |
00000050 00 00 00 00 00 00 00 00 00 00 00 80 01 00 00 00 | . . . . . . . . . . . . . . . . |
00000060 00 00 00 00 ff fa 90 90 f6 c2 80 74 05 f6 c2 70 | . . . . . . . . . . . t. . . p|
00000070 74 02 b2 80 ea 79 7 c 00 00 31 c0 8 e d8 8 e d0 bc | t. . . . y| . .1 . . . . . . |
00000080 00 20 fb a0 64 7 c 3 c ff 74 02 88 c2 52 be 80 7d | . . . d| < . t. . . R. . } |
00000090 e8 17 01 be 05 7 c b4 41 bb aa 55 cd 13 5 a 52 72 | . . . . . |. A. . U. . ZRr|
000000 a0 3d 81 fb 55 aa 75 37 83 e1 01 74 32 31 c0 89 44 |= . . U. u7. . . t21. . D|
000000 b0 04 40 88 44 ff 89 44 02 c7 04 10 00 66 8 b 1 e 5 c | . @. D. . D. . . . . f. . \|
000000 c0 7 c 66 89 5 c 08 66 8 b 1 e 60 7 c 66 89 5 c 0 c c7 44 || f. \. f. . `| f. \. . D|
000000d 0 06 00 70 b4 42 cd 13 72 05 bb 00 70 eb 76 b4 08 | . . p. B. . r. . . p. v. . |
000000e0 cd 13 73 0d 5 a 84 d2 0f 83 d8 00 be 8 b 7d e9 82 | . . s. Z. . . . . . . . } . . |
000000f 0 00 66 0f b6 c6 88 64 ff 40 66 89 44 04 0f b6 d1 | . f. . . . d. @f. D. . . . |
00000100 c1 e2 02 88 e8 88 f4 40 89 44 08 0f b6 c2 c0 e8 | . . . . . . . @. D. . . . . . |
00000110 02 66 89 04 66 a1 60 7 c 66 09 c0 75 4 e 66 a1 5 c | . f. . f. `| f. . uNf. \|
00000120 7 c 66 31 d2 66 f7 34 88 d1 31 d2 66 f7 74 04 3 b || f1. f. 4. .1 . f. t. ; |
00000130 44 08 7d 37 fe c1 88 c5 30 c0 c1 e8 02 08 c1 88 | D . } 7. . . .0 . . . . . . . |
00000140 d0 5 a 88 c6 bb 00 70 8 e c3 31 db b8 01 02 cd 13 | . Z. . . . p. .1 . . . . . . |
00000150 72 1 e 8 c c3 60 1 e b9 00 01 8 e db 31 f6 bf 00 80 | r. . . `. . . . . .1 . . . . |
00000160 8 e c6 fc f3 a5 1f 61 ff 26 5 a 7 c be 86 7d eb 03 | . . . . . . a. &Z | . . } . . |
00000170 be 95 7d e8 34 00 be 9 a 7d e8 2 e 00 cd 18 eb fe | . . } .4 . . . } . . . . . . . |
00000180 47 52 55 42 20 00 47 65 6f 6d 00 48 61 72 64 20 | GRUB . Geom. Hard |
00000190 44 69 73 6 b 00 52 65 61 64 00 20 45 72 72 6f 72 | Disk. Read. Error |
000001 a0 0d 0 a 00 bb 01 00 b4 0 e cd 10 ac 3 c 00 75 f4 c3 | . . . . . . . . . . . <. u. . |
000001 b0 00 00 00 00 00 00 00 00 2 a f9 77 8 a 00 00 80 04 | . . . . . . . . *. w. . . . . |
000001 c0 01 04 83 fe c2 ff 00 08 00 00 00 00 20 00 00 fe | . . . . . . . . . . . . . . . |
000001d 0 c2 ff 8 e fe c2 ff 00 08 20 00 00 f8 df 18 00 00 | . . . . . . . . . . . . . . . |
000001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | . . . . . . . . . . . . . . . . |
000001f 0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa | . . . . . . . . . . . . . . U. |
00000200
[ root@Rockey9 - 1 ~ ] #
[ root@Rockey9 - 1 ~ ] # echo { a. . z} | tr - d ' ' | hexdump - C
00000000 61 62 63 64 65 66 67 68 69 6 a 6 b 6 c 6d 6 e 6f 70 | abcdefghijklmnop|
00000010 71 72 73 74 75 76 77 78 79 7 a 0 a | qrstuvwxyz. |
0000001 b
[ root@ubuntu2204 ~ ] $ cat xyz
1234
5678
abcd
ABCD
[ root@ubuntu2204 ~ ] $ hexdump xyz
0000000 3231 3433 350 a 3736 0 a38 6261 6463 410 a
0000010 4342 0 a44
0000014
[ root@ubuntu2204 ~ ] $ hexdump - C xyz
00000000 31 32 33 34 0 a 35 36 37 38 0 a 61 62 63 64 0 a 41 | 1234.5678 . abcd. A|
00000010 42 43 44 0 a | BCD . |
00000014
7.2.2 分页查看文件内容
7.2.2.1 more
可以实现分页查看文件,可以配合管道实现输出信息的分页 格式
more [ OPTIONS . . . ] FILE . . .
命令选项 含义 空格键 翻页 回车键 下一行 !cmd 执行命令 h 显示帮助 :f 显示文件名和当前行号 = 显示行号
[ root@ubuntu2204 ~ ] # more / var / log/ syslog
[ root@ubuntu2204 ~ ] # cat / var / log/ syslog | more
7.2.2.2 less
less 也可以实现分页查看文件或STDIN输出,less 命令是man命令使用的分页器 格式:
less [ OPTIONS . . . ] FILE . . .
常用选项 含义 -e 显示完成后自动退出 -N 显示行号 -s 压缩连续空行 -S 不换行显示较长的内容
命令选项 含义 :h 显示帮助 /string 搜索 :!cmd 执行命令 b 向上翻
[ root@ubuntu2204 ~ ] # less - N / var / log/ syslog
[ root@ubuntu2204 ~ ] # tree / - d | less
7.2.3 显示文本前面或后面的行内容
7.2.3.1 head
head [ OPTION ] . . . [ FILE ] . . .
常用选项 含义 -c|–bytes=N 指定获取前N字节 -n|–lines=N 指定获取前N行,N如果为负数,表示从文件头取到倒数第N前 -N 同上 -q|–quiet|–silent 不输出文件名 -v|–verbose 输出文件名 -z|–zero-terminated 以NULL字符而非换行符作为行尾分隔符
[ root@ubuntu2204 ~ ] $ echo "123456" | head - c 5
12345 [ root@ubuntu2204 ~ ] $ echo "123456" | head - c 3
123 [ root@ubuntu2204 ~ ] $ echo "123456" | head - n 1
123456
[ root@ubuntu2204 ~ ] $ echo "123456" | head
123456
[ root@ubuntu2204 ~ ] # head - n 3 / etc/ passwd
root: x: 0 : 0 : root: / root: / bin/ bash
daemon: x: 1 : 1 : daemon: / usr/ sbin: / usr/ sbin/ nologin
bin: x: 2 : 2 : bin: / bin: / usr/ sbin/ nologin
[ root@ubuntu2204 ~ ] # head - 3 / etc/ passwd
root: x: 0 : 0 : root: / root: / bin/ bash
daemon: x: 1 : 1 : daemon: / usr/ sbin: / usr/ sbin/ nologin
bin: x: 2 : 2 : bin: / bin: / usr/ sbin/ nologin
[ root@ubuntu2204 ~ ] # echo a我b | head - c4
a我[ root@ubuntu2204 ~ ] #
[ root@ubuntu2204 ~ ] # cat / dev/ urandom | tr - dc '[ : alnum: ] '| head - c10
G755MlZatW [ root@ubuntu2204 ~ ] # cat / dev/ urandom | tr - dc '[ : alnum: ] '| head - c10
ASsax6DeBz [ root@ubuntu2204 ~ ] #
#用随机字符串修改密码
[ root@centos8 ~ ] # cat / dev/ urandom | tr - dc '[ : alnum: ] '| head - c10 | tee pass. txt| passwd -- stdin mage
Changing password for user mage.
passwd: all authentication tokens updated successfully.
[ root@centos8 ~ ] # cat pass. txt
AGT952Essg [ root@centos8 ~ ] # su - wang
[ wang@centos8 ~ ] $ su - mage
Password :
[ root@ubuntu2204 ~ ] # cat seq. log
1
2
3
4
5
6
7
8
9
10
[ root@ubuntu2204 ~ ] # head - n 3 seq. log
1
2
3
[ root@ubuntu2204 ~ ] # head - n - 3 seq. log
1
2
3
4
5
6
7
[ root@ubuntu2204 ~ ] # head - n + 3 seq. log
1
2
3
7.2.3.2 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 ~ ] # cat / data/ f1. txt
1
2
3
4
5
6
7
8
9
10
[ root@ubuntu2204 ~ ] # tail - n 3 / data/ f1. txt
8
9
10
[ root@ubuntu2204 ~ ] # tail - n + 3 / data/ f1. txt
3
4
5
6
7
8
9
10
[ root@ubuntu2204 ~ ] $ echo "abcdefghijl" | tail - c 2
l
[ root@ubuntu2204 ~ ] $ echo "abcdefghijl" | head - c 2
ab[ root@ubuntu2204 ~ ] $
[ root@ubuntu2204 ~ ] # tail - 3 / var / log/ syslog
May 10 08 : 25 : 52 ubuntu2204 systemd[ 1 ] : Starting Cleanup of Temporary
Directories . . .
May 10 08 : 25 : 52 ubuntu2204 systemd[ 1 ] : systemd- tmpfiles- clean. service:
Deactivated successfully.
May 10 08 : 25 : 52 ubuntu2204 systemd[ 1 ] : Finished Cleanup of Temporary
Directories .
[ root@ubuntu2204 ~ ] # tail - f / var / log/ syslog
. . . . . .
. . . . . .
#只查看最新发生的日志
[ root@ubuntu2204 ~ ] # tail - fn0 / var / log/ syslog
[ root@ubuntu2204 ~ ] # tail - 0f / var / log/ syslog
#取IP 行
[ root@ubuntu2204 ~ ] # ifconfig | head - 2 | tail - 1
inet 10.0 .0 .8 netmask 255.255 .255 .0 broadcast 10.0 .0 .255
7.2.3.3 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
[ root@ubuntu2204 ~ ] # seq 20 | head - n 6 | tail - n 1
6
[ root@ubuntu2204 ~ ] # seq 20 | tail - n + 6 | head - n 1
6
7.2.4 按列抽取文本 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 字符而非换行符作为行尾分隔符 #一个中文是三个字节,一个字符
[ root@ubuntu2204 ~ ] # cut - d: - f1, 3 - 4 , 7 / etc/ passwd
[ root@ubuntu2204 ~ ] $ cut - d":" - f7 / etc/ passwd
[ root@ubuntu2204 ~ ] # ifconfig | head - n2 | tail - n1| cut - d" " - f10
10.0 .0 .8
[ root@ubuntu2204 ~ ] # ifconfig | head - n2 | tail - n1| tr - s " " | cut - d " " - f3
10.0 .0 .8
[ root@ubuntu2204 ~ ] # df | tr - s " " | cut - d" " - f5 | tr - dc "[0-9\n]"
1
7
0
0
14
1
[ root@ubuntu2204 ~ ] # df | tr - s ' ' % | cut - d% - f5 | tr - d '[ : alpha: ] '
1
7
0
0
14
1
[ root@ubuntu2204 ~ ] # df | cut - c64- 65
se
1
7
0
0
14
1
[ root@ubuntu2204 ~ ] # cut - d: - f1, 3 , 7 -- output- delimiter= "---" / etc/ passwd
root-- - 0 -- - / bin/ bash
daemon-- - 1 -- - / usr/ sbin/ nologin
bin-- - 2 -- - / usr/ sbin/ nologin
[ root@ubuntu2204 ~ ] # cat / etc/ passwd | cut - d: - f7
/ bin/ bash
/ usr/ sbin/ nologin
/ usr/ sbin/ nologin
[ root@ubuntu2204 ~ ] # echo { 1. .100 } | cut - d ' ' - f1- 100 -- output- delimiter= "+" | bc
5050
[ root@ubuntu ~ ] # echo { 1. .100 } | tr - s " " "+"
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + 99 + 100
[ root@ubuntu ~ ] # echo { 1. .100 } | tr - s " " "+" | bc
5050
[ root@ubuntu ~ ] # echo { 1. .100 } | cut - d" " - f1- 100 -- output- delimiter= "+"
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + 99 + 100
[ root@ubuntu ~ ] # echo { 1. .100 } | cut - d" " - f1- 100 -- output- delimiter= "+" | bc
5050
[ root@ubuntu ~ ] # seq - s + 100
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + 99 + 100
[ root@ubuntu ~ ] # seq - s + 100 | bc
5050
[ root@ubuntu2204 ~ ] $ vim abc
[ root@ubuntu2204 ~ ] $ cat abc
123 456 7 890
[ root@ubuntu2204 ~ ] $ cut - f1 abc
123
[ root@ubuntu2204 ~ ] $ cut - f1, 2 abc
123 456
[ root@ubuntu2204 ~ ] $ cut - f1- 3 abc
123 456 7
[ root@ubuntu2204 ~ ] $ cut - f1- 4 abc
123 456 7
[ root@ubuntu2204 ~ ] $ cat - A abc
123 ^ I456 ^ I7 ^ I ^ I890 $
#取分区利用率
[ root@ubuntu2204 ~ ] # df| tr - s ' ' | cut - d' ' - f5 | tr - d %
Use
1
7
0
0
14
1
[ root@ubuntu2204 ~ ] # df| tr - s ' ' '%' | cut - d% - f5
Use
1
7
0
0
14
1
#取分区利用率
[ root@ubuntu2204 ~ ] # df| tr - s ' ' | cut - d' ' - f5 | tr - d %
Use
1
7
0
0
14
1
[ root@ubuntu2204 ~ ] # df| tr - s ' ' '%' | cut - d% - f5
Use
1
7
0
0
14
1
[ root@ubuntu2204 ~ ] # df | cut - c 64 - 65 | tail - n + 2
1
7
0
0
14
1
[ root@ubuntu2204 ~ ] # df | tail - n + 2 | tr - s ' ' % | cut - d% - f5
1
7
0
0
14
1
[ root@ubuntu2204 ~ ] # df | tail - n + 2 | tr - s ' ' | cut - d' ' - f5 | tr - d %
1
7
0
0
14
1
7.2.5 合并多个文件 paste
paste [ OPTION ] . . . [ FILE ] . . .
常用选项 含义 -d|–delimiters=LIST 指定分割符,默认用TAB -s|–serial 合成一行显示 -z|–zero-terminated 以 NUL 字符而非换行符作为行尾分隔符
[ root@ubuntu2204 ~ ] # cat alpha. log
a
b
c
d
e
f
g
h
[ root@ubuntu2204 ~ ] # cat seq. log
1
2
3
4
5
[ root@ubuntu2204 ~ ] # cat alpha. log seq. log
a
b
c
d
e
f
g
h
1
2
3
4
5
[ root@ubuntu2204 ~ ] # paste alpha. log seq. log
a 1
b 2
c 3
d 4
e 5
f
g
h
[ root@ubuntu2204 ~ ] # paste - d":" alpha. log seq. log
a: 1
b: 2
c: 3
d: 4
e: 5
f:
g:
h:
[ root@ubuntu2204 ~ ] # paste - s seq. log
1 2 3 4 5
[ root@ubuntu2204 ~ ] # paste - s alpha. log
a b c d e f g h
[ root@ubuntu2204 ~ ] # paste - s alpha. log seq. log
a b c d e f g h
1 2 3 4 5
[ root@ubuntu2204 ~ ] # cat title. txt
ceo
coo
cto
[ root@ubuntu2204 ~ ] # cat emp. txt
mage
zhang
wang
xu
[ root@ubuntu2204 ~ ] # paste title. txt emp. txt
ceo mage
coo zhang
cto wang
xu
[ root@ubuntu2204 ~ ] # paste - s title. txt emp. txt
ceo coo cto
mage zhang wang xu
[ root@ubuntu2204 ~ ] # paste - s - d: f1. log f2. log
1 : 2 : 3 : 4 : 5 : 6 : 7 : 8 : 9 : 10
a: b: c: d: e: f: g: h: i: j
[ root@ubuntu2204 ~ ] # seq 10 | paste - s - d+ | bc
55
[ root@ubuntu2204 ~ ] # cat user. txt
tom
jerry
[ root@ubuntu2204 ~ ] # cat pass. txt
123456
654321
[ root@ubuntu2204 ~ ] ## paste - d: user. txt pass. txt
tom: 123456
jerry: 654321
[ root@ubuntu2204 ~ ] # paste - d: user. txt pass. txt | chpasswd
7.2.6 分析文本的工具
文本数据统计:wc 整理文本:sort 比较文件:diff和patch
7.2.6.1 收集文本统计数据 wc
wc 命令可用于统计文件的行总数、单词总数、字节总数和字符总数,可以对文件或STDIN中的数据统计 格式:
wc [ OPTION ] . . . [ FILE ] . . .
常用选项 含义 -l|–lines 只统计数行数 -w|–words 只统计数单词总数 -c|–bytes 只统计数字节总数 -m|–chars 只统计数字符总数 -L|–max-line-length 显示文件中最长行的长度
wc story. txt
39 237 1901 story. txt
行数 单词数 字节数
[ root@ubuntu2204 ~ ] # wc title. txt
3 6 30 title. txt
#仅显示行
[ root@ubuntu2204 ~ ] # wc - l title. txt
3 title. txt
#管道重定向
[ root@ubuntu2204 ~ ] # cat title. txt | wc - l
3
#不显示第一行
[ root@ubuntu2204 ~ ] $ df | tail - n $( echo `df | wc - l`- 1 | bc)
tmpfs 197448 1304 196144 1 % / run
/ dev/ mapper/ ubuntu-- vg- ubuntu-- lv 101590008 8282576 88100804 9 % /
tmpfs 987236 0 987236 0 % / dev/ shm
tmpfs 5120 0 5120 0 % / run/ lock
/ dev/ sda2 1992552 256804 1614508 14 % / boot
tmpfs 197444 4 197440 1 % / run/ user/ 0
7.2.6.2 文本排序 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 字符而非换行符作为行尾分隔符
[ root@ubuntu2204 ~ ] # cut - d: - f1, 3 / etc/ passwd| sort - t: - k2 - nr | head - n3
nobody: 65534
jerry: 1003
tom: 1002
#统计日志访问量
[ root@ubuntu2204 ~ ] # cut - d" " - f1 / var / log/ nginx/ access_log | sort - u| wc - l
201
[ root@ubuntu2204 ~ ] # df
Filesystem 1 K- blocks Used Available Use % Mounted on
tmpfs 198824 1308 197516 1 % / run
/ dev/ mapper/ ubuntu-- vg- ubuntu-- lv 101590008 6218392 90164988 7 % /
tmpfs 994116 0 994116 0 % / dev/ shm
tmpfs 5120 0 5120 0 % / run/ lock
/ dev/ sda2 1992552 255260 1616052 14 % / boot
tmpfs 198820 4 198816 1 % / run/ user/ 0
#查看分区利用率最高值
[ root@ubuntu2204 ~ ] # df| tr - s ' ' '%' | cut - d% - f5| sort - nr| head - 1
14
[ root@ubuntu2204 ~ ] # df | tr - s " " % | cut - d% - f5| tr - d '[ : alpha: ] ' | sort
0
0
1
1
14
7
[ root@ubuntu2204 ~ ] # df | tr - s " " % | cut - d% - f5| tr - d '[ : alpha: ] ' | sort - nr
14
7
1
1
0
0
[ root@ubuntu2204 ~ ] # df | tr - s " " % | cut - d% - f5| tr - d '[ : alpha: ] ' | sort - n | tail - n1
14
[ root@ubuntu2204 ~ ] # df | tr - s " " % | cut - d% - f5| tr - d '[ : alpha: ] ' | sort - nr
14
7
1
1
0
0
[ root@ubuntu2204 ~ ] # df | tr - s " " % | cut - d% - f5| tr - d '[ : alpha: ] ' | sort - nr | head - n1
14
面试题:有两个文件,a.txt与b.txt ,合并两个文件,并输出时确保每个数字也唯一
[ root@ubuntu2204 ~ ] # cat a. txt
1111
222
33
4444
5
666
77
8
9999
100000
[ root@ubuntu2204 ~ ] # cat b. txt
8
1111
33
222
100000
77
159
666
137
189
[ root@ubuntu2204 ~ ] # cat a. txt b. txt | sort - n | uniq
5
8
33
77
137
159
189
222
666
1111
4444
9999
100000
7.2.6.3 去重 uniq
uniq 命令从输入中删除前后相接的重复的行,常和 sort 配合使用 格式:
uniq [ OPTION ] . . . [ INPUT [ OUTPUT ] ]
常用选项 含义 -c|–count 显示每行出现次数 -d|–repeated 仅显示有重复行 -D 显示所有重复行具体内容 -u|–unique 仅显示不重复的行 -z|–zero-terminated 以 NUL 字符而非换行符作为行尾分隔符
[ root@ubuntu2204 ~ ] # sort - n a. txt b. txt | uniq - c
1 5
2 8
2 33
2 77
1 137
1 159
1 189
2 222
2 666
2 1111
1 4444
1 9999
2 100000
[ root@ubuntu2204 ~ ] # lastb | head - n $( echo `lastb | wc - l`- 2 | bc) | tr - s ' ' | cut - d " " - f3 | sort | uniq - c | sort - nr | head - 3
5 183.136 .225 .32
2 47.101 .154 .149
1 64.62 .197 .96
#取相同行
[ root@ubuntu2204 ~ ] # cat a. txt b. txt | sort | uniq - d
100000
1111
222
33
666
77
8
#取文件的不同行
[ root@ubuntu2204 ~ ] # cat a. txt b. txt | sort | uniq - u
137
159
189
4444
5
9999
7.2.6.4 比较文件
7.2.6.4.1 diff
diff [ OPTION ] . . . FILES
常用选项 含义 -u 选项来输出“统一的(unified)”diff格式文件,最适用于补丁文件
[ root@ubuntu2204 ~ ] # cat f1. txt
111
xxx
magedu
[ root@ubuntu2204 ~ ] # cat f2. txt
3
xxx
magedu
222
5
[ root@ubuntu ~ ] # diff f1. txt f2. txt
1 c1
< 111
-- -
> 3
3 a4, 5
> 222
> 5
[ root@ubuntu2204 ~ ] # diff - u f1. txt f2. txt
-- - f1. txt 2023 - 05 - 10 09 : 19 : 07.387258181 + 0800
++ + f2. txt 2023 - 05 - 10 09 : 23 : 15.176468494 + 0800
@@ - 1 , 3 + 1 , 5 @@ #比较结果,- f1 3 行, + f2 5 行
- 111
+ 3
xxx
magedu
+ 222
+ 5
#将对比结果保存至文件
[ root@ubuntu2204 ~ ] # diff - u f1. txt f2. txt > f. patch
[ root@ubuntu2204 ~ ] # rm - f f2. txt
#用来还原
[ root@ubuntu2204 ~ ] # patch - b f1. txt f. patch
patching file f1. txt
#原还出来的是 f2
[ root@ubuntu2204 ~ ] # cat f1. txt
3
xxx
magedu
222
5
[ root@ubuntu2204 ~ ] # cat f1. txt. orig
111
xxx
magedu
7.2.6.4.2 patch【谨慎使用】
patch 复制在其它文件中进行的改变(要谨慎使用) 格式:
patch [ OPTION ] . . . [ ORIGFILE [ PATCHFILE ] ]
[ root@ubuntu2204 ~ ] # patch - b f1. txt f. patch
patching file f1. txt
#用f1. txt和 f. patch 生成一个名为f1. txt的文件,但内容是原来f2. txt文件中的内容,
#- b 选项则备份了现有的 f1. txt
7.2.6.4.3 vimdiff
[ root@ubuntu2204 ~ ] # which vimdiff
/ usr/ bin/ vimdiff
[ root@centos8 ~ ] #ll / usr/ bin/ vimdiff
lrwxrwxrwx. 1 root root 3 Nov 12 2019 / usr/ bin/ vimdiff -> vim
[ root@centos8 ~ ] # vimdiff f1. txt f2. txt
[ root@ubuntu2204 ~ ] # ll / usr/ bin/ vimdiff
lrwxrwxrwx 1 root root 25 Apr 21 2022 / usr/ bin/ vimdiff ->
/ etc/ alternatives/ vimdiff*
[ root@ubuntu2204 ~ ] # ll / etc/ alternatives/ vimdiff
lrwxrwxrwx 1 root root 18 Apr 21 2022 / etc/ alternatives/ vimdiff ->
/ usr/ bin/ vim. basic*
7.2.6.4.4 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 6 a 00 00 00 00 | . . . . . j. . . . |
0000001 e
[ root@ubuntu2204 ~ ] # hexdump - s 20 - Cn 10 / bin/ dir
00000014 01 00 00 00 90 6 a 00 00 00 00 | . . . . . j. . . . |
0000001 e
endl