1 文件内容查看命令

1.1 查看文本文件内容

1.1.1 cat

cat命令查看文本内容

格式

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

参数

cat -E      显示文本的每行结束符$
cat -A      显示文本所有特殊字符(tab键^I,windowns换行^M,每行结束符$)
cat -n      对显示出的每一行进行编号
cat -b      非空行编号
cat -s      压缩连续的空行成一行
1.1.2 nl

nl命令相当于cat -b,对文本非空行编号显示

[root@centos7 /data ]# cat t1.txt
a

b

c

d
[root@centos7 /data ]# cat -b t1.txt
     1  a

     2  b

     3  c

     4  d
[root@centos7 /data ]# nl t1.txt
     1  a

     2  b

     3  c

     4  d
1.1.3 tac

tac命令和cat命令输出内容相反,cat按照文本从开头到结尾输出信息,tac按照文本从结尾到开头输出信息

[root@centos7 /data ]# cat t1.txt
a
b
c
d
[root@centos7 /data ]# tac  t1.txt
d
c
b
a
1.1.4 rev

rev命令翻译为 reverse 反转,按照文本每行内容进行反转

[root@centos7 /data ]# cat t1.txt
a b c d
[root@centos7 /data ]# rev t1.txt
d c b a

1.2 查看非文本文件内容

1.1 hexdump

hexdump是linux下的一个二进制文件查看工具,它可以将二进制文件转换为ASCII、八进制、十进制、十六进制格式进行查看

-n  length  只格式化输入文件的前length个字节
-C  输出规范的十六进制和ASCII码
-b  单字节八进制显示
-c  单字节字符显示
-d  双字节十进制显示
-o  双字节八进制显示
-x  双字节十六进制显示

范例

显示磁盘设备前512个字节
hexdump -C -n 512 /dev/sda

显示a-z的ASCII码
echo {a..z} | tr -d ' '|hexdump -C
1.2 od

od命令会读取所给予的文件的内容,并将其内容以八进制字码呈现出来。

-a  此参数的效果和同时指定”-ta”参数相同
-A  选择要以何种基数计算字码
-b  此参数的效果和同时指定”-toC”参数相同
-c  此参数的效果和同时指定”-tC”参数相同
-d  此参数的效果和同时指定”-tu2″参数相同
-f  此参数的效果和同时指定”-tfF”参数相同
-h  此参数的效果和同时指定”-tx2″参数相同
-i  此参数的效果和同时指定”-td2″参数相同
-j<字符数目>    略过设置的字符数目
-l  此参数的效果和同时指定”-td4″参数相同
-N<字符数目>    到设置的字符数目为止
-o  此参数的效果和同时指定”-to2″参数相同
-s<字符串字符数>  只显示符合指定的字符数目的字符串
-t<输出格式>    设置输出格式
-v  输出时不省略重复的数据
-w<每列字符数>   设置每列的最大字符数

范例

