SRE运维工程师笔记-文本处理工具

SRE运维工程师笔记-文本处理工具

内容概述

  • 文本编辑工具VIM
  • 各种文本工具

1. 文本编辑工具之神VIM

1.1 vi和vim简介

在这里插入图片描述
在Linux中我们经常编辑修改文本文件,即由ASCII, Unicode 或其它编码的纯文字的文件。之前介绍过nano,实际工作中我们会使用更为专业,功能强大的工具

文本编辑种类:

  • 全屏编辑器:nano(字符工具), gedit(图形化工具),vi,vim
  • 行编辑器:sed

vi
Visual editor,文本编辑器,是 Linux 必备工具之一,功能强大,学习曲线较陡峭,学习难度大

vim
VIsual editor iMproved ,和 vi 使用方法一致,但功能更为强大,不是必备软件

官网:www.vim.org

其他相关编辑器:gvim 一个Vim编辑器的图形版本

vim 小抄
在这里插入图片描述
参考链接

https://www.w3cschool.cn/vim/

1.2 使用 vim 初步

1.2.1 vim 命令格式

vim [OPTION]... FILE...

常用选项

+# 打开文件后,让光标处于第#行的行首,+默认行尾
+/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! 保存和不保存退出

说明:

  • 如果该文件存在,文件被打开并显示内容
  • 如果该文件不存在,当编辑后第一次存盘时创建它

1.2.2 三种主要模式和转换

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

  • 命令或普通(Normal)模式:默认模式,可以实现移动光标,剪切/粘贴文本
  • 插入(Insert)或编辑模式:用于修改文本
  • 扩展命令(extended command )或命令(末)行模式:保存,退出等

模式转换
在这里插入图片描述

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

范例: 插入颜色字符