[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
1.3 xxd

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.1 more命令

more 命令针对于文本内容过多,使用more一点一点的读取

more    -n          按空格每次读取文件n行内容
more    +n          从第n行开始读取内容
more    -c          清除屏幕的内容,显示文件的内容
more    -n  -c      每次读取n行内容前清空屏幕
more    -s          把内容中连续的空行代换为一行空行    

读取内容操作:
空格键    显示文本的下一屏内容
回车键    向下n行,需要定义 more -n,默认为1行
h键      显示帮助屏
b键      显示上一屏内容
q键      退出more命令
=        输出当前的行号
:f       输出文件名和当前的行号  
V        调用vi编辑器
!        调用Shell,并执行命令

2.2 less命令

less 命令 和more 命令功能都是分屏读取内容,less功能比more强大支持一些vim的操作

less /etc/ssh/sshd_config       显示一屏
less -N /etc/ssh/sshd_config    大写N 显示行号

读取内容操作:
b 向后翻一页
d 向后翻半页
h 显示帮助界面
Q 退出less 命令
u 向前滚动半页
y 向前滚动一行
空格键 滚动一页
回车键 滚动一行
/   搜索信息

3 显示文本前或后行内容

3.1 head 命令

# head 命令 —— 显示文件本从头内容
head /etc/passwd            默认显示前10行的内容
head -n 5 /etc/passwd       显示前5行内容信息
head -v                     显示文件名的头信息
head -c                     指定显示前几个字节

范例

生成随机密码口令
cat /dev/urandom | tr -dc '[:alnum:]'|head -c10

生成随机口令作为用户密码
cat /dev/urandom | tr -dc '[:alnum:]'|head -c10 | tee passwd.txt | passwd --stdin test

3.2 tail命令

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

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行到第n行内容

tail -n 3 /etc/passwd

tail -k file

从后往前数,取file 第1行到第n行内容

tail -3 /etc/passwd

tail -n -k file

从后往前数,取file 第1行到第n行内容

tail -n -3 /etc/passwd

tail -n +k file

从后往前数,取file 第1行到倒数第k行内容

tail -n +3 /etc/passwd

4 按列抽取文本cut

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

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

范例

1./etc/passwd文件取出用户名,UID,GID,解释器
[root@centos7 ~ ]# cut -d: -f1,3-4,7 /etc/passwd
root:0:0:/bin/bash
bin:1:1:/sbin/nologin
daemon:2:2:/sbin/nologin

2./etc/passwd文件取出用户名,UID,GID,解释器,指定以"---"作为输出分割符
[root@centos7 ~ ]# cut -d: -f1,3-4,7 /etc/passwd --output-delimiter="---"
root---0---0---/bin/bash
bin---1---1---/sbin/nologin
daemon---2---2---/sbin/nologin

3.取出系统磁盘使用率df
df |tr -s " "|cut -d" " -f5|tr -dc "[0-9\n%]"
df | tr -s ' ' % |cut -d% -f5 |tr -d '[:alpha:]'

5 合并多个文件

paste命令合并多个文件同一行内容合并成为一行

paste -d        指定合并分割符,默认是tab
paste -s        paste默认是纵向合并, -s 横向合并

范例

[root@centos7 /data ]# echo {1..5}|tr " " "\n">t1.txt
[root@centos7 /data ]# echo {a..h}|tr " " "\n">t2.txt
[root@centos7 /data ]# cat t1.txt
1
2
3
4
5
[root@centos7 /data ]# cat t2.txt
a
b
c
d
e
f
g
[root@centos7 /data ]# paste t2.txt t1.txt
a   1
b   2
c   3
d   4
e   5
f
g
h
[root@centos7 /data ]# paste -d"+" t2.txt t1.txt
a+1
b+2
c+3
d+4
e+5
f+
g+
h+
[root@centos7 /data ]# paste -sd"+" t2.txt t1.txt
a+b+c+d+e+f+g+h
1+2+3+4+5

6 分析文本的工具

文本数据统计:wc

整理文本:sort

比较文件:diff和patch

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@centos8 ~]#wc title.txt
3 6 30 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@centos7 /data ]# wc -c t3.txt
7 t3.txt

[root@centos7 /data ]# wc -m t3.txt
3 t3.txt

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    #指定列分割d
-k|--key=KEYDEF             #指定排序列
-u|--unique                 #去重
-z|--zero-terminated        #以 NUL 字符而非换行符作为行尾分隔符

范例

sort排序默认按照第一个字符字母表依次比较, 同样内容情况: 小写字母在上,大写字母在下
[root@centos7 /data ]# cat t4.txt
aa
bb
AB
cc
ab
    
[root@centos7 /data ]# sort t4.txt
aa
ab
AB
bb
cc

合并重复内容
[root@centos7 /data ]# sort -fu t4.txt
aa
AB
bb
cc

#统计/etc/passwd文件,按照用户UID从大到小排序,取出用户名和UID
[root@centos7 /data ]# sort -t":" -k3 -rn /etc/passwd|cut -d: -f1,3| head -3
nfsnobody:65534
mysql:1012
varnish:1011
    
[root@centos8 data]# cut -d: -f1,3 /etc/passwd|sort -t: -k2 -nr |head -n3
nobody:65534
xiaoming:1002
xiaoh: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

[:alnum:]:字母和数字
[:alpha:]:字母
[:digit:]:数字
[:lower:]:小写字母
[:upper:]:大写字母
[:space:]:空白字符
[:print:]:可打印字符
[:punct:]:标点符号
[:graph:]:图形字符
[:cntrl:]:控制(非打印)字符
[:xdigit:]:十六进制字符

[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

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

[root@rocky86 ~]# cat a.txt
1111
222
33
4444
5
666
77
8
9999
100000

[root@rocky86 ~]# cat b.txt
8
1111
33
222
100000
77
159
666
137
189

[root@rocky86 ~]# cat a.txt b.txt | sort -n | uniq
5
8
33
77
137
159
189
222
666
1111
4444
9999
100000

6.3 去重uniq

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

格式:

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

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

范例:

[root@rocky86 ~]# sort -n a.txt b.txt | uniq -c

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

[root@rocky86 ~]# lastb | head -n $(echo `lastb | wc -l`-2 | bc) | tr -s ' ' | cut -d " " -f3 | sort | uniq -c | sort -nr | head -3
17 10.0.0.1

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

[root@centos7 /data ]# cat t5.txt
aa
bb
aa
cc
bb
cc
cc
[root@centos7 /data ]# uniq t5.txt
aa
bb
aa
cc
bb
cc

[root@centos7 /data ]# cat t5.txt
aa
bb
aa
cc
bb
cc
cc
[root@centos7 /data ]# cat t6.txt
aa
bb
aa
dd
[root@centos7 /data ]# cat t5.txt t6.txt | sort|uniq -d
aa
bb
cc
[root@centos7 /data ]# cat t5.txt t6.txt | sort|uniq -u
dd

6.4 比较文件

6.4.1 diff

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

格式:

diff [OPTION]... FILES

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

范例:

[root@centos8 ~]# cat f1.txt
1
2
3

[root@centos8 ~]# cat f2.txt
3
7
2
5

[root@centos8 ~]#diff -u f1.txt f2.txt
--- f1 2022-04-26 16:26:29.648932024 +0800
+++ f2 2022-04-26 16:26:37.274438606 +0800
@@ -1,3 +1,4 @@     #比较结果,- 表示第一个文件, + 表示第二个文件,第一个文件有3行,第二个文件有4行
-1                  #第一个文件此行去掉
-2                  #第一个文件此行去掉
 3
+7                  #第一个文件加上此行内容
+2                  #第一个文件加上此行内容
+5                  #第一个文件加上此行内容

#将对比结果保存至文件
[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

#原还出来的是 f2
[root@centos8 ~]#cat f1.txt
3
7
2
5

[root@centos8 ~]#cat f1.txt.orig
1
2
3
6.4.2 patch

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

格式:

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

#常用选项
-b|--backup  #备份

范例:

[root@centos7 ~]# yum -y install patch
[root@centos8 ~]#patch -b f1.txt f.patch
patching file f1.txt

#用f1.txt和 f.patch 生成一个名为f1.txt的文件,但内容是原来f2.txt文件中的内容,#-b 选项则备份了现有的 f1.txt
6.4.3 vimdiff

相当于 vim -d

[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
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

#跳过前735个字节,观察后面30个字节
[root@centos8 ~]#hexdump -s 735 -Cn 30 /bin/ls
000002df 00 05 6d da 3f 1b 77 91 91 63 a7 de 55 63 a2 b9 |..m.?.w..c..Uc..|
000002ef d9 d2 45 55 4c 00 00 00 00 03 00 00 00 7d |..EUL........}|
000002fd

[root@centos8 ~]#hexdump -s 735 -Cn 30 /bin/dir
000002df 00 f1 21 4e f2 19 7e ef 38 0d 9b 3e d7 54 08 39 |..!N..~.8..>.T.9|
000002ef e4 74 4d 69 25 00 00 00 00 03 00 00 00 7d |.tMi%........}|
000002fd

6.5 文本内容转换 tr

tr的英文全称是“ transform ”,即转换的意思。该命令的作用是一种可将字符进行替换、压缩、删除,他可以将一组字符转换成另一组字符。tr他只能从标准输入中读取数据,因此,tr要么将输入文件重定向到标准输入,要么从管道读入数据。

tr命令格式:tr [参数] [字符1] [字符2]

  • 字符1:是指被替换的字符

  • 字符2:是指字符1中字符要替换为的字符

常见参数

参数

描述

tr -s [字符1] [字符2]

删除所有重复出现的字符序列,只保留一个,如果指定了字符2,则去重替换为字符2

tr -d [字符1]

删除字符串1中出现的所有字符

tr -c [字符1] [字符2]

选定字符串1中字符集的补集,即反选字符串1的补集替换为字符2

tr -t [字符1] [字符2]

不管字符1和字符2中的字符多少,一一对应替换

tr 匹配字符集

匹配模式

描述

[:alnum:]

大小写字母和数字

[:alpha:]

大小写字母,即:a-z 和 A-Z

[:digit:]

数字,即 0-9

[:upper:]

大写字母,即 A-Z

[:lower:]

小写字母,即 a-z

[:space:]

空白字符

[:punct:]

标点符号

[:print:]

可见符号

[:xdigit:]

十六进制

范例:

[root@centos7 ~ ]# tr '[a-z]' '[A-Z]'
adbc        <-- 输入
ADBC        <-- 输出

[root@centos7 ~ ]# tr '[a-z]' '[A-Z]' < /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

tr命令替换字符按照字符1和字符2中对应位置字符进行替换

情况一: 被替换字符 = 替换为字符

[root@centos7 ~ ]# echo 123456 | tr 1234 abcd
abcd56

情况二:(海王)多对一替换,被替换字符 > 替换为字符,则会被替换多余字符替换字符2的最后一个字符。

[root@centos7 ~ ]# echo 123456 | tr 1234 abc
abcc56
说明:1替换为a 2替换为b 3替换为c, 此时替换信息字符已经没有,4没有替换的字符,就和前面字符共用一个字符,4 替换 c

tr -t可以解决多对一替换情况

[root@centos7 ~ ]# echo 123456 | tr -t 1234 abc
abc456

情况三:(单身)被替换字符 < 替换为字符,则一一对应进行替换,字符2多余字符不管。

[root@centos7 ~ ]# echo 123456 | tr 123 abcde
abc456
说明:1替换为a 2替换为b 3替换为c, 此时再有替换的字符没有需要替换的字符了,相当于男人找女朋友,d 和 e 只能单身

情况四:(谁没年轻过)被替换字符中出现重复字符,则为最后匹配的字符为准

[root@centos7 ~ ]# echo 123456 | tr 1213 abcd
cbd456
说明:1替换为a 2替换为b 1替换为c 3替换为d, 最后替换结果为 1替换为c 2替换为b 3替换为d

范例

[root@centos7 ~ ]# free -h|grep 'Mem'|tr -s " "|cut -d" " -f2
974M

磁盘使用情况
df |tr -s " "|cut -d" " -f5|tr -dc "[0-9\n%]"
df | tr -s ' ' % |cut -d% -f5 |tr -d '[:alpha:]'

生成随机密码口令
cat /dev/urandom | tr -dc '[:alnum:]'|head -c10

练习

  1. 找出ifconfig “网卡名” 命令结果中本机的IPv4地址

  2. 查出分区空间使用率的最大百分比值

  3. 查出用户UID最大值的用户名、UID及shell类型

  4. 查出/tmp的权限,以数字方式显示

  5. 统计当前连接本机的每个远程主机IP的连接数,并按从大到小排序