1 切换至插入模式
2 按ctrl+v+[ 三个键,显示^[
3 后续输入颜色信息,如:^[[32mhello^[[0m
4 切换至扩展命令模式,保存退出
5 cat 文件可以看到下面显示
[root@CentOS-8 ~]#echo -e '\E[1;31mred\E[0m'
red
[root@CentOS-8 ~]#vim color.txt 
^[[1;32mgreen^[[0m
[root@CentOS-8 ~]#cat color.txt 
green

在这里插入图片描述

1.3 扩展命令模式

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

1.3.1 扩展命令模式基本命令

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

1.3.2 地址定界

格式:

:start_pos,end_pos CMD

1.3.2.1 地址定界格式

#      #具体第#行,例如2表示第2行
#,#    #从左侧#表示起始行,到右侧#表示结尾行
#,+#   #从左侧#表示的起始行,加上右侧#表示的行数,范例:2,+3 表示2到5行
.      #当前行
$      #最后一行
.,$-1  #当前行到倒数第二行
%      #全文, 相当于1,$

/pattern/        #从当前行向下查找,直到匹配pattern的第一行,即:正则表达式
/pat1/,/pat2/    #从第一次被pat1模式匹配到的行开始,一直到第一次被pat2匹配到的行结束
#,/pat/          #从指定行开始,一直找到第一个匹配patttern的行结束
/pat/,$          #向下找到第一个匹配patttern的行到整个文件的结尾的所有行

1.3.2.2 地址定界后跟一个编辑命令

d         #删除
y         #复制
w file    #将范围内的行另存至指定文件中
r file    #在指定位置插入指定文件中的所有内容

1.3.3 查找并替换

格式

s/要查找的内容/替换为的内容/修饰符

说明:

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

修饰符:

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

查找替换中的分隔符/可替换为其它字符,如:#,@
范例:

s@/etc@/var@g
s#/boot#/#i

1.3.4 定制vim的工作特性

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

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

1.3.4.1 行号

显示:set number,简写 set nu
​取消显示:set nonumber, 简写 set nonu

1.3.4.2 忽略字符的大小写

启用:set ignorecase,简写 set ic
不忽略:set noic

1.3.4.3 自动缩进

启用:set autoindent,简写 set ai
禁用:set noai

1.3.4.4 复制保留格式

启用:set paste
禁用:set nopaste

1.3.4.5 显示Tab和换行符 ^I 和$显示

启用:set list
禁用:set nolist

1.3.4.6 高亮搜索

启用:set hlsearch
禁用:set nohlsearch  简写:set nohl

1.3.4.7 语法高亮

启用:syntax on
禁用:syntax off

1.3.4.8 文件格式

启用windows格式:set fileformat=dos
启用unix格式:set fileformat=unix
简写 set ff=dos|unix

1.3.4.9 Tab 用空格代替

启用:set expandtab 默认为8个空格代替Tab
禁用:set noexpandtab
简写:set et

1.3.4.10 Tab用指定空格的个数代替

启用:set tabstop=# 指定#个空格代替Tab
简写:set ts=4

1.3.4.11 设置缩进宽度

#向右缩进 命令模式>>
#向左缩进 命令模式<<
#设置缩进为4个字符
set shiftwidth=4

1.3.4.12 设置文本宽度

set textwidth=65 (vim only)  #从左向右计数
set wrapmargin=15            #从右到左计数

1.3.4.13 设置光标所在行的标识线

启用:set cursorline,简写 set cul
禁用:set nocursorline

1.3.4.14 加密

启用: set key=password
禁用: set key=

1.3.4.15 了解更多

set 帮助

:help option-list
:set or :set all

1.4 命令模式

命令模式,又称为Normal模式,功能强大,只是此模式输入指令并在屏幕上显示,所以需要记忆大量的快捷按键才能更好的使用

1.4.1 退出VIM

ZZ   保存退出
ZQ  不保存退出

1.4.2 光标跳转

字符间跳转:

h: 左 
L: 右 
j: 下 
k: 上
#COMMAND:跳转由#指定的个数的字符

单词间跳转:

w:下一个单词的词首
e:当前或下一单词的词尾
b:当前或前一个单词的词首
\#COMMAND:由#指定一次跳转的单词数

当前页跳转:

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

行首行尾跳转:

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

行间移动:

#G 或者扩展命令模式下 
:# 跳转至由第#行
G 最后一行
1G, gg 第一行

句间移动:

) 下一句 
( 上一句

段落间移动:

} 下一段 
{
    
     上一段

命令模式翻屏操作

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

1.4.3 字符编辑

x     剪切光标处的字符
#x    删除光标处起始的#个字符
xp    交换光标所在处的字符及其后面字符的位置
~     转换大小写
J     删除当前行后的换行符

1.4.4 替换命令(replace)

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

1.4.5 删除命令(delete)

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

1.4.6 复制命令(yank)

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

1.4.7 粘贴命令(paste)

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

1.4.8 改变命令(change)

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

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

命令模式操作文本总结
在这里插入图片描述

1.4.9 查找

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

1.4.10 撤消更改

u              撤销最近的更改,相当于windows中ctrl+z
#u             撤销之前多次更改
U              撤消光标落在这行后所有此行的更改
Ctrl - r       重做最后的“撤消”更改,相当于windows中crtl+y
.              重复前一个操作
#.             重复前一个操作#次

1.4.11 高级用法


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

范例:

0y$ 命令
0 → 先到行头
y → 从这里开始拷贝
$ → 拷贝到本行最后一个字符

范例:粘贴“wang”100次

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

1.5 可视化模式

在末行有”-- 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 键

1.6 多文件模式

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

1.7 多窗口模式

1.7.1 多文件分割

vim -o|-O FILE1 FILE2 ...
-o: 水平或上下分割
-O: 垂直或左右分割(vim only)
在窗口间切换:Ctrl+w, Arrow

1.7.2 单文件窗口分割

Ctrl+w,s:split, 水平分割,上下分屏
Ctrl+w,v:vertical, 垂直分割,左右分屏
ctrl+w,q:取消相邻窗口
ctrl+w,o:取消全部窗口
:wqall 退出

1.8 vim的寄存器

有26个命名寄存器和1个无命名寄存器,常存放不同的剪贴版内容,可以在同一个主机的不同会话(终端窗口)间共享
寄存器名称a,b,…,z,格式:寄存器放在数字和命令之间

范例:

 3"tyy 表示复制3行到t寄存器中 ,末行显示 3 lines yanked into "t
"tp 表示将t寄存器内容粘贴

未指定,将使用无命名寄存器
有10个数字寄存器,用0,1,…,9表示,0存放最近复制内容,1存放最近删除内容。当新的文本变更和删除时,1转存到2,2转存到3,以此类推。数字寄存器不能在不同会话间共享

1.9 标记和宏(macro)

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

1.10 编辑二进制文件

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

练习

  1. 在vim中设置tab缩进为4个字符
[root@CentOS-8 ~]#echo "set tabstop=4" >> ~/.vimrc
  1. 复制/etc/rc.d/init.d/functions文件至/tmp目录,替换/tmp/functions文件中的/etc/sysconfig/init为/var/log
[root@CentOS-8 ~]#cp -a /etc/rc.d/init.d/functions /tmp/
[root@CentOS-8 ~]#cd /tmp/functions
:%s%/etc/sysconfig/%/var/log/
  1. 删除/tmp/functions文件中所有以#开头,且#后面至少有一个空白字符的行的行首的#号
[root@CentOS-8 ~]#vim /tmp/functions
:%s/^# / /

1.11 帮助

:help
:help topic
Use :q to exit help
vimtutor

1.12 vim 总结图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. 文本常见处理工具

2.1 文件内容查看命令

2.1.1 查看文本文件内容

2.1.1.1 cat

cat 可以查看文本内容
格式:

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

常见选项

-E:显示行结束符$
-A:显示所有控制符
-n:对显示出的每一行进行编号
-b:非空行编号
-s:压缩连续的空行成一行

范例:

[root@centos8 ~]#cat -A /data/fa.txt
a b$
c $
d^Ib^Ic$
[root@centos8 ~]#cat /data/fa.txt
a b
c
d b c
[root@centos8 ~]#cat /data/fb.txt
a 
b 
c
[root@centos8 ~]#hexdump -C /data/fb.txt
00000000 61 0d 0a 62 0d 0a 63 0d 0a |a..b..c..
00000009
[root@centos8 ~]#cat -A /data/fb.txt
a^M$
b^M$
c^M$
[root@centos8 ~]#file /data/fb.txt
/data/fb.txt: ASCII text, with CRLF line terminators

2.1.1.2 nl

显示行号,相当于cat -b

[root@centos8 ~]#cat /data/f1.txt
a 
b 
c 
d 
e 
f 
g 
h

[root@centos8 ~]#nl /data/f1.txt
1 a
2 b
3 c
4 d
5 e
6 f
7 g
8 h

2.1.1.3 tac

逆向显示文本内容

[root@centos8 ~]#cat /data/fa.txt
1 
2 
3 
4 
5
[root@centos8 ~]#tac /data/fa.txt
5 
4 
3 
2 
1

[root@centos8 ~]#tac
a
bb
ccc 按ctrl+d
ccc
bb
a

[root@centos8 ~]#seq 10 |tac
10
9 
8 
7
6
5
4
3
2
1

2.1.1.4 rev

将同一行的内容逆向显示

[root@centos8 ~]#cat /data/fa.txt
1 2 3 4 5
a b c
[root@centos8 ~]#tac /data/fa.txt
a b c
1 2 3 4 5
[root@centos8 ~]#rev /data/fa.txt
5 4 3 2 1
c b a

[root@centos8 ~]#rev
abcdef
fedcba

[root@centos8 ~]#echo {1..10} |rev
01 9 8 7 6 5 4 3 2 1

2.1.2 查看非文本文件内容

2.1.2.1 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.|
0000001b

2.1.2.2 od

od 即 dump files in octal and other formats

范例:

[root@centos8 ~]#echo {a..z} | tr -d ' '|od -t x
0000000 64636261 68676665 6c6b6a69 706f6e6d
0000020 74737271 78777675 000a7a79
0000033
[root@centos8 ~]#echo {a..z} | tr -d ' '|od -t x1
0000000 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70
0000020 71 72 73 74 75 76 77 78 79 7a 0a
0000033
[root@centos8 ~]#echo {a..z} | tr -d ' '|od -t x1z
0000000 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 >abcdefghijklmnop<
0000020 71 72 73 74 75 76 77 78 79 7a 0a >qrstuvwxyz.<
0000033

2.1.2.3 xxd

echo {
    
    a..z} | tr -d ' '|xxd
0000000: 6162 6364 6566 6768 696a 6b6c 6d6e 6f70 abcdefghijklmnop
0000010: 7172 7374 7576 7778 797a 0a qrstuvwxyz.

2.2 分页查看文件内容

2.2.1 more

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

more [OPTIONS...] FILE...

选项:

-d: 显示翻页及退出提示

2.2.2 less

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

/文本 搜索 文本
n/N 跳到下一个 或 上一个匹配

范例:

[root@centos8 ~]#cat /etc/init.d/functions |less
# -*-Shell-script-*-
#
# functions This file contains functions to be used by most or all
# shell scripts in the /etc/init.d directory.
#
TEXTDOMAIN=initscripts
# Make sure umask is sane
umask 022

# Set up a default search path.
PATH="/sbin:/usr/sbin:/bin:/usr/bin"
export PATH
...省略...

2.3 显示文本前或后行内容

2.3.1 head

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

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

选项:

-c # 指定获取前#字节
-n # 指定获取前#行
-# 同上

范例:

[root@centos8 ~]#head -n 3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@centos8 ~]#head -3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@centos8 ~]#echo a我b | head -c4
a我[root@centos8 ~]#

[root@centos8 ~]#cat /dev/urandom | tr -dc '[:alnum:]'| head -c10
G755MlZatW[root@centos8 ~]#cat /dev/urandom | tr -dc '[:alnum:]'| head -c10
ASsax6DeBz[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@centos8 ~]#cat seq.log
1
2
3
4
5
6
7
8
9
10
[root@centos8 ~]#head -n 3 seq.log
1
2
3
[root@centos8 ~]#head -n -3 seq.log
1
2
3
4
5
6
7
[root@centos8 ~]#head -n +3 seq.log
1
2
3

2.3.2 tail

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

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

常用选项:

-c # 指定获取后#字节
-n # 指定获取后#行
-# 同上
-f 跟踪显示文件fd新追加的内容,常用日志监控,相当于 --follow=descriptor,当文件删除再新建同名文件,将无法继续跟踪文件
-F 跟踪文件名,相当于--follow=name --retry,当文件删除再新建同名文件,将可以继续跟踪文件

tailf 类似 tail –f,当文件不增长时并不访问文件

范例:

[root@centos8 ~]#cat /data/f1.txt
1 
2 
3 
4 
5 
6 
7 
8 
9
10
[root@centos8 ~]#tail -n 3 /data/f1.txt
8 
9
10
[root@centos8 ~]#tail -n +3 /data/f1.txt
3 
4 
5 
6 
7 
8 
9
10

范例:

[root@centos8 ~]#tail -3 /var/log/messages
Dec 20 09:49:01 centos8 dbus-daemon[952]: [system] Successfully activated
service 'net.reactivated.Fprint'
Dec 20 09:49:01 centos8 systemd[1]: Started Fingerprint Authentication Daemon.
Dec 20 09:49:13 centos8 su[6887]: (to mage) root on pts/0
[root@centos8 ~]#tail -f /var/log/messages
Dec 20 08:36:40 centos8 systemd[1321]: Startup finished in 52ms.
Dec 20 08:36:40 centos8 systemd[1]: Started User Manager for UID 0.
Dec 20 08:47:01 centos8 systemd[1]: Starting dnf makecache...
Dec 20 08:47:02 centos8 dnf[1465]: AppStream
213 kB/s | 4.3 kB 00:00
Dec 20 08:47:02 centos8 dnf[1465]: BaseOS
163 kB/s | 3.9 kB 00:00
Dec 20 08:47:04 centos8 dnf[1465]: EPEL
2.6 kB/s | 5.3 kB 00:02
Dec 20 08:47:09 centos8 dnf[1465]: EPEL
884 kB/s | 4.3 MB 00:05
Dec 20 08:47:12 centos8 dnf[1465]: extras
727 B/s | 1.5 kB 00:02
Dec 20 08:47:12 centos8 dnf[1465]: Metadata cache created.
Dec 20 08:47:12 centos8 systemd[1]: Started dnf makecache.

#只查看最新发生的日志
[root@centos8 ~]#tail -fn0 /var/log/messages
[root@centos8 ~]#tail -0f /var/log/messages
[root@centos8 data]#ifconfig | head -2 | tail -1
│
inet 10.0.0.8 netmask 255.255.255.0 broadcast 10.0.0.255

2.3.3 head和tail总结

在这里插入图片描述
范例: 显示第6行

[root@centos8 ~]#seq 20| head -n 6|tail -n1
6
[root@centos8 ~]#seq 20| tail -n +6 |head -n1
6

2.4 按列抽取文本cut

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

cut [OPTION]... [FILE]...

常用选项

-d DELIMITER: 指明分隔符,默认tab
-f FILEDS:
    \#: 第#个字段,例如:3
    \#,#[,#]:离散的多个字段,例如:1,3,6
    \#-#:连续的多个字段, 例如:1-6
    混合使用:1-3,7
-c  按字符切割
--output-delimiter=STRING指定输出分隔符

范例:

[root@centos8 ~]#cut -d: -f1,3-4,7 /etc/passwd
[root@centos8 ~]#ifconfig |head -n2 |tail -n1|cut -d" " -f10
10.0.0.8
[root@centos8 ~]#ifconfig |head -n2 |tail -n1|tr -s " " |cut -d " " -f3
10.0.0.8
[root@CentOS-8 ~]#df |tail -n +2|tr -s " "|cut -d " " -f5|tr -d %
0
0
2
0
51
22
2
1
0
[root@CentOS-8 ~]#df |tail -n +2|tr -s " " %|cut -d% -f5
0
0
2
0
51
22
2
1
0
[root@centos8 ~]#df | tr -s ' '|cut -d' ' -f5 |tr -dc "[0-9\n]"
0 
0 
1 
0 
5 
1
15
1
[root@centos8 ~]#df | tr -s ' ' % |cut -d% -f5 |tr -d '[:alpha:]'

0
0
1
0
5
1
15
1

[root@centos8 ~]#df | cut -c44-46 |tr -d '[:alpha:]'

0
0
1
0
5
1
15
1

[root@centos8 ~]#cut -d: -f1,3,7 --output-delimiter="---" /etc/passwd
root---0---/bin/bash
bin---1---/sbin/nologin
daemon---2---/sbin/nologin

cat /etc/passwd | cut -d: -f7
cut -c2-5 /usr/share/dict/words

[root@centos8 ~]#df|tr -s ' ' |cut -d' ' -f5 |tr -d %
[root@centos8 ~]#df|tr -s ' ' '%'|cut -d% -f5
Use
0
0
2
0
3
1
15
0
100

2.5 合并多个文件paste

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

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

常用选项:

-d #分隔符:指定分隔符,默认用TAB
-s #所有行合成一行显示

范例:

[root@centos8 ~]#cat alpha.log
a 
b
c
d
e
f
g
h
[root@centos8 ~]#cat seq.log
1
2
3
4
5
[root@centos8 ~]#cat alpha.log seq.log
a
b
c
d
e
f 
g
h
1
2
3
4
5
[root@centos8 ~]#paste alpha.log seq.log
a 1
b 2
c 3
d 4
e 5
f
g
h

[root@centos8 ~]#paste -d":" alpha.log seq.log
a:1
b:2
c:3
d:4
e:5
f:
g:
h:

[root@centos8 ~]#paste -s seq.log
1 2 3 4 5
[root@centos8 ~]#paste -s alpha.log
a b c d e f g h
[root@centos8 ~]#paste -s alpha.log seq.log
a b c d e f g h
1 2 3 4 5

[root@centos8 ~]#cat title.txt
ceo
coo
cto
[root@centos8 ~]#cat emp.txt
mage
zhang
wang
xu
[root@centos8 ~]#paste title.txt emp.txt
ceo mage
coo zhang
cto wang
     xu
[root@centos8 ~]#paste -s title.txt emp.txt
ceo coo cto
mage zhang wang xu

[root@centos8 ~]#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@CentOS-8 ~]#seq 10
1
2
3
4
5
6
7
8
9
10
[root@CentOS-8 ~]#seq 10|paste -s
1	2	3	4	5	6	7	8	9	10
[root@CentOS-8 ~]#seq 10|paste -d" " -s
1 2 3 4 5 6 7 8 9 10
[root@CentOS-8 ~]#seq 10|paste -d+ -s
1+2+3+4+5+6+7+8+9+10
[root@CentOS-8 ~]#seq 10|paste -d+ -s|bc
55

范例:批量修改密码

[root@centos8 ~]#cat user.txt 
wang
mage
[root@centos8 ~]#cat pass.txt
123456
magedu
[root@centos8 ~]#paste -d: user.txt pass.txt
wang:123456
mage:magedu
[root@centos8 ~]#paste -d: user.txt pass.txt|chpasswd

2.6 分析文本的工具

文本数据统计:wc
整理文本:sort
比较文件:diff和patch

2.6.1 收集文本统计数据wc

wc 命令可用于统计文件的行总数、单词总数、字节总数和字符总数
可以对文件或STDIN中的数据统计
常用选项

-l    只计数行数
-w  只计数单词总数
-c   只计数字节总数
-m 只计数字符总数
-L   显示文件中最长行的长度

范例:

wc story.txt
39 237 1901 story.txt
行数 单词数 字节数
[root@centos8 ~]#ll title.txt
-rw-r--r-- 1 root root 30 Dec 20 11:05 title.txt
[root@centos8 ~]#ll title1.txt
-rw-r--r-- 1 root root 28 Dec 20 11:06 title1.txt
[root@centos8 ~]#cat title.txt
ceo mage
coo zhang
cto 老王
[root@centos8 ~]#cat title1.txt
ceo mage
coo zhang
cto wang
[root@centos8 ~]#wc title.txt
3 6 30 title.txt
[root@centos8 ~]#wc title1.txt
3 6 28 title1.txt
[root@centos8 ~]#wc -l title.txt
3 title.txt
[root@centos8 ~]#cat title.txt | wc -l
3
[root@centos8 ~]#df | tail -n $(echo `df | wc -l`-1|bc)
devtmpfs 910220 0 910220 0% /dev
tmpfs 924728 0 924728 0% /dev/shm
tmpfs 924728 9224 915504 1% /run
tmpfs 924728 0 924728 0% /sys/fs/cgroup
/dev/sda2 104806400 4836160 99970240 5% /
/dev/sda3 52403200 398580 52004620 1% /data
/dev/sda1 999320 131764 798744 15% /boot
tmpfs 184944 4 184940 1% /run/user/0

范例:单词文件

[root@CentOS-8 ~]#yum install words
Last metadata expiration check: 0:25:45 ago on Mon 08 Nov 2021 02:58:34 PM CST.
Package words-3.0-28.el8.noarch is already installed.
Dependencies resolved.
Nothing to do.
Complete!
[root@CentOS-8 ~]#wc -l /usr/share/dict/linux.words 
479828 /usr/share/dict/linux.words

2.6.2 文本排序sort

把整理过的文本显示在STDOUT,不改变原始文件
格式:

sort [options] file(s)

常用选项

-r 执行反方向(由上至下)整理
-R 随机排序
-n 执行按数字大小整理
-h 人类可读排序,如: 2K 1G 
-f 选项忽略(fold)字符串中的字符大小写
-u 选项(独特,unique),合并重复项,即去重
-t c 选项使用c做为字段界定符
-k # 选项按照使用c字符分隔的 # 列来整理能够使用多次

范例:

[root@centos8 data]#cut -d: -f1,3 /etc/passwd|sort -t: -k2 -nr |head -n3
nobody:65534
xiaoming:1002
mage:1001

#统计日志访问量
[root@centos8 data]#cut -d" " -f1 /var/log/nginx/access_log |sort -u|wc -l
201

范例:统计分区利用率

[root@centos8 ~]#df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 391676 0 391676 0% /dev
tmpfs 408092 0 408092 0% /dev/shm
tmpfs 408092 5816 402276 2% /run
tmpfs 408092 0 408092 0% /sys/fs/cgroup
/dev/sda2 104806400 2259416 102546984 3% /
/dev/sda3 52403200 398608 52004592 1% /data
/dev/sda1 999320 130848 799660 15% /boot
tmpfs 81616 0 81616 0% /run/user/0
/dev/sr0 7377866 7377866 0 100% /misc/cd

#查看分区利用率最高值
[root@centos8 ~]#df| tr -s ' ' '%'|cut -d% -f5|sort -nr|head -1
100

[root@centos8 ~]#df | tr -s " " %|cut -d% -f5|tr -d '[:alpha:]' | sort

0
0
0
1 
1
1
15
5
[root@centos8 ~]#df | tr -s " " %|cut -d% -f5|tr -d '[:alpha:]' | sort -n

0
0
0
1
1
1
5
15
[root@centos8 ~]#df | tr -s " " %|cut -d% -f5|tr -d '[:alpha:]' | sort -n |tail
-n1
15
[root@centos8 ~]#df | tr -s " " %|cut -d% -f5|tr -d '[:alpha:]' | sort -nr
15
5
1
1
1
0
0
0

[root@centos8 ~]#df | tr -s " " %|cut -d% -f5|tr -d '[:alpha:]' | sort -nr|head
-n1
15

[root@CentOS-8 ~]#df |tail -n +2|tr -s ' ' %|cut -d% -f5|sort -nr|head -n1
51

面试题:有两个文件,a.txt与b.txt ,合并两个文件,并输出时确保每个数字也唯一

#a.txt中的每一个数字在本文件唯一
200
100
34556
23
...

#b.txt中的每一个数字在本文件唯一
123
43
200
3321
...

#就是将两个文件合并后重复的行去除,不保留
100
345563
123
43
3321
...

2.6.3 去重uniq

uniq命令从输入中删除前后相接的重复的行
格式:

uniq [OPTION]... [FILE]...

常见选项:

-c: 显示每行重复出现的次数
-d: 仅显示重复过的行
-u: 仅显示不曾重复的行

uniq常和sort 命令一起配合使用:
范例:

sort userlist.txt | uniq -c

范例:统计日志访问量最多的请求

[root@centos8 data]#cut -d" " -f1 access_log |sort |uniq -c|sort -nr |head -3
4870 172.20.116.228
3429 172.20.116.208
2834 172.20.0.222

[root@centos8 data]#lastb -f btmp-34 | tr -s ' ' |cut -d ' ' -f3|sort |uniq -c|sort -nr | head -3
86294 58.218.92.37
43148 58.218.92.26
18036 112.85.42.201

范例:并发连接最多的远程主机IP

[root@centos8 ~]#ss -nt|tail -n+2 |tr -s ' ' : |cut -d: -f6|sort|uniq -c|sort -nr |head -n2
7 10.0.0.1
2 10.0.0.7

范例:取两个文件的相同和不同的行

[root@centos8 data]#cat test1.txt
a 
b
1
c
[root@centos8 data]#cat test2.txt
b
e
f
c
1
2
#取文件的共同行
[root@centos8 data]#cat test1.txt test2.txt | sort |uniq -d
1 
b
c 
#取文件的不同行
[root@centos8 data]#cat test1.txt test2.txt | sort |uniq -u
2
a
e
f

[root@CentOS-8 ~]#cut -d" " -f1 nginx.log|sort|uniq -c|sort -nr|head

[root@CentOS-8 ~]#cat f1.txt 
a
b
c
[root@CentOS-8 ~]#vi f2.txt
[root@CentOS-8 ~]#cat f2`
> ^C
[root@CentOS-8 ~]#cat f2
cat: f2: No such file or directory
[root@CentOS-8 ~]#cat f2.txt 
1
a
2
c
[root@CentOS-8 ~]#cat f1.txt f2.txt 
a
b
c
1
a
2
c
[root@CentOS-8 ~]#cat f1.txt f2.txt |sort|uniq -d
a
c
[root@CentOS-8 ~]#cat f1.txt f2.txt |sort|uniq -u
1
2
b

2.6.4 比较文件

2.6.4.1 diff

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

-u 选项来输出“统一的(unified)”diff格式文件,最适用于补丁文件
[root@centos8 ~]#cat f1.txt
mage
zhang
wang
xu
[root@centos8 ~]#cat f2.txt
magedu
zhang sir
wang
xu
shi
[root@centos8 ~]#diff f1.txt f2.txt
1,2c1,2
< mage
< zhang
---
> magedu
> zhang sir
4a5
> shi
[root@centos8 ~]#diff -u f1.txt f2.txt
--- f1.txt 2019-12-13 21:31:30.892775671 +0800
+++ f2.txt 2019-12-13 22:00:14.373677728 +0800
@@ -1,4 +1,5 @@
-mage
-zhang
+magedu
+zhang sir
wang
xu
+shi
[root@centos8 ~]#diff -u f1.txt f2.txt > f.patch
[root@centos8 ~]#rm -f f2.txt
[root@centos8 ~]#patch -b f1.txt f.patch
patching file f1.txt
[root@centos8 ~]#cat f1.txt
magedu
zhang sir
wang
xu
shi
[root@centos8 ~]#cat f1.txt.orig
mage
zhang
wang
xu

注明第5行有区别(改变)
复制对文件改变patch
diff 命令的输出被保存在一种叫做“补丁”的文件中
使用 -u 选项来输出“统一的(unified)”diff格式文件,最适用于补丁文件

2.6.4.2 patch

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

-b 选项来自动备份改变了的文件

范例:

diff -u foo.conf foo2.conf > foo.patch
patch -b foo.conf foo.patch

2.6.4.3 vimdiff

相当于 vim -d

[root@centos8 ~]#cat f1.txt
mage
zhangsir
wang
lilaoshi
zhao
[root@centos8 ~]#cat f2.txt
mage
zhang
wang
li
zhao
[root@centos8 ~]#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

在这里插入图片描述

2.6.4.4 cmp

范例:查看二进制文件的不同

[root@centos8 data]#ll /usr/bin/dir /usr/bin/ls
-rwxr-xr-x. 1 root root 166448 May 12 2019 /usr/bin/dir
-rwxr-xr-x. 1 root root 166448 May 12 2019 /usr/bin/ls
[root@centos8 data]#ll /usr/bin/dir /usr/bin/ls -i
201839444 -rwxr-xr-x. 1 root root 166448 May 12 2019 /usr/bin/dir
201839465 -rwxr-xr-x. 1 root root 166448 May 12 2019 /usr/bin/ls
[root@centos8 data]#diff /usr/bin/dir /usr/bin/ls
Binary files /usr/bin/dir and /usr/bin/ls differ

[root@centos8 ~]#cmp /bin/dir /bin/ls
/bin/dir /bin/ls differ: byte 737, line 2
[root@centos8 ~]#hexdump -s 730 -Cn 7 /bin/dir
000002da 00 00 47 4e 55 00 b0 |..GNU..|
000002e1
[root@centos8 ~]#hexdump -s 730 -Cn 7 /bin/ls
000002da 00 00 47 4e 55 00 93 |..GNU..|
000002e1

练习

  1. 找出ifconfig “网卡名” 命令结果中本机的IPv4地址
[root@CentOS-8 ~]#ifconfig ens160 |grep -o "inet [0-9.]\{7,\}"|cut -d" " -f2
10.0.0.100
  1. 查出分区空间使用率的最大百分比值
[root@CentOS-8 ~]#df |grep "/dev/sd"|grep -o "[0-9]\+%"|cut -d% -f1|sort -rn|head -1
51
  1. 查出用户UID最大值的用户名、UID及shell类型
[root@CentOS-8 ~]#cat /etc/passwd |sort -rnt: -k3 |head -n1
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
  1. 查出/tmp的权限,以数字方式显示
[root@CentOS-8 ~]#stat /tmp | grep -o 'Access: (.*)' | grep -oE '[0-9]{4}'
1777
  1. 统计当前连接本机的每个远程主机IP的连接数,并按从大到小排序
[root@CentOS-8 ~]#last | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' | uniq -c | sort -rn
     51 10.0.0.1

猜你喜欢

转载自blog.csdn.net/dws123654/article/details/121200820