第二周

1. 总结学过的文本处理工具,文件查找工具

1.1文本处理工具

1.1.1cat

cat可以查看文本内容

格式:

cat [选项]... [文件]...

常见选项

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

 范例:

[22:38:58 root@rocky001[ ~]#cat -A 123.txt
M-gM-^]M-!M-dM-=M- M-iM-:M-;M-gM-^WM-9 M-hM-5M-7M-fM-^]M-%M-eM-^WM-($
$
[22:39:23 root@rocky001[ ~]#cat 123.txt
睡你麻痹 起来嗨

[22:39:31 root@rocky001[ ~]#nano 123.txt
[22:41:05 root@rocky001[ ~]#cat 123.txt
睡你麻痹 起来嗨
  1    2     3
[22:41:09 root@rocky001[ ~]#cat -A 123.txt
M-gM-^]M-!M-dM-=M- M-iM-:M-;M-gM-^WM-9 M-hM-5M-7M-fM-^]M-%M-eM-^WM-($
  1    2     3$
[22:41:17 root@rocky001[ ~]#

 #压缩连续的空行成一行  -s

[22:45:17 root@rocky001[ ~]#cat 123.txt
睡你麻痹 起来嗨


  1    2     3
[22:45:42 root@rocky001[ ~]#cat -s 123.txt
睡你麻痹 起来嗨

  1    2     3
[22:45:50 root@rocky001[ ~]#cat -n 123.txt
     1    睡你麻痹 起来嗨
     2    
     3    
     4    
     5    
     6      1    2     3

[22:46:01 root@rocky001[ ~]#cat -bs 123.txt
     1    睡你麻痹 起来嗨

     2      1    2     3
[22:46:34 root@rocky001[ ~]#

cat 的逆向显示文本 tac  字如其面。

范例:

[22:53:17 root@rocky001[ ~]#tac 123.txt
  1    2     3


睡你麻痹 起来嗨
[22:55:28 root@rocky001[ ~]#

 1.1.2 nl

显示行号,相当于上面的cat -b

范例:

[22:46:34 root@rocky001[ ~]#nl 123.txt
     1    睡你麻痹 起来嗨
       
       
       
       
     2      1    2     3
[22:51:25 root@rocky001[ ~]#

#只显示非空格的编号,需要显示空格编号需要执行 cat -n 命令

 1.1.3rev

将同一行的内容逆向显示。#和tac差不多 但是是将一行的内容反过来。

范例:

[22:55:28 root@rocky001[ ~]#rev 123.txt
嗨来起 痹麻你睡


3     2    1  
2  
3  
4  
5  
6  
7  
8  
9  
 
[22:57:49 root@rocky001[ ~]#cat 123.txt
睡你麻痹 起来嗨


  1    2     3
  2
  3
  4
  5
  6
  7
  8
  9
 
[22:57:57 root@rocky001[ ~]#

 1.2查看非文本文件内容

  hexdump命令来自英文词组hexadecimal dump的缩写,其功能是以多种进制格式查看文件内容。hexdump命令是Linux系统中一款好用的文件内容查看工具,可以将文件内容转换成ASCII、二进制、八进制、十进制、十六进制格式进行查看,满足各种需求
  原文链接:hexdump – 以多种进制格式查看文件内容 – Linux命令大全(手册)

hexdump [选项] [文件]...

 选项:

-b 使用八进制显示

-n 仅格式化输入文件的前N个字节

-c 使用单字节字符显示

-o 使用双字节八进制显示

-C 使用十六进制和ASCII码显示

-s 从偏移量开始输出

-d 使用双字节十进制显示

-v 显示所有输入数据

-e 设置字符串格式

-x 使用双字节十六进制显示
 

 范例:

[23:32:36 root@rocky001[ ~]#hexdump -C 123.txt
00000000  e7 9d a1 e4 bd a0 e9 ba  bb e7 97 b9 20 e8 b5 b7  |............ ...|
00000010  e6 9d a5 e5 97 a8 0a 0a  0a 0a 0a 20 20 31 20 20  |...........  1  |
00000020  20 20 32 20 20 20 20 20  33 0a 20 20 32 0a 20 20  |  2     3.  2.  |
00000030  33 0a 20 20 34 0a 20 20  35 0a 20 20 36 0a 20 20  |3.  4.  5.  6.  |
00000040  37 0a 20 20 38 0a 20 20  39 0a 20 20 0a           |7.  8.  9.  .|
0000004d
[23:33:35 root@rocky001[ ~]#

1.2分页查看内容

1.2.1more

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

格式

more [OPTIONS...] FILE...

 选项:

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

范例

[23:58:24 root@rocky001[ ~]#man hexdump  
[23:59:02 root@rocky001[ ~]#man hexdump | more

#more是支持标准输入的,这里我们把hexdump的man帮助内容给more处理,用空格翻页。

他与原来的man文档区别是信息是以页为单位一页一页翻,用回车键来一行一行翻页。

 more的页面

 man的页面

 1.2.2less

  less支持标准输入,可以实现分页查看文件,或者stdin输出,less命令是man的分页器,查看man文档时有用的命令为:

man ls |less  #这里用管道将man ls的文档传给less命令查看#

 tree -d /etc |less   #这里将etc目录下树状图分页显示。

1.3显示文本前面或者后面的行的内容。

1.3.1head

可以显示文本或者标准输入的前面行

格式:

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

  选项:

-c # 指定获取前#字节
-n # 指定获取前#行,#如果为负数,表示从文件头取到倒数第#前
-# 同上

-v #总是显示给输出文件名的部首

-q #不显示文件名部首

范例:

[03:47:40 root@rocky001[ ~]#cat 123.txt
睡你麻痹 起来嗨


  1    2     3
  2
  3
  4
  5
  6
  7
  8
  9
 
[03:47:48 root@rocky001[ ~]#head -n 6 123.txt
睡你麻痹 起来嗨


  1    2     3

[03:47:58 root@rocky001[ ~]#head -n -6 123.txt
睡你麻痹 起来嗨


  1    2     3
  2
  3
  4

#-c的选项

[03:48:29 root@rocky001[ ~]#head -c 3 123.txt
睡[03:49:08 root@rocky001[ ~]#head -c3 123.txt
睡[03:50:01 root@rocky001[ ~]#head -c4 123.txt
睡[03:50:08 root@rocky001[ ~]#head -c6 123.txt
睡你[03:50:11 root@rocky001[ ~]#

#还支持标准输入

睡你[03:50:11 root@rocky001[ ~]#echo abcd |head -c3
abc[03:51:09 root@rocky001[ ~]#

1.3.2tail

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

格式:

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

选项:

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

 范例:

[03:56:09 root@rocky001[ ~]#cat 123.txt
睡你麻痹 起来嗨


  1    2     3
  2
  3
  4
  5
  6
  7
  8
  9
 
[03:56:33 root@rocky001[ ~]#tail -n +6 123.txt
  1    2     3
  2
  3
  4
  5
  6
  7
  8
  9
 
[03:56:38 root@rocky001[ ~]#tail -n -6 123.txt
  5
  6
  7
  8
  9
 
[03:56:42 root@rocky001[ ~]#

#支持标准输入,比如获取ip地址

[03:59:09 root@rocky001[ ~]#ifconfig
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.150  netmask 255.255.255.0  broadcast 10.0.0.255
        inet6 fe80::20c:29ff:fed7:f093  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:d7:f0:93  txqueuelen 1000  (Ethernet)
        RX packets 432603  bytes 593091674 (565.6 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 185567  bytes 10829393 (10.3 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 48  bytes 4024 (3.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 48  bytes 4024 (3.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:85:14:3b  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[04:00:08 root@rocky001[ ~]#ifconfig |head -n2
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.150  netmask 255.255.255.0  broadcast 10.0.0.255
[04:00:59 root@rocky001[ ~]#ifconfig |head -n2|tail -n1
        inet 10.0.0.150  netmask 255.255.255.0  broadcast 10.0.0.255
[04:01:18 root@rocky001[ ~]#

1.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指定输出分隔符

范例:

[16:41:54 root@rocky001[ etc]#cat 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
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin
systemd-resolve:x:193:193:systemd Resolver:/:/sbin/nologin
tss:x:59:59:Account used for TPM access:/dev/null:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
unbound:x:997:995:Unbound DNS resolver:/etc/unbound:/sbin/nologin
geoclue:x:996:994:User for geoclue:/var/lib/geoclue:/sbin/nologin
rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
pipewire:x:995:991:PipeWire System Daemon:/var/run/pipewire:/sbin/nologin
pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
qemu:x:107:107:qemu user:/:/sbin/nologin
clevis:x:994:988:Clevis Decryption Framework unprivileged user:/var/cache/clevis:/sbin/nologin
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
gluster:x:993:987:GlusterFS daemons:/run/gluster:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
chrony:x:992:986::/var/lib/chrony:/sbin/nologin
setroubleshoot:x:991:984::/var/lib/setroubleshoot:/sbin/nologin
saslauth:x:990:76:Saslauthd user:/run/saslauthd:/sbin/nologin
libstoragemgmt:x:989:983:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
dnsmasq:x:982:982:Dnsmasq DHCP and DNS server:/var/lib/dnsmasq:/sbin/nologin
sssd:x:981:981:User for sssd:/:/sbin/nologin
cockpit-ws:x:980:979:User for cockpit web service:/nonexisting:/sbin/nologin
cockpit-wsinstance:x:979:978:User for cockpit-ws instances:/nonexisting:/sbin/nologin
flatpak:x:978:977:User for flatpak system helper:/:/sbin/nologin
colord:x:977:976:User for colord:/var/lib/colord:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
gnome-initial-setup:x:976:975::/run/gnome-initial-setup/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
eureka:x:1000:1000:eureka:/home/eureka:/bin/bash
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
zhang-test:x:1001:1001::/home/zhang-test:/bin/bash
wangge:x:1002:1004::/home/wangge:/bin/bash
[16:42:16 root@rocky001[ etc]#

#这里我们取最后一行的id,cut以:为分隔取第一列

[16:42:16 root@rocky001[ etc]#cut -d: -f1 passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
dbus
systemd-coredump
systemd-resolve
tss
polkitd
unbound
geoclue
rtkit
pipewire
pulse
qemu
clevis
usbmuxd
gluster
rpc
avahi
chrony
setroubleshoot
saslauth
libstoragemgmt
dnsmasq
sssd
cockpit-ws
cockpit-wsinstance
flatpak
colord
rpcuser
gdm
gnome-initial-setup
sshd
tcpdump
eureka
postfix
zhang-test
wangge

#可以结合前面的命令取出wangge的ID 用head和tail命令 都可以取出来

[17:15:47 root@rocky001[ etc]#cut -d: -f1 passwd|tail -n1
wangge

#如果用head取我们不知道他的行号的话,我们将cut出来的内容重定向到新的文本文件用cat -n查看

[17:19:31 root@rocky001[ etc]#cut -d: -f1 passwd|tail -n1 > IDtest.txt
[17:20:59 root@rocky001[ etc]#cat -n IDtest.txt
     1    wangge

#其他例子,取出已用率

[17:24:52 root@rocky001[ ~]#df | tr -s ' '
文件系统 1K-块 已用 可用 已用% 挂载点
devtmpfs 883836 0 883836 0% /dev
tmpfs 914116 0 914116 0% /dev/shm
tmpfs 914116 9684 904432 2% /run
tmpfs 914116 0 914116 0% /sys/fs/cgroup
/dev/mapper/rl-root 73364480 6703532 66660948 10% /
/dev/mapper/rl-home 133071376 975128 132096248 1% /home
/dev/nvme0n1p1 1038336 260056 778280 26% /boot
tmpfs 182820 36 182784 1% /run/user/0
/dev/sr0 10950568 10950568 0 100% /run/media/root/Rocky-8-6-x86_64-dvd
[17:33:14 root@rocky001[ ~]#df | tr -s ' '|cut -d' ' -f5
已用%
0%
0%
2%
0%
10%
1%
26%
1%
100%

1.5合并多个文件paste

paste命令是将多个文件同行号的列到一行。

格式:

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

常用选项:

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

 范例:

[17:46:43 root@rocky001[ ~]#cat abc.txt
avb

1234

3
5
6
76
a
b
c
d
[17:46:48 root@rocky001[ ~]#paste 123.txt  abc.txt
睡你麻痹 起来嗨    avb
    
    1234
    
    3
  1    2     3    5
  2    6
  3    76
  4    a
  5    b
  6    c
  7    d
  8    
  9    
      

[17:47:06 root@rocky001[ ~]#paste -s 123.txt  abc.txt
睡你麻痹 起来嗨                      1    2     3      2      3      4      5      6      7      8      9      
avb        1234        3    5    6    76    a    b    c    d
[17:48:36 root@rocky001[ ~]#paste -d: 123.txt  abc.txt
睡你麻痹 起来嗨:avb
:
:1234
:
:3
  1    2     3:5
  2:6
  3:76
  4:a
  5:b
  6:c
  7:d
  8:
  9:
  :
[17:48:47 root@rocky001[ ~]#

1.6分析文本的工具

1.6.1收集文本统计数据wc

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

常见选项:

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

 范例:

[17:48:47 root@rocky001[ ~]#wc 123.txt
15 13 77 123.txt

#第一个为行数,第二个为单词数,第三个为字节数。

 1.6.2文本排序sort

把整理过的文本显示在stdout,不改变原始文。

格式:

sort [options] file(s)

 常用选项:

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

范例:

#比如我们从分区利用率中统计,以及统计最大的

[18:03:28 root@rocky001[ ~]#df
文件系统                1K-块     已用      可用 已用% 挂载点
devtmpfs               883836        0    883836    0% /dev
tmpfs                  914116        0    914116    0% /dev/shm
tmpfs                  914116     9684    904432    2% /run
tmpfs                  914116        0    914116    0% /sys/fs/cgroup
/dev/mapper/rl-root  73364480  6703540  66660940   10% /
/dev/mapper/rl-home 133071376   975128 132096248    1% /home
/dev/nvme0n1p1        1038336   260056    778280   26% /boot
tmpfs                  182820       36    182784    1% /run/user/0
/dev/sr0             10950568 10950568         0  100% /run/media/root/Rocky-8-6-x86_64-dvd
[18:05:01 root@rocky001[ ~]#df | tr -s ' '|cut -d' ' -f5|tr -dc "[0-9\n]"|sort -nr
100
26
10
2
1
1
0
0
0
                                                                                            
[18:06:41 root@rocky001[ ~]#df | tr -s ' '|cut -d' ' -f5|tr -dc "[0-9\n]"|sort -nr|head -n1
100
[18:06:51 root@rocky001[ ~]#

 1.6.3去重uniq

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

格式:

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

 常见选项;

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

 范例:

[18:19:54 root@rocky001[ ~]#cat 1test.txt
1
2
3
a
b
c
[18:20:01 root@rocky001[ ~]#cat 2test.txt
2
3
4
b
c
[18:20:05 root@rocky001[ ~]#cat 2test.txt  1test.txt
2
3
4
b
c
1
2
3
a
b
c
[18:20:11 root@rocky001[ ~]#cat 2test.txt  1test.txt |sort
1
2
2
3
3
4
a
b
b
c
c
[18:20:37 root@rocky001[ ~]#cat 2test.txt  1test.txt |sort |uniq
1
2
3
4
a
b
c
[18:20:52 root@rocky001[ ~]#cat 2test.txt  1test.txt |sort |uniq -c
      1 1
      2 2
      2 3
      1 4
      1 a
      2 b
      2 c
[18:21:03 root@rocky001[ ~]#cat 2test.txt  1test.txt |sort |uniq -d
2
3
b
c
[18:21:17 root@rocky001[ ~]#cat 2test.txt  1test.txt |sort |uniq -u
1
4
a
[18:21:21 root@rocky001[ ~]#

1.7文件查找工具

1.7.1locate 非实时查找(数据库查找):locate

  locate 查询系统上预建的文件索引数据库 /var/lib/mlocate/mlocate.db
  索引的构建是在系统较为空闲时自动进行(周期性任务),执行updatedb可以更新数据库
  索引构建过程需要遍历整个根文件系统,很消耗资源
  locate和updatedb命令来自于mlocate包

特点:

查找速度快
模糊查找
非实时查找
搜索的是文件的全路径,不仅仅是文件名
可能只搜索用户具备读取和执行权限的目录

格式:

locate [OPTION]... [PATTERN]...

常用选项:

-i 不区分大小写的搜索
-n N 只列举前N个匹配项目
-r 使用基本正则表达式

范例:

[09:14:22 root@rocky001[ ~]#locate -n 10 .txt
/Date/abc.txt
/Date/test.txt
/etc/IDtest.txt
/etc/brltty/Input/ba/all.txt
/etc/brltty/Input/bd/all.txt
/etc/brltty/Input/bl/18.txt
/etc/brltty/Input/bl/40_m20_m40.txt
/etc/brltty/Input/ec/all.txt
/etc/brltty/Input/ec/spanish.txt
/etc/brltty/Input/eu/all.txt
[09:14:48 root@rocky001[ ~]#

1.7.2find

find 是实时查找工具,通过遍历指定路径完成文件查找
  工作特点:
       查找速度略慢
       精确查找
       实时查找
       查找条件丰富
       可能只搜索用户具备读取和执行权限的目录

格式:

find [OPTION]... [查找路径] [查找条件] [处理动作]

  查找路径:指定具体目标路径;默认为当前目录
  查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件
  处理动作:对符合条件的文件做操作,默认输出至屏幕

指定搜索目录层级

-maxdepth level 最大搜索目录深度,指定目录下的文件为第1级
-mindepth level 最小搜索目录深度

范例:

find /etc -maxdepth 2 -mindepth 2

 根据文件名和inode查找

-name "文件名称" #支持使用glob,如:*, ?, [], [^],通配符要加双引号引起来
-iname "文件名称" #不区分字母大小写
-inum n #按inode号查找
-samefile name #相同inode号的文件
-links n #链接数为n的文件
-regex “PATTERN" #以PATTERN匹配整个文件路径,而非文件名称

 范例: 

[09:21:13 root@rocky001[ ~]#find -regex ".*\.txt$"
./.cache/tracker/db-version.txt
./.cache/tracker/db-locale.txt
./.cache/tracker/parser-version.txt
./.cache/tracker/locale-for-miner-apps.txt
./.cache/tracker/last-crawl.txt
./.cache/tracker/first-index.txt
./123.txt
./abc.txt
./2test.txt
./1test.txt
./4test.txt
./3test.txt
[09:21:16 root@rocky001[ ~]#

根据属主、属组查找

-user USERNAME  #查找属主为指定用户(UID)的文件
-group GRPNAME  #查找属组为指定组(GID)的文件
-uid UserID             #查找属主为指定的UID号的文件
-gid GroupID          #查找属组为指定的GID号的文件
-nouser                  #查找没有属主的文件
-nogroup                #查找没有属组的文件

 根据文件类型查找

-type TYPE
TYPE可以是以下形式:
f: 普通文件
d: 目录文件
l: 符号链接文件
s:套接字文件
b: 块设备文件
c: 字符设备文件
p: 管道文件

范例:

[09:25:50 root@rocky001[ ~]#find /Date -type f -ls
202021008      4 -rw-r--r--   1  root     root         1664 2月 28 04:47 /Date/abc.txt
202021011      0 -rw-r--r--   1  root     root            0 2月 28 04:45 /Date/[1-9]
202021018      4 -rw-r--r--   1  root     root           19 2月 28 04:47 /Date/[1-9].save
202021020      4 -rw-r--r--   1  root     root           15 3月 10 22:02 /Date/test.txt
[09:26:00 root@rocky001[ ~]#cd /Date
[09:26:13 root@rocky001[ Date]#ls
'[1-9]'  '[1-9].save'   abc.txt   test.txt
[09:26:17 root@rocky001[ Date]#

空文件或者目录

-empty

 组合条件

与:-a ,默认多个条件是与关系,所以可以省略-a
或:-o
非:-not !

范例:

[09:30:43 root@rocky001[ Date]#find /etc -type d -o -type l -ls |wc
    262    3406   41612
[09:30:52 root@rocky001[ Date]#find /etc -type d -a -type l -ls |wc
      0       0       0
[09:31:32 root@rocky001[ Date]#find /etc -type d ! -type l -ls |wc
    405    4455   38398
[09:31:45 root@rocky001[ Date]#

 德·摩根定律:

(非 A) 且 (非 B) = 非(A 或 B)
(非 A) 或 (非 B) = 非(A 且 B)

!A -a !B = !(A -o B)
!A -o !B = !(A -a B)

 根据文件大小查找

-size [+|-]#UNIT #常用单位:k, M, G,c(byte),注意大小写敏感
#UNIT: #表示(#-1, #],如:6k 表示(5k,6k]
-#UNIT #表示[0,#-1],如:-6k 表示[0,5k]
+#UNIT #表示(#,∞),如:+6k 表示(6k,∞)

根据时间戳

#以“天"为单位
-atime [+|-]#
# #表示[#,#+1)
+# #表示[#+1,∞]
-# #表示[0,#)
-mtime
-ctime
#以“分钟"为单位
-amin
-mmin
-cmin

 根据权限查找

-perm [/|-]MODE

MODE #精确权限匹配
/MODE #任何一类(u,g,o)对象的权限中只要有一位匹配即可,或关系,+ 从CentOS 7开始淘汰
-MODE #每一类对象都必须同时拥有指定权限,与关系
0 表示不关注

 说明:
find -perm 755 会匹配权限模式恰好是755的文件
只要当任意人有写权限时,find -perm /222就会匹配
只有当每个人都有写权限时,find -perm -222才会匹配
只有当其它人(other)有写权限时,find -perm -002才会匹配

 正则表达式

-regextype type
  Changes the regular expression syntax understood by -regex and -iregex tests
which occur later on the command line. Currently-implemented types are
emacs (this is the default), posix-awk, posix-basic, posix-egrep and posix-
extended.


-regex pattern
  File name matches regular expression pattern. This is a match on the whole
path, not a search. For example, to match a file named `./fubar3', you can
use the regular expression `.*bar.' or `.*b.*3', but not `f.*r3'. The regular
expressions understood by find are by default Emacs Regular Expressions, but
this can be changed with the -regextype option.

 参数替换 xargs

  由于很多命令不支持管道|来传递参数,xargs用于产生某个命令的参数,xargs 可以读入 stdin 的数据,并且以空格符或回车符将 stdin 的数据分隔成为参数,xargs支持标准输入
  另外,许多命令不能接受过多参数,命令执行可能会失败,xargs 可以解决
  注意:文件名或者是其他意义的名词内含有空格符的情况
  find 经常和 xargs 命令进行组合,形式如下:

find | xargs COMMAND

2文本处理三剑客, 文本格式化命令(printf)的相关命令及选项,示例

 2.1正则表达式

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

 2.1.1基本正则表达式元字符

2.1.1.1字符匹配

. 匹配任意单个字符(除了\n),可以是一个汉字或其它国家的文字
[] 匹配指定范围内的任意单个字符,示例:[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:] 标点符号
-----------------
\s #匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [\f\r\t\v]。注意 Unicode 正
则表达式会匹配全角空格符
\S #匹配任何非空白字符。等价于 [^\f\r\t\v]
\w #匹配一个字母,数字,下划线,汉字,其它国家文字的字符,等价于[_[:alnum:]字]
\W #匹配一个非字母,数字,下划线,汉字,其它国家文字的字符,等价于[^_[:alnum:]字]

 范例:

[18:21:21 root@rocky001[ ~]#ls
123.txt    5.bak            fa.bak  initial-setup-ks.cfg             rocky001.log
1.bak      abc.txt          fb.bak  manpages-zh-1.5.1                Templates
1test.txt  anaconda-ks.cfg  fc.bak  manpages-zh-1.5.1.tar.gz         test
2.bak      app              fd.bak  Music                            Videos
2test.txt  Desktop          fe.bak  Pictures                         zhang
3.bak      Documents        ff.bak  Public
4.bak      Downloads        fg.bak  rocky001-2024-02-2401:14:05.log
[20:25:53 root@rocky001[ ~]#ls |grep .bak
1.bak
2.bak
3.bak
4.bak
5.bak
fa.bak
fb.bak
fc.bak
fd.bak
fe.bak
ff.bak
fg.bak
[20:26:29 root@rocky001[ ~]#ls |grep [0-3]
123.txt
1.bak
1test.txt
2.bak
2test.txt
3.bak
manpages-zh-1.5.1
manpages-zh-1.5.1.tar.gz
rocky001-2024-02-2401:14:05.log
rocky001.log
[20:27:06 root@rocky001[ ~]#ls |grep [0-3].bak
[20:27:16 root@rocky001[ ~]#ls |grep '[0-3].bak'
1.bak
2.bak
3.bak
[20:27:26 root@rocky001[ ~]#

2.1.1.2匹配次数

用在指定字符后面,作用是指定前面字符在检索中出现的次数

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

范例:

[03:10:49 root@rocky001[ ~]#cat 3test.txt
laoooooooooowang
laowang
laooowang
laoowamg
lawamh
laoOwang
[03:12:13 root@rocky001[ ~]#grep 'lao\+' 3test.txt
laoooooooooowang
laowang
laooowang
laoowamg
laoOwang
[03:13:32 root@rocky001[ ~]#grep 'lao\{2\}' 3test.txt
laoooooooooowang
laooowang
laoowamg
[03:14:08 root@rocky001[ ~]#grep 'lao\?' 3test.txt
laoooooooooowang
laowang
laooowang
laoowamg
lawamh
laoOwang
[03:14:31 root@rocky001[ ~]#grep 'lao\{1,\}' 3test.txt
laoooooooooowang
laowang
laooowang
laoowamg
laoOwang
[03:15:02 root@rocky001[ ~]#grep 'lao\{,3\}wang' 3test.txt
laowang
laooowang
[03:15:55 root@rocky001[ ~]#grep 'lao\{1,3\}wang' 3test.txt
laowang
laooowang
[03:16:56 root@rocky001[ ~]#grep 'lao\{1,3\}' 3test.txt
laoooooooooowang
laowang
laooowang
laoowamg
laoOwang
[03:17:07 root@rocky001[ ~]#grep 'lao\{1,3\}wang' 3test.txt
laowang
laooowang
[03:17:27 root@rocky001[ ~]#grep 'lao*wang' 3test.txt
laoooooooooowang
laowang
laooowang
[03:17:57 root@rocky001[ ~]#grep 'lao*Owang' 3test.txt
laoOwang
[03:18:19 root@rocky001[ ~]#

范例:

#挑选出ip地址

[03:27:52 root@rocky001[ ~]#ifconfig ens160
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.150  netmask 255.255.255.0  broadcast 10.0.0.255
        inet6 fe80::20c:29ff:fed7:f093  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:d7:f0:93  txqueuelen 1000  (Ethernet)
        RX packets 490877  bytes 666652610 (635.7 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 213416  bytes 12542505 (11.9 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

#将文本内容传给grep 挑出netmask所在行

[03:27:58 root@rocky001[ ~]#ifconfig ens160|grep netmask
        inet 10.0.0.150  netmask 255.255.255.0  broadcast 10.0.0.255

#将所在行继续传给grep -o 只显示ip地址
[03:28:00 root@rocky001[ ~]#ifconfig ens160|grep netmask|grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'
10.0.0.150
255.255.255.0
10.0.0.255

#通过显示文本命令head挑选出第一行

[03:28:46 root@rocky001[ ~]#ifconfig ens160|grep netmask|grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'|head -n1
10.0.0.150
[03:28:59 root@rocky001[ ~]#

 2.1.1.3位置锚定

位置锚定可以用来定位出现的位置。

^ #行首锚定, 用于模式的最左侧
$ #行尾锚定,用于模式的最右侧
^PATTERN$ #用于模式匹配整行
^$ #空行
^[[:space:]]*$ #空白行
\< 或 \b #词首锚定,用于单词模式的左侧
\> 或 \b #词尾锚定,用于单词模式的右侧
\<PATTERN\> #匹配整个单词
#注意: 单词是由字母,数字,下划线组成

 范例:

[03:47:45 root@rocky001[ ~]#cat 3test.txt
laoooooooooowang
laowang
laooowang
laoowamg
lawamh
laoOwang
#laowang
#laoma
[03:47:56 root@rocky001[ ~]#grep -v '^#' 3test.txt
laoooooooooowang
laowang
laooowang
laoowamg
lawamh
laoOwang
[03:48:00 root@rocky001[ ~]#grep '^#' 3test.txt
#laowang
#laoma
[03:48:04 root@rocky001[ ~]#grep 'g$' 3test.txt
laoooooooooowang
laowang
laooowang
laoowamg
laoOwang
#laowang
[03:48:13 root@rocky001[ ~]#

#这里看不出和grep查找的区别,我们在其中一行的中间加上#,然后再词首锚定查找。

[03:49:02 root@rocky001[ ~]#cat 3test.txt
laoooooooooowang
laowang
laooowang
laoowamg
lawamh
laoOwang
#laowang
#laoma
lao#wang
[03:49:59 root@rocky001[ ~]#grep '^#' 3test.txt
#laowang
#laoma
[03:50:03 root@rocky001[ ~]#

 2.2分组和或者

2.2.1分组

  分组:() 将多个字符捆绑在一起,当作一个整体处理,如:\(root\)+
  后向引用:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, ...
  \1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
  注意: \0 表示正则表达式匹配的所有字符

示例:

\(string1\(string2\)\)   ......#第二出现可以用\1表示
\1 :string1\(string2\)  #被后向引用第一个()内容为\1
\2 :string2                 #被后向引用第二个()内容为\2

2.2.2或者

或者 \|

示例:

a\|b             #a或b
C\|cat         #C或cat
\(C\|c\)at    #Cat或cat

2.3 扩展正则表达式元字符

  #个人看来和前面基本正则表达式没什么区别,唯一的区别在于开启扩展正则表达式后,例如\{ \}这种基本正则表达式需要用反斜线\来转译就不需要加\可以直接写成{ },一般配合文本处理工具使用例如grep sed命令-E开启扩展正则表达式。

2.4文本处理三剑客之 grep

grep: Global search REgular expression and Print out the line
作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行
模式:由正则表达式字符及文本字符所编写的过滤条件
帮助:

grep(1) - Linux manual page

 格式:

grep [OPTIONS] PATTERN [FILE...]

 常见选项:

--color=auto 对匹配到的文本着色显示
-m # 匹配#次后停止

-v 显示不被pattern匹配到的行,即不显示匹配到的行,取反

-n 显示匹配的行号

-i 忽略字符大小写

-c 统计匹配的行数
-o 仅显示匹配到的字符串
-q 静默模式,不输出任何信息
-A # after, 后#行
-B # before, 前#行
-C # context, 前后各#行
-e 实现多个选项间的逻辑or关系,如:grep –e ‘cat ' -e ‘dog' file
-w 匹配整个单词
-E 使用ERE,相当于egrep,扩展正则表达式
-F 不支持正则表达式,相当于fgrep
-P 支持Perl格式的正则表达式
-f file 根据模式文件处理
-r 递归目录,但不处理软链接
-R 递归目录,但处理软链接

 范例:

#例如我们前面用过grep来获取ip地址所在行,现在我们可以用正则表达式来找。

[04:34:32 root@rocky001[ ~]#ifconfig ens160
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.150  netmask 255.255.255.0  broadcast 10.0.0.255
        inet6 fe80::20c:29ff:fed7:f093  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:d7:f0:93  txqueuelen 1000  (Ethernet)
        RX packets 498071  bytes 674720953 (643.4 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 216774  bytes 12803638 (12.2 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[04:34:40 root@rocky001[ ~]#ifconfig ens160 | grep netmask
        inet 10.0.0.150  netmask 255.255.255.0  broadcast 10.0.0.255

#按照之前的方式用基本正则表达式

[04:40:00 root@rocky001[ ~]#ifconfig ens160 | grep netmask|grep -o '[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}'
10.0.0.150
255.255.255.0
10.0.0.255 

#按照现在刚了解到的开启扩展正则表达式

[04:36:49 root@rocky001[ ~]#ifconfig ens160 | grep netmask|grep -o -E '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}'
10.0.0.150
255.255.255.0
10.0.0.255

#得到同样的结果,我们发现开启扩展正则表达式后的代码输入方式变得简洁明了,因为扩展正则表达式后不需要再用反斜线\来去给{ }转译了。

#------------------------------------------------------------------------------------------------------------------------

#下面是或者的示例,这里我们开启扩展正则表达式避免用\去转译|。

[04:50:52 root@rocky001[ ~]#cat 3test.txt
laoooooooooowang
laowang
laooowang
laoowamg
lawamh
laoOwang
#laowang
#laoma
lao#wang

[04:55:09 root@rocky001[ ~]#grep '^#\|h$' 3test.txt
lawamh
#laowang
#laoma
[04:57:03 root@rocky001[ ~]#grep -e'^#' -e 'h$' 3test.txt
lawamh
#laowang
#laoma

#下面为开启扩展正则表达式
[04:57:13 root@rocky001[ ~]#grep -E '^#|h$' 3test.txt
lawamh
#laowang
#laoma
[04:57:46 root@rocky001[ ~]#

 2.5文本处理三剑客之sed

  sed 即 Stream EDitor,和 vi 不同,sed是行编辑器。

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

工作原理图:

帮助:

sed(1) - Linux manual page

 2.5.1sed基本用法

格式:

sed [option]... 'script;script;...' [inputfile...]

 常见选项:

-n 不输出模式空间内容到屏幕,即不自动打印
-e 多点编辑
-f FILE 从指定文件中读取编辑脚本
-r, -E 使用扩展正则表达式
-i.bak 备份文件并原处编辑
-s 将多个文件视为独立文件,而不是单个连续的长文件流
#说明:
-ir 不支持
-i -r 支持
-ri 支持
-ni 危险选项,会清空文件

 script格式是地址命令

地址命令格式:

1.不给地址,这个时候会对全文进行处理。

2. 单地址:
#:指定的行,$:最后一行
/pattern/:被此处模式所能够匹配到的每一行

3. 地址范围:
#,# #从#行到第#行,3,6 从第3行到第6行
#,+# #从#行到+#行,3,+4 表示从3行到第7行
/pat1/,/pat2/
#,/pat/
/pat/,#
4. 步进:~
1~2 奇数行
2~2 偶数行

 地址命令:

p          打印当前模式空间内容,追加到默认输出之后

Ip         忽略大小写输出
d          删除模式空间匹配的行,并立即启用下一轮循环
a [\]text        在指定行后面追加文本,支持使用\n实现多行追加
i [\]text         在行前面插入文本
c [\]text        替换行为单行或多行文本
w file           保存模式匹配的行至指定文件
r file            读取指定文件的文本至模式空间中匹配到的行后
=                 为模式空间中的行打印行号
!                  模式空间中匹配行取反处理
q                 结束或退出sed

 查找和替代

s/pattern/string/修饰符 查找替换,支持使用其它分隔符,可以是其它形式:s@@@,s###
替换修饰符:
g 行内全局替换
p 显示替换成功的行
w /PATH/FILE 将替换成功的行保存至文件中
I,i 忽略大小写

 范例:

#获取分区率

[06:48:36 root@rocky001[ ~]#df
文件系统                1K-块     已用      可用 已用% 挂载点
devtmpfs               883836        0    883836    0% /dev
tmpfs                  914116        0    914116    0% /dev/shm
tmpfs                  914116     9684    904432    2% /run
tmpfs                  914116        0    914116    0% /sys/fs/cgroup
/dev/mapper/rl-root  73364480  6702784  66661696   10% /
/dev/mapper/rl-home 133071376   975128 132096248    1% /home
/dev/nvme0n1p1        1038336   260056    778280   26% /boot
tmpfs                  182820       36    182784    1% /run/user/0
/dev/sr0             10950568 10950568         0  100% /run/media/root/Rocky-8-6-x86_64-dvd

#根据获取到的文本内容我们用正则表达式去描述,我们只要取出/dev下的%的内容
[06:48:48 root@rocky001[ ~]#df|sed -rn '/^\/dev\//s@.*[[:space:]].*[[:space:]].*[[:space:]].*[[:space:]]([0-9]+)%.*@\1%@p'
10%
1%
26%
100%
[06:48:57 root@rocky001[ ~]#

#上面代码过于冗长,可以根据特点去精简一下。

[07:00:07 root@rocky001[ ~]#df|sed -rn '/^\/dev\//s@(.*[[:space:]]{1,5})([0-9]+)%.*@\2%@p'
10%
1%
26%
100%
[07:00:12 root@rocky001[ ~]#

#这里我们还用到了2.2.1的分组,s@.*([[:space:]]{1,5})([0-9]+)%.*@\2%@,在前面的代码中的两个( )( )按照顺序分别代表变量\1和变量\2

#获取ip地址

[07:46:43 root@rocky001[ ~]#ifconfig |grep netmask
        inet 10.0.0.150  netmask 255.255.255.0  broadcast 10.0.0.255
        inet 127.0.0.1  netmask 255.0.0.0
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255

[08:09:26 root@rocky001[ ~]#ifconfig | grep netmask |sed -nr 's#inet[[:space:]](.*)netmask.*#\1#p'
        10.0.0.150  
        127.0.0.1  
        192.168.122.1  
[08:10:31 root@rocky001[ ~]#ifconfig | grep netmask |sed -nr '1s#inet[[:space:]](.*)netmask.*#\1#p'
        10.0.0.150  
[08:11:28 root@rocky001[ ~]#

   

#正则表达式写法不唯一可能会有多种写法

[08:04:03 root@rocky001[ ~]#ifconfig |grep netmask |sed -nr '1s/^[^0-9]+([0-9.]{7,15}).*/\1/p'
10.0.0.150#这里{7,15}指的是0.0.0.0到111.111.111.111的ip地址字符位数。

[08:17:05 root@rocky001[ ~]#ifconfig | grep netmask |sed -nr '1s#^[^0-9]+([0-9.]+).*#\1#p'
10.0.0.150

[08:22:23 root@rocky001[ ~]#ifconfig | grep netmask |sed -nr '1s#inet(.*)netmask.*#\1#p'
         10.0.0.150  

 2.6动作printf

printf可以实现格式化输出

格式:

printf “FORMAT”, item1, item2, ...

说明:
    必须指定FORMAT
    不会自动换行,需要显式给出换行控制符 \n
    FORMAT中需要分别为后面每个item指定格式符


格式符:与item一一对应

%s:显示字符串
%d, %i:显示十进制整数
%f:显示为浮点数
%e, %E:显示科学计数法数值
%c:显示字符的ASCII码
%g, %G:以科学计数法或浮点形式显示数值
%u:无符号整数
%%:显示%自身

 修饰符:

#[.#]     第一个数字控制显示的宽度;第二个#表示小数点后精度,如:%3.1f
-           左对齐(默认右对齐) 如:%-15s
+          显示数值的正负符号 如:%+d

 常用的转译符

\a    警告字符,通常为ASCII的BEL字符
\b    后退
\f     换页
\n    换行
\r     回车
\t     水平制表符
\v    垂直制表符
\     表示\本身

范例:

1[06:21:55 root@rocky001[ ~]#printf "%s\n" 1 2 3 4
1
2
3
4
[06:23:47 root@rocky001[ ~]#printf "%s" 1 2 3 4
 

[06:30:27 root@rocky001[ ~]#printf "%-10s %-10s %s\n" 姓名 身高 体重 Renton 1.7 62 Eureka 1.6 50 Horando 1.8 75
姓名     身高     体重
Renton     1.7        62
Eureka     1.6        50
Horando    1.8        75
[06:30:41 root@rocky001[ ~]#

3 总结变量命名规则,不同类型变量(环境变量,位置变量,只读变量,局部变量,状态变量)如何使用。

3.1Shell中变量命名法则

3.1.1Shell中变量命名法则

1.区分大小写
2.不能使程序中的保留字和内置变量:如:if, for
3.只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反。

3.1.2命名习惯

1.见名知义,用英文单词命名,并体现出实际作用,不要用简写,如:ATM
2.变量名大写
3.局部变量小写
4.函数名小写
5.大驼峰StudentFirstName,由多个单词组成,且每个单词的首字母是大写,其它小写
6.小驼峰studentFirstName ,由多个单词组成,第一个单词的首字母小写,后续每个单词的首字母是大写,其它小写
7.下划线: student_name

3.2变量定义和引用

 变量的生效范围等标准划分变量类型:


普通变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell
进程均无效


环境变量:生效范围为当前shell进程及其子进程


本地变量:生效范围为当前shell进程中某代码片断,通常指函数

变量赋值:

name='value'

 value可以是下面多种形式

直接字符串:name='root'
变量引用:   name="$USER"
命令引用:   name=`COMMAND` 或者 name=$(COMMAND)

#变量赋值是临时生效,退出终端后自动删除,无法持久保存,脚本中的变量也会随着脚本进程的结束自动删除。

变量引用:

$name

${name}

 引用分为强弱引用

“$name” 弱引用,其中的变量会被替换为变量值。

’$name‘  强引用,其中的变量引用不会为变量值,保持原来的字符串。

范例:

[04:59:45 root@rocky001[ Date]#VMNAME='ceo'
[05:01:02 root@rocky001[ Date]#echo $VMNAME
ceo
[05:01:13 root@rocky001[ Date]#echo i am $VMNAME
i am ceo
[05:02:11 root@rocky001[ Date]#echo 'i am $VMNAME'   #强引用
i am $VMNAME
[05:02:20 root@rocky001[ Date]#echo "i am $VMNAME"  #弱引用
i am ceo
[05:02:29 root@rocky001[ Date]#

#变量追加

[05:02:29 root@rocky001[ Date]#VMNAME+=:boss
[05:05:29 root@rocky001[ Date]#echo "i am $VMNAME"
i am ceo:boss
[05:05:32 root@rocky001[ Date]#

 显示已经定义的所有变量

set 命令

删除变量

unset <name>

 范例:

[05:05:32 root@rocky001[ Date]#VMNAME2=user
[05:08:08 root@rocky001[ Date]#echo $VMNAME $VMNAME2
ceo:boss user
[05:08:23 root@rocky001[ Date]#unset VMNAME2
[05:09:22 root@rocky001[ Date]#echo $VMNAME $VMNAME2
ceo:boss
[05:09:23 root@rocky001[ Date]#

 3.3环境变量

 环境变量:
              可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量

              一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程

             一般只在系统配置文件中使用,在脚本中较少使用

变量声明和赋值:

#声明并赋值
export name=VALUE
declare -x name=VALUE
#或者分两步实现
name=VALUE
export name

 变量引用:

$name
${name}

 显示所有环境变量:

evn

printenv

export

declare -x

 查看指定的进程的环境变量

cat /proc/$PID/environ

 bash内建的环境变量:

PATH
SHELL
USER
UID
HOME
PWD
SHLVL #shell的嵌套层数,即深度
LANG
MAIL
HOSTNAME
HISTSIZE
_ #下划线,表示前一命令的最后一个参数

 范例:查看进程

[05:34:21 root@rocky001[ ~]#cat /proc/2445/environ
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/0/busDESKTOP_SESSION=gnomeDISPLAY=:0GDMSESSION=gnomeGDM_LANG=en_US.UTF-8GNOME_DESKTOP_SESSION_ID=this-is-deprecatedHISTCONTROL=ignoredupsHISTSIZE=1000HOME=/rootHOSTNAME=rocky001LANG=en_US.UTF-8LESSOPEN=||/usr/bin/lesspipe.sh %sLOGNAME=rootMAIL=/var/spool/mail/rootPATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/root/binPWD=/rootQT_IM_MODULE=ibusSESSION_MANAGER=local/unix:@/tmp/.ICE-unix/2295,unix/unix:/tmp/.ICE-unix/2295SHELL=/bin/bashSHLVL=1SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpassSSH_AUTH_SOCK=/run/user/0/keyring/sshUSER=rootUSERNAME=rootWAYLAND_DISPLAY=wayland-0XAUTHORITY=/run/user/0/.mutter-Xwaylandauth.BT1PK2XDG_CURRENT_DESKTOP=GNOMEXDG_DATA_DIRS=/root/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/shareXDG_MENU_PREFIX=gnome-XDG_RUNTIME_DIR=/run/user/0XDG_SEAT=seat0XDG_SESSION_DESKTOP=gnomeXDG_SESSION_ID=2XDG_SESSION_TYPE=waylandXDG_VTNR=2XMODIFIERS=@im=ibuswhich_declare=declare -fMANAGERPID=2256INVOCATION_ID=8ae69b0babb344e99bf091594d10880bJOURNAL_STREAM=9:47390[05:34:25 root@rocky001[ ~]#

#文本显示非常乱,需要整理一下
[05:35:05 root@rocky001[ ~]#cat /proc/2445/environ |tr '\0' '\n'  #把文件结束符号替成换行。
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/0/bus
DESKTOP_SESSION=gnome
DISPLAY=:0
GDMSESSION=gnome
GDM_LANG=en_US.UTF-8
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
HISTCONTROL=ignoredups
HISTSIZE=1000
HOME=/root
HOSTNAME=rocky001
LANG=en_US.UTF-8
LESSOPEN=||/usr/bin/lesspipe.sh %s
LOGNAME=root
MAIL=/var/spool/mail/root
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/root/bin
PWD=/root
QT_IM_MODULE=ibus
SESSION_MANAGER=local/unix:@/tmp/.ICE-unix/2295,unix/unix:/tmp/.ICE-unix/2295
SHELL=/bin/bash
SHLVL=1
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
SSH_AUTH_SOCK=/run/user/0/keyring/ssh
USER=root
USERNAME=root
WAYLAND_DISPLAY=wayland-0
XAUTHORITY=/run/user/0/.mutter-Xwaylandauth.BT1PK2
XDG_CURRENT_DESKTOP=GNOME
XDG_DATA_DIRS=/root/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share
XDG_MENU_PREFIX=gnome-
XDG_RUNTIME_DIR=/run/user/0
XDG_SEAT=seat0
XDG_SESSION_DESKTOP=gnome
XDG_SESSION_ID=2
XDG_SESSION_TYPE=wayland
XDG_VTNR=2
XMODIFIERS=@im=ibus
which_declare=declare -f
MANAGERPID=2256
INVOCATION_ID=8ae69b0babb344e99bf091594d10880b
JOURNAL_STREAM=9:47390

 3.4只读变量

只读变量:只能声明定义,但后续不能修改和删除,即常量
声明只读变量:

readonly name
declare -r name

 查看只读变量:

readonly [-p]
declare -r

 范例:

[05:47:15 root@rocky001[ ~]#readonly PI=3.1415926
[05:47:37 root@rocky001[ ~]#echo PI
PI
[05:47:43 root@rocky001[ ~]#echo $PI
3.1415926
[05:47:48 root@rocky001[ ~]#unset PI
-bash: unset: PI: 无法取消设定: 只读 variable
[05:47:57 root@rocky001[ ~]#PI=:3.1415
-bash: PI: 只读变量
[05:48:23 root@rocky001[ ~]#

#重启后消失

 3.5位置变量

位置变量:在bash shell中内置的变量, 在脚本代码中调用通过命令行传递给脚本的参数

$1,$2.......对应第一个第二个参数,shift [n]换位置

$0       命令本身,包括路径

$*       传递给脚本的所有参数,并且全部参数合成一个字符串

$@     传递给脚本的所有参数,每个参数为独立字符串
$#      传递给脚本的参数的个数
注意:$@ $* 只在被双引号包起来的时候才会有差异

 清空所有位置变量:

set --

范例:

[05:56:18 root@rocky001[ ~]#cat args.sh
#!/bin/bash
#
#********************************************************************
#Author:            wangxiaochun
#QQ:                29308620
#Date:              2022-04-01
#FileName:          args.sh
#URL:               http://www.wangxiaochun.com
#Description:       The test script
#Copyright (C):     2022 All rights reserved
#********************************************************************
echo "1st arg is $1"
echo "2st arg is $2"
echo "3st arg is $3"
echo "10st arg is ${10}"
echo "All args are $*"
echo "All args are $@"


echo "The args number is $#"
echo "The script name  is $0"
[05:56:26 root@rocky001[ ~]#. args.sh
1st arg is
2st arg is
3st arg is
10st arg is
All args are
All args are
The args number is 0
The script name  is -bash
[05:57:10 root@rocky001[ ~]#. args.sh {a..z}
1st arg is a
2st arg is b
3st arg is c
10st arg is j
All args are a b c d e f g h i j k l m n o p q r s t u v w x y z
All args are a b c d e f g h i j k l m n o p q r s t u v w x y z
The args number is 26
The script name  is -bash

[05:58:22 root@rocky001[ ~]#. args.sh {0..9}
1st arg is 0
2st arg is 1
3st arg is 2
10st arg is 9
All args are 0 1 2 3 4 5 6 7 8 9
All args are 0 1 2 3 4 5 6 7 8 9
The args number is 10
The script name  is -bash
[05:58:30 root@rocky001[ ~]#

 3.6状态变量

  当我们浏览网页时,有时会看到下图所显示的数字,表示网页的错误信息,我们称为状态码,在shell脚本中也有相似的技术表示程序执行的相应状态。

 

 进程执行后,将使用变量 $? 保存状态码的相关数字,不同的值反应成功或失败,$?取值范例 0-255

$?的值为0 #代表成功
$?的值是1到255 #代表失败

 范例:

[05:58:30 root@rocky001[ ~]#curl -fs http://www.asdasdsa222485.com >/dev/null
[06:09:36 root@rocky001[ ~]#echo $?
6
[06:09:46 root@rocky001[ ~]#curl -fs http://www.baidu.com >/dev/null
[06:10:05 root@rocky001[ ~]#echo $?                                 #没有图形化工具显示乱码
0                                                                                              直接将1>到垃圾箱。
[06:10:14 root@rocky001[ ~]#

 可以在脚本中使用下面命令自定义退出状态码

exit [n]

  脚本遇到exit命令后会立即终止脚本,终止的状态取决于n。

  如果没有n(数字),退出状态取决exit前一个命令执行结果

  如果没有exit命令,没有给脚本指定状态退出码,脚本的退出状态取决于脚本最后一条命令的状态码。

3.7set命令实现脚本执行安全

set 命令实现脚本安全
-u 在扩展一个没有设置的变量时,显示错误信息, 等同set -o nounset
-e 如果一个命令返回一个非0退出状态值(失败)就退出, 等同set -o errexit
-o option 显示,打开或者关闭选项
显示选项:set -o
打开选项:set -o 选项
关闭选项:set +o 选项
-x 当执行命令时,打印命令及其参数,类似 bash -x

范例:

[06:10:37 root@rocky001[ ~]#set -o
allexport          off
braceexpand        on
emacs              on
errexit            off
errtrace           off
functrace          off
hashall            on
histexpand         on
history            on
ignoreeof          off
interactive-comments    on
keyword            off
monitor            on
noclobber          off
noexec             off
noglob             off
nolog              off
notify             off
nounset            off
onecmd             off
physical           off
pipefail           off
posix              off
privileged         off
verbose            off
vi                 off
xtrace             off
[06:18:15 root@rocky001[ ~]#

 4. 通过shell编程完成,30鸡和兔的头,80鸡和兔的脚,分别有几只鸡,几只兔?

[08:00:55 root@rocky001[ ~]#cat RAC.sh
#!/bin/bash
#x+y=30 2x+4y=80; 30-y+2y=40;y=40-30
Head=30
Foot=80
Rabbit=$[80/2-Head]
Chicken=$[Head-Rabbit]
echo 兔子的数量$Rabbit
echo 鸡的数量$Chicken

[08:01:03 root@rocky001[ ~]#

[08:01:03 root@rocky001[ ~]#. RAC.sh
兔子的数量10
鸡的数量20
[08:01:26 root@rocky001[ ~]#

#for循环的写法

[22:01:05 root@rocky001[ ~]#cat RAC.sh
#!/bin/bash
#
#Head=0
#Foot=80
#Rabbit=$[80/2-Head]
#Chicken=$[Head-Rabbit]
#echo 兔子的数量$Rabbit
#echo 鸡的数量$Chicken
for i in {1..29};do
    j=$(expr 30 - $i )
    if [ $(expr $i + 2 \* $j) -eq 40  ];then
        echo "鸡的数量"$i "兔子的数量"$j
    fi
done

[22:01:08 root@rocky001[ ~]#bash RAC.sh
鸡的数量20 兔子的数量10
[22:01:11 root@rocky001[ ~]#

 5. 结合编程的for循环,条件测试,条件组合,完成批量or循创建100个用户

 #for循环嵌套if判断条件。

[01:56:42 root@rocky001[ ~]#ls /home/
eureka  name1  NAME1  wangge  zhang-test
[01:56:57 root@rocky001[ ~]#vim adduser.sh
[01:59:30 root@rocky001[ ~]#cat adduser.sh
#!/bin/bash
for i in {1..100};do
    id="NAME$i"
    if id "NAME$i" &>/dev/null;then
        echo"用户 $id 已经存在";
    else
        adduser $id ; echo"用户 $id 已经创建"

    fi
done
[01:59:37 root@rocky001[ ~]#. adduser.sh
bash: echo用户 NAME1 已经存在: 未找到命令...
bash: echo用户 NAME2 已经创建: 未找到命令...
bash: echo用户 NAME3 已经创建: 未找到命令...
bash: echo用户 NAME4 已经创建: 未找到命令...
bash: echo用户 NAME5 已经创建: 未找到命令...
bash: echo用户 NAME6 已经创建: 未找到命令...
bash: echo用户 NAME7 已经创建: 未找到命令...
bash: echo用户 NAME8 已经创建: 未找到命令...
bash: echo用户 NAME9 已经创建: 未找到命令...

................................................................................

bash: echo用户 NAME97 已经创建: 未找到命令...
bash: echo用户 NAME98 已经创建: 未找到命令...
bash: echo用户 NAME99 已经创建: 未找到命令...
bash: echo用户 NAME100 已经创建: 未找到命令...

[02:00:12 root@rocky001[ ~]#ls /home/
eureka   NAME13  NAME2   NAME26  NAME32  NAME39  NAME45  NAME51  NAME58  NAME64  NAME70  NAME77  NAME83  NAME9   NAME96
name1    NAME14  NAME20  NAME27  NAME33  NAME4   NAME46  NAME52  NAME59  NAME65  NAME71  NAME78  NAME84  NAME90  NAME97
NAME1    NAME15  NAME21  NAME28  NAME34  NAME40  NAME47  NAME53  NAME6   NAME66  NAME72  NAME79  NAME85  NAME91  NAME98
NAME10   NAME16  NAME22  NAME29  NAME35  NAME41  NAME48  NAME54  NAME60  NAME67  NAME73  NAME8   NAME86  NAME92  NAME99
NAME100  NAME17  NAME23  NAME3   NAME36  NAME42  NAME49  NAME55  NAME61  NAME68  NAME74  NAME80  NAME87  NAME93  wangge
NAME11   NAME18  NAME24  NAME30  NAME37  NAME43  NAME5   NAME56  NAME62  NAME69  NAME75  NAME81  NAME88  NAME94  zhang-test
NAME12   NAME19  NAME25  NAME31  NAME38  NAME44  NAME50  NAME57  NAME63  NAME7   NAME76  NAME82  NAME89  NAME95
[02:00:19 root@rocky001[ ~]#

#用短路与和短路或来判断

[02:19:51 root@rocky001[ ~]#. adduser.sh
用户 NAME98 已经存在
用户 NAME98 已经创建
用户 NAME99 已经存在
用户 NAME99 已经创建
用户 NAME100 已经存在
用户 NAME100 已经创建
用户 NAME101 已经创建
用户 NAME102 已经创建
用户 NAME103 已经创建
用户 NAME104 已经创建
用户 NAME105 已经创建
用户 NAME106 已经创建
用户 NAME107 已经创建
用户 NAME108 已经创建
用户 NAME109 已经创建
用户 NAME110 已经创建
用户 NAME111 已经创建
用户 NAME112 已经创建
用户 NAME113 已经创建
用户 NAME114 已经创建
用户 NAME115 已经创建
用户 NAME116 已经创建
用户 NAME117 已经创建
用户 NAME118 已经创建
[02:19:57 root@rocky001[ ~]#cat adduser.sh
#!/bin/bash
#for i in {1..100};do
#    id="NAME$i"
#    if id "NAME$i" &>/dev/null;then
#        echo"用户 $id 已经存在";
#    else
#        adduser $id ; echo"用户 $id 已经创建"
#
#    fi
#done
for i in {98..118};do
    id="NAME$i";
    id "NAME$i" &>/dev/null && echo "用户 $id 已经存在" || adduser $id ; echo "用户 $id 已经创建"        #虽然是短路与,id命令的结果用户存在和不存在都是有标准0输出的,都是有结果
done      #的,这里不能作为短路与的开头。

#上面虽然创建了但是echo的信息有错误。根据逻辑错误地方修改一下

[02:27:20 root@rocky001[ ~]#vim adduser.sh
[02:35:27 root@rocky001[ ~]#cat adduser.sh
#!/bin/bash
#for i in {1..100};do
#    id="NAME$i"
#    if id "NAME$i" &>/dev/null;then
#        echo"用户 $id 已经存在";
#    else
#        adduser $id ; echo"用户 $id 已经创建"
#
#    fi
#done
for i in {98..128};do
    id="NAME$i";
    adduser $id &>/dev/null && echo "用户 $id 已经创建" || echo "用户 $id 已经存在"
done    #这里adduser是存在标准输出1的,即创建失败,可以用作短路与开头
[02:35:34 root@rocky001[ ~]#. adduser.sh                
用户 NAME98 已经存在
用户 NAME99 已经存在
用户 NAME100 已经存在
用户 NAME101 已经存在
用户 NAME102 已经存在
用户 NAME103 已经存在
用户 NAME104 已经存在
用户 NAME105 已经存在
用户 NAME106 已经存在
用户 NAME107 已经存在
用户 NAME108 已经存在
用户 NAME109 已经存在
用户 NAME110 已经存在
用户 NAME111 已经存在
用户 NAME112 已经存在
用户 NAME113 已经存在
用户 NAME114 已经存在
用户 NAME115 已经存在
用户 NAME116 已经存在
用户 NAME117 已经存在
用户 NAME118 已经存在
用户 NAME119 已经创建
用户 NAME120 已经创建
用户 NAME121 已经创建
用户 NAME122 已经创建
用户 NAME123 已经创建
用户 NAME124 已经创建
用户 NAME125 已经创建
用户 NAME126 已经创建
用户 NAME127 已经创建
用户 NAME128 已经创建
[02:35:40 root@rocky001[ ~]#ls /home
eureka   NAME104  NAME112  NAME120  NAME13  NAME21  NAME3   NAME38  NAME46  NAME54  NAME62  NAME70  NAME79  NAME87  NAME95
NAME     NAME105  NAME113  NAME121  NAME14  NAME22  NAME30  NAME39  NAME47  NAME55  NAME63  NAME71  NAME8   NAME88  NAME96
name1    NAME106  NAME114  NAME122  NAME15  NAME23  NAME31  NAME4   NAME48  NAME56  NAME64  NAME72  NAME80  NAME89  NAME97
NAME1    NAME107  NAME115  NAME123  NAME16  NAME24  NAME32  NAME40  NAME49  NAME57  NAME65  NAME73  NAME81  NAME9   NAME98
NAME10   NAME108  NAME116  NAME124  NAME17  NAME25  NAME33  NAME41  NAME5   NAME58  NAME66  NAME74  NAME82  NAME90  NAME99
NAME100  NAME109  NAME117  NAME125  NAME18  NAME26  NAME34  NAME42  NAME50  NAME59  NAME67  NAME75  NAME83  NAME91  wangge
NAME101  NAME11   NAME118  NAME126  NAME19  NAME27  NAME35  NAME43  NAME51  NAME6   NAME68  NAME76  NAME84  NAME92  zhang-test
NAME102  NAME110  NAME119  NAME127  NAME2   NAME28  NAME36  NAME44  NAME52  NAME60  NAME69  NAME77  NAME85  NAME93
NAME103  NAME111  NAME12   NAME128  NAME20  NAME29  NAME37  NAME45  NAME53  NAME61  NAME7   NAME78  NAME86  NAME94
[02:35:48 root@rocky001[ ~]#

 6. 磁盘存储术语总结: head, track, sector, sylinder.

硬盘存储术语 CHS

head:磁头 磁头数=盘面数
track:磁道 磁道=柱面数
sector:扇区,512bytes
cylinder:柱面 1柱面=512 * sector数/track*head数=512*63*255=7.84M

7. 总结MBR,GPT结构。

MBR和GPT是分区方式

7.1MBR分区

MBR:Master Boot Record,1982年,使用32位表示扇区数,分区不超过2T


划分分区的单位:
  CentOS 5 之前按整柱面划分
  CentOS 6 版本后可以按Sector划分


0磁道0扇区:512bytes
  446bytes: boot loader 启动相关
  64bytes:分区表,其中每16bytes标识一个分区
  2bytes: 55AA,标识位


MBR分区中一块硬盘最多有4个主分区,也可以3主分区+1扩展(N个逻辑分区)
MBR分区:主和扩展分区对应的1--4,/dev/sda3,逻辑分区从5开始,/dev/sda5


7.1.1MBR分区结构

硬盘主引导记录MBR由4个部分组成

 主引导程序(偏移地址0000H--0088H),它负责从活动分区中装载,并运行系统引导程序
出错信息数据区,偏移地址0089H--00E1H为出错信息,00E2H--01BDH全为0字节
分区表(DPT,Disk Partition Table)含4个分区项,偏移地址01BEH--01FDH,每个分区表项长16个
字节,共64字节为分区项1、分区项2、分区项3、分区项4
结束标志字,偏移地址01FE--01FF的2个字节值为结束标志55AA

7.1.2MBR中DPT结构

7.2GPT分区

  GPT:GUID(Globals Unique Identifiers) partition table 支持128个分区,使用64位,支持8Z(
512Byte/block )64Z ( 4096Byte/block)
  使用128位UUID(Universally Unique Identifier) 表示磁盘和分区 GPT分区表自动备份在头和尾两份,并有CRC校验位
  UEFI (Unified Extensible Firmware Interface 统一可扩展固件接口)硬件支持GPT,使得操作系统可以启动

GPT分区结构

 GPT分区结构分为4个区域:
    GPT头
    分区表
    GPT分区
    备份区域

 8. 总结学过的分区,文件系统管理,SWAP管理相关的命令及选项,示例
fdisk, parted, mkfs, tune2fs, xfs_info, fsck, mount, umount, swapon, swapoff

8.1管理分区

列出块设备

lsblk

 创建分区命令

fdisk 管理MBR分区
gdisk 管理GPT分区
parted 高级分区操作,可以是交互或非交互方式

 8.1.1parted 命令

注意:parted的操作都是实时生效的,小心使用
格式:

parted [选项]... [设备 [命令 [参数]...]...]

 范例:

parted /dev/sdb mklabel gpt|msdos
parted /dev/sdb print
parted /dev/sdb mkpart primary 1 200 (默认M)
parted /dev/sdb rm 1
parted -l 列出所有硬盘分区信息

8.1.2 fdisk和gdisk

格式:

fdisk -l [-u] [device] 查看分区

fdisk  [device...] 管理MBR分区

gdisk [device...] 类fdisk 的GPT分区工具

 子命令:

p 分区列表
t 更改分区类型
n 创建新分区
d 删除分区
v 校验分区
u 转换单位
w 保存并退出
q 不保存并退出

 查看内核是否已经识别新的分区

cat /proc/partitions

 RHLinux enterprise 8系列的同步分区表

partprobe

 范例:

[07:47:03 root@rocky001[ ~]#lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0          11:0    1 10.5G  0 rom  
nvme0n1     259:0    0  200G  0 disk
├─nvme0n1p1 259:1    0    1G  0 part /boot
└─nvme0n1p2 259:2    0  199G  0 part
  ├─rl-root 253:0    0   70G  0 lvm  /
  ├─rl-swap 253:1    0    2G  0 lvm  [SWAP]
  └─rl-home 253:2    0  127G  0 lvm  /home
nvme0n2     259:3    0   20G  0 disk
[07:47:06 root@rocky001[ ~]#fdisl /dev/nvme0n2
bash: fdisl: 未找到命令...
[07:47:30 root@rocky001[ ~]#fdisk /dev/nvme0n2

欢迎使用 fdisk (util-linux 2.32.1)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

设备不包含可识别的分区表。
创建了一个磁盘标识符为 0x14f7f895 的新 DOS 磁盘标签。

命令(输入 m 获取帮助):n
分区类型
   p   主分区 (0个主分区,0个扩展分区,4空闲)
   e   扩展分区 (逻辑分区容器)
选择 (默认 p):p
分区号 (1-4, 默认  1): 1-2
值超出范围。
分区号 (1-4, 默认  1): 1^H^H^H^H
值超出范围。
分区号 (1-4, 默认  1): 2
第一个扇区 (2048-41943039, 默认 2048): 20480000
上个扇区,+sectors 或 +size{K,M,G,T,P} (20480000-41943039, 默认 41943039): =^H^H^H
上个扇区,+sectors 或 +size{K,M,G,T,P} (20480000-41943039, 默认 41943039): +2G

创建了一个新分区 2,类型为“Linux”,大小为 2 GiB。

命令(输入 m 获取帮助):W
W:未知命令

命令(输入 m 获取帮助):w

分区表已调整。
将调用 ioctl() 来重新读分区表。
正在同步磁盘。

[07:49:05 root@rocky001[ ~]#lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0          11:0    1 10.5G  0 rom  
nvme0n1     259:0    0  200G  0 disk
├─nvme0n1p1 259:1    0    1G  0 part /boot
└─nvme0n1p2 259:2    0  199G  0 part
  ├─rl-root 253:0    0   70G  0 lvm  /
  ├─rl-swap 253:1    0    2G  0 lvm  [SWAP]
  └─rl-home 253:2    0  127G  0 lvm  /home
nvme0n2     259:3    0   20G  0 disk
└─nvme0n2p2 259:4    0    2G  0 part
[07:49:13 root@rocky001[ ~]#

[07:49:13 root@rocky001[ ~]#cat /proc/partitions
major minor  #blocks  name

 259        0  209715200 nvme0n1
 259        1    1048576 nvme0n1p1
 259        2  208665600 nvme0n1p2
 259        3   20971520 nvme0n2
 259        4    2097152 nvme0n2p2
  11        0   10950656 sr0
 253        0   73400320 dm-0
 253        1    2125824 dm-1
 253        2  133136384 dm-

 #删除刚刚的分区

[07:51:11 root@rocky001[ ~]#fdisk /dev/nvme0n2

欢迎使用 fdisk (util-linux 2.32.1)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。


命令(输入 m 获取帮助):d
已选择分区 2
分区 2 已删除。

[07:52:41 root@rocky001[ ~]#lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0          11:0    1 10.5G  0 rom  
nvme0n1     259:0    0  200G  0 disk
├─nvme0n1p1 259:1    0    1G  0 part /boot
└─nvme0n1p2 259:2    0  199G  0 part
  ├─rl-root 253:0    0   70G  0 lvm  /
  ├─rl-swap 253:1    0    2G  0 lvm  [SWAP]
  └─rl-home 253:2    0  127G  0 lvm  /home
nvme0n2     259:3    0   20G  0 disk
[07:52:44 root@rocky001[ ~]#

 8.2文件系统

  文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件结构称为文件管理系统,简称文件系统
从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,安全控制,日志,压缩,加密等
  支持的文件系统:

/lib/modules/`uname -r`/kernel/fs

 8.2.1文件系统类型

Linux 常用文件系统
     ext2:Extended file system 适用于那些分区容量不是太大,更新也不频繁的情况,例如 /boot 分区
     ext3:是 ext2 的改进版本,其支持日志功能,能够帮助系统从非正常关机导致的异常中恢复
     ext4:是 ext 文件系统的最新版。提供了很多新的特性,包括纳秒级时间戳、创建和使用巨型文件(16TB)、最大1EB的文件系统,以及速度的提升
     xfs:SGI,支持最大8EB的文件系统
     swap
     iso9660 光盘
     btrfs(Oracle)
     reiserfs
Windows 常用文件系统
     FAT32
     NTFS
     exFAT
Unix:
     FFS(fast)
     UFS(unix)
     JFS2

常用的文件系统特性:

EXT4:
  EXT4是Linux系统下的日志文件系统,是EXT3文件系统的后继版本
  Ext4的文件系统容量达到1EB,而支持单个文件则达到16TB
  理论上支持无限数量的子目录
  Ext4文件系统使用64位空间记录块数量和 inode数量
  Ext4的多块分配器支持一次调用分配多个数据块
  修复速度更快


XFS:
  根据所记录的日志在很短的时间内迅速恢复磁盘文件内容
  用优化算法,日志记录对整体文件操作影响非常小
  是一个全64-bit的文件系统,最大可以支持8EB的文件系统,而支持单个文件则达到8EB
  能以接近裸设备I/O的性能存储数据

 查看目前支持的文件系统:

cat /proc/filesystems

8.2.2 创建文件系统

8.2.2.1创建文件管理工具
mkfs命令:


(1) mkfs.FS_TYPE /dev/DEVICE
    ext4
    xfs
    btrfs
    vfat
(2) mkfs -t FS_TYPE /dev/DEVICE
    -L 'LABEL' 设定卷标
mke2fs:ext系列文件系统专用管理工具

常用选项:

-t     {ext2|ext3|ext4|xfs} 指定文件系统类型
-b    {1024|2048|4096} 指定块 block 大小
-L    ‘LABEL’ 设置卷标
-j     相当于 -t ext3, mkfs.ext3 = mkfs -t ext3 = mke2fs -j = mke2fs -t ext3
-i     # 为数据空间中每多少个字节创建一个inode;不应该小于block大小
-N    # 指定分区中创建多少个inode
-I     一个inode记录占用的磁盘空间大小,128---4096
-m   # 默认5%,为管理人员预留空间占总空间的百分比
-O   FEATURE[,...] 启用指定特性
-O   ^FEATURE 关闭指定特性

 范例:

[08:03:35 root@rocky001[ ~]#mkfs.ext4 /dev/nvme0n2
mke2fs 1.45.6 (20-Mar-2020)
在 dos 中发现一个 /dev/nvme0n2 分区表
Proceed anyway? (y,N) y
创建含有 5242880 个块(每块 4k)和 1310720 个inode的文件系统
文件系统UUID:f736be8f-b1e5-4bd2-81ee-b48d6cf2b845
超级块的备份存储于下列块:
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
    4096000

正在分配组表: 完成                            
正在写入inode表: 完成                            
创建日志(32768 个块)完成
写入超级块和文件系统账户统计信息: 已完成

[08:05:30 root@rocky001[ ~]#mount /dev/nvme0n2 /root/nvme2
[08:05:35 root@rocky001[ ~]#

 8.2.2.2tune2fs

 重新设定ext系列文件系统可调整的参数值:

-l 查看指定文件系统超级块信息;super block
-L 'LABEL’ 修改卷标
-m # 修预留给管理员的空间百分比
-j 将ext2升级为ext3
-O 文件系统属性启用或禁用, -O ^has_journal
-o 调整文件系统的默认挂载选项,-o ^acl
-U UUID 修改UUID号

 8.2.2.3xfs_info :显示未挂载或已经挂载的xfs文件系统信息

xfs_info mountpoint|devname

 范例:

[06:19:31 root@rocky001[ ~]#blkid
/dev/nvme0n1: PTUUID="6017664c" PTTYPE="dos"
/dev/nvme0n1p1: UUID="0336db91-f0ef-4437-bb0a-b00f1fe03b15" BLOCK_SIZE="512" TYPE="xfs" PARTUUID="6017664c-01"
/dev/nvme0n1p2: UUID="cP7fqk-7bMJ-Ir2d-qoXf-XKCz-icqh-ZEPpX6" TYPE="LVM2_member" PARTUUID="6017664c-02"
/dev/sr0: BLOCK_SIZE="2048" UUID="2022-05-15-21-06-44-00" LABEL="Rocky-8-6-x86_64-dvd" TYPE="iso9660" PTUUID="6b8b4567" PTTYPE="dos"
/dev/mapper/rl-root: UUID="a018885d-63d4-4ded-8a47-10e819a605c3" BLOCK_SIZE="512" TYPE="xfs"
/dev/mapper/rl-swap: UUID="a3188484-177b-46d9-bf2c-9cf98aa44c94" TYPE="swap"
/dev/mapper/rl-home: UUID="af71d84d-4827-4431-85d9-daf1b8395496" BLOCK_SIZE="512" TYPE="xfs"
[06:20:13 root@rocky001[ ~]#xfs_info sr0 UUID="2022-05-15-21-06-44-00"
Usage: xfs_info [-V] [-t mtab] [mountpoint|device|file]
[06:20:58 root@rocky001[ ~]#xfs_info UUID="2022-05-15-21-06-44-00"
/run/media/root/Rocky-8-6-x86_64-dvd: Not on a mounted XFS filesystem.
[06:21:22 root@rocky001[ ~]#xfs_info /dev/nvme0
xfs_info: can't determine device size
[06:23:03 root@rocky001[ ~]#xfs_info /dev/nvme0n1
xfs_info: /dev/nvme0n1 is not a valid XFS filesystem (unexpected SB magic number 0xeb639010)
Use -F to force a read attempt.

[08:16:29 root@rocky001[ ~]#lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0          11:0    1 10.5G  0 rom  
nvme0n1     259:0    0  200G  0 disk
├─nvme0n1p1 259:1    0    1G  0 part /boot
└─nvme0n1p2 259:2    0  199G  0 part
  ├─rl-root 253:0    0   70G  0 lvm  /
  ├─rl-swap 253:1    0    2G  0 lvm  [SWAP]
  └─rl-home 253:2    0  127G  0 lvm  /home
nvme0n2     259:3    0   20G  0 disk /root/nvme2
[08:16:32 root@rocky001[ ~]#df -h
文件系统             容量  已用  可用 已用% 挂载点
devtmpfs             864M     0  864M    0% /dev
tmpfs                893M     0  893M    0% /dev/shm
tmpfs                893M  9.4M  884M    2% /run
tmpfs                893M     0  893M    0% /sys/fs/cgroup
/dev/mapper/rl-root   70G  6.4G   64G   10% /
/dev/mapper/rl-home  127G  939M  126G    1% /home
/dev/nvme0n2          20G   45M   19G    1% /root/nvme2
/dev/nvme0n1p1      1014M  254M  761M   26% /boot
tmpfs                179M   12K  179M    1% /run/user/42
tmpfs                179M     0  179M    0% /run/user/0
[08:16:42 root@rocky001[ ~]#

 8.3文件系统检测和修复

文件系统夹故障常发生于死机或者非正常关机之后,挂载为文件系统标记为“no clean”
注意:一定不要在挂载状态下执行下面命令修复
fsck: File System Chec

fsck.FS_TYPE
fsck -t FS_TYPE

#FS_TYPE 一定要与分区上已经有的文件类型相同

常用选项:

-a 自动修复
-r 交互式修复错误

 e2fsck:ext系列文件专用检测修复工具:

-y 自动回答为yes
-f 强制修复
-p 自动进行安全的修复文件系统问题

xfs_repair :xfs系列文件系统用专用检测修复工具:

-f 修复文件,而设备
-n 只检查
-d 允许修复只读的挂载设备,在单用户下修复 / 时使用,然后立即reboot

 8.4文件系统的挂载

  挂载:将额外文件系统与根文件系统某现存的目录建立起关联关系,进而使得此目录做为其它文件访问入口的行为


  卸载:为解除此关联关系的过程


  把设备关联挂载点:mount Point


  挂载点下原有文件在挂载完成后会被临时隐藏,因此,挂载点目录一般为空
进程正在使用中的设备无法被卸载

8.4.1挂载文件系统 mount

格式:

mount [-fnrsvw] [-t vfstype] [-o options] device mountpoint

 device:指明要挂载的设备
     设备文件:例如:/dev/sda5
     卷标:-L 'LABEL', 例如 -L 'MYDATA'
     UUID: -U 'UUID':例如 -U '0c50523c-43f1-45e7-85c0-a126711d406e'
     伪文件系统名称:proc, sysfs, devtmpfs, configfs
mountpoint:挂载点目录必须事先存在,建议使用空目录


mount 常用命令选项:

-t     fstype 指定要挂载的设备上的文件系统类型,如:ext4,xfs
-r     readonly,只读挂载
-w     read and write, 读写挂载,此为默认设置,可省略
-n     不更新/etc/mtab,mount不可见
-a     自动挂载所有支持自动挂载的设备(定义在了/etc/fstab文件中,且挂载选项中有
auto功能)
-L 'LABEL'     以卷标指定挂载设备
-U 'UUID'     以UUID指定要挂载的设备
-B, --bind     绑定目录到另一个目录上
-o options: (挂载文件系统的选项),多个选项使用逗号分隔
async     异步模式,内存更改时,写入缓存区buffer,过一段时间再写到磁盘中,效率高,但不安全
sync     同步模式,内存更改时,同时写磁盘,安全,但效率低下
atime/noatime     包含目录和文件
diratime/nodiratime     目录的访问时间戳
auto/noauto     是否支持开机自动挂载,是否支持-a选项
exec/noexec     是否支持将文件系统上运行应用程序
dev/nodev     是否支持在此文件系统上使用设备文件
suid/nosuid     是否支持suid和sgid权限
remount     重新挂载
ro/rw     只读、读写
user/nouser    是否允许普通用户挂载此设备,/etc/fstab使用
acl/noacl     启用此文件系统上的acl功能
loop     使用loop设备
_netdev     当网络可用时才对网络资源进行挂载,如:NFS文件系统
defaults    相当于rw, suid, dev, exec, auto, nouser, async

 范例

[08:03:35 root@rocky001[ ~]#mkfs.ext4 /dev/nvme0n2
mke2fs 1.45.6 (20-Mar-2020)
在 dos 中发现一个 /dev/nvme0n2 分区表
Proceed anyway? (y,N) y
创建含有 5242880 个块(每块 4k)和 1310720 个inode的文件系统
文件系统UUID:f736be8f-b1e5-4bd2-81ee-b48d6cf2b845
超级块的备份存储于下列块:
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
    4096000

正在分配组表: 完成                            
正在写入inode表: 完成                            
创建日志(32768 个块)完成
写入超级块和文件系统账户统计信息: 已完成

[08:05:30 root@rocky001[ ~]#mount /dev/nvme0n2 /root/nvme2

[08:08:48 root@rocky001[ ~]#df -h
文件系统             容量  已用  可用 已用% 挂载点
devtmpfs             864M     0  864M    0% /dev
tmpfs                893M     0  893M    0% /dev/shm
tmpfs                893M  9.3M  884M    2% /run
tmpfs                893M     0  893M    0% /sys/fs/cgroup
/dev/mapper/rl-root   70G  6.4G   64G   10% /
/dev/mapper/rl-home  127G  939M  126G    1% /home
/dev/nvme0n1p1      1014M  254M  761M   26% /boot
tmpfs                179M   12K  179M    1% /run/user/42
tmpfs                179M     0  179M    0% /run/user/0
/dev/nvme0n2          20G   45M   19G    1% /root/nvme2
[08:09:12 root@rocky001[ ~]#

挂载规则:


    一个挂载点同一时间只能挂载一个设备


    一个挂载点同一时间挂载了多个设备,只能看到最后一个设备的数据,其它设备上的数据将被隐藏


    一个设备可以同时挂载到多个挂载点


    通常挂载点一般是已存在空的目录


8.4.2卸载文件系统 umount

卸载时:可使用设备,也可以使用挂载点

umount 设备名|挂载点

8.4.3持久挂载

将挂载保存到 /etc/fstab 中可以下次开机时,自动启用挂载
/etc/fstab格式帮助:

man 5 fstab

 每行定义一个要挂载的文件系统,,其中包括共 6 项
                    1. 要挂载的设备或伪文件系统
                              设备文件
                              LABEL:LABEL=""
                              UUID:UUID=""
                              伪文件系统名称:proc, sysfs
                    2.挂载点:必须是事先存在的目录
                    3.  文件系统类型:ext4,xfs,iso9660,nfs,none
                    4. 挂载选项:defaults ,acl,bind

                    5.转储频率:0:不做备份 1:每天转储 2:每隔一天转储
                    6.fsck检查的文件系统的顺序:允许的数字是0 1 2
                    0:不自检 ,1:首先自检;一般只有rootfs才用 2:非rootfs使用
添加新的挂载项,需要执行下面命令生效
 

 mount -a

 范例:

[08:08:48 root@rocky001[ ~]#df -h
文件系统             容量  已用  可用 已用% 挂载点
devtmpfs             864M     0  864M    0% /dev
tmpfs                893M     0  893M    0% /dev/shm
tmpfs                893M  9.3M  884M    2% /run
tmpfs                893M     0  893M    0% /sys/fs/cgroup
/dev/mapper/rl-root   70G  6.4G   64G   10% /
/dev/mapper/rl-home  127G  939M  126G    1% /home
/dev/nvme0n1p1      1014M  254M  761M   26% /boot
tmpfs                179M   12K  179M    1% /run/user/42
tmpfs                179M     0  179M    0% /run/user/0
/dev/nvme0n2          20G   45M   19G    1% /root/nvme2
[08:09:12 root@rocky001[ ~]#cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Wed Feb 21 15:36:28 2024
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/rl-root     /                       xfs     defaults        0 0
UUID=0336db91-f0ef-4437-bb0a-b00f1fe03b15 /boot                   xfs     defaults        0 0
/dev/mapper/rl-home     /home                   xfs     defaults        0 0
/dev/mapper/rl-swap     none                    swap    defaults        0 0
[08:10:51 root@rocky001[ ~]#vim /etc/fstab
[08:15:12 root@rocky001[ ~]#cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Wed Feb 21 15:36:28 2024
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/rl-root     /                       xfs     defaults        0 0
UUID=0336db91-f0ef-4437-bb0a-b00f1fe03b15 /boot                   xfs     defaults        0 0
/dev/mapper/rl-home     /home                   xfs     defaults        0 0
/dev/mapper/rl-swap     none                    swap    defaults        0 0
UUID=f736be8f-b1e5-4bd2-81ee-b48d6cf2b845  /root/nvme2        ext4    defaults    0 0
[08:15:20 root@rocky001[ ~]#reboot

#重启后我们看一下

[08:16:29 root@rocky001[ ~]#lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0          11:0    1 10.5G  0 rom  
nvme0n1     259:0    0  200G  0 disk
├─nvme0n1p1 259:1    0    1G  0 part /boot
└─nvme0n1p2 259:2    0  199G  0 part
  ├─rl-root 253:0    0   70G  0 lvm  /
  ├─rl-swap 253:1    0    2G  0 lvm  [SWAP]
  └─rl-home 253:2    0  127G  0 lvm  /home
nvme0n2     259:3    0   20G  0 disk /root/nvme2
[08:16:32 root@rocky001[ ~]#df -h
文件系统             容量  已用  可用 已用% 挂载点
devtmpfs             864M     0  864M    0% /dev
tmpfs                893M     0  893M    0% /dev/shm
tmpfs                893M  9.4M  884M    2% /run
tmpfs                893M     0  893M    0% /sys/fs/cgroup
/dev/mapper/rl-root   70G  6.4G   64G   10% /
/dev/mapper/rl-home  127G  939M  126G    1% /home
/dev/nvme0n2          20G   45M   19G    1% /root/nvme2
/dev/nvme0n1p1      1014M  254M  761M   26% /boot
tmpfs                179M   12K  179M    1% /run/user/42
tmpfs                179M     0  179M    0% /run/user/0
[08:16:42 root@rocky001[ ~]#

#由此可见我们已经完成了持久挂载。

 8.5处理交换文件和分区

swap 介绍
  swap交换分区是系统RAM的补充,swap 分区支持虚拟内存。当没有足够的 RAM 保存系统处理的数据时会将数据写入 swap 分区,当系统缺乏 swap 空间时,内核会因 RAM 内存耗尽而终止进程。配置过多 swap 空间会造成存储设备处于分配状态但闲置,造成浪费,过多 swap 空间还会掩盖内存泄露
  注意:为优化性能,可以将swap 分布存放,或高性能磁盘存放

Redhat 官方推荐推荐系统 swap 空间

8.5.1交换分区实现过程

1. 创建交换分区或者文件
2. 使用mkswap写入特殊签名
3. 在/etc/fstab文件中添加适当的条目
4. 使用swapon -a 激活交换空间
   启用swap分区:

swapon [OPTION]... [DEVICE]

 选项:

-a #激活所有的交换分区
-p PRIORITY #指定优先级(-1到32767之间),值越大,优先级越高.也可在/etc/fstab文件中的第4列指定:pri=value

 范例:

#先在磁盘建立一个新分区,这个分区不像前面挂载好的分区需要创建文件系统,swap分区不需要,创建好swap的分区空间后直接用mkswap开始设置交换空间。

[08:24:14 root@rocky001[ ~]#mkswap /dev/nvme0n2p2
正在设置交换空间版本 1,大小 = 2 GiB (2147479552  个字节)
无标签,UUID=de3b3435-cd54-4497-b2dd-f6a7e896eb70
[08:25:14 root@rocky001[ ~]#vim /etc/fstab
[08:29:13 root@rocky001[ ~]#cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Wed Feb 21 15:36:28 2024
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/rl-root     /                       xfs     defaults        0 0
UUID=0336db91-f0ef-4437-bb0a-b00f1fe03b15 /boot                   xfs     defaults        0 0
/dev/mapper/rl-home     /home                   xfs     defaults        0 0
/dev/mapper/rl-swap     none                    swap    defaults        0 0
UUID=f736be8f-b1e5-4bd2-81ee-b48d6cf2b845  /root/nvme2        ext4    defaults    0 0
UUID=de3b3435-cd54-4497-b2dd-f6a7e896eb70  swap       swap      defaults     0 0
[08:29:28 root@rocky001[ ~]#

[09:06:56 root@rocky001[ ~]#free -h
              total        used        free      shared  buff/cache   available
Mem:          1.7Gi       644Mi       461Mi        10Mi       679Mi       976Mi
Swap:         4.0Gi          0B       4.0Gi

[09:07:10 root@rocky001[ ~]#swapoff /dev/nvme0n2p2
[09:07:48 root@rocky001[ ~]#free -h
              total        used        free      shared  buff/cache   available
Mem:          1.7Gi       643Mi       465Mi        10Mi       677Mi       978Mi
Swap:         2.0Gi          0B       2.0Gi

[09:29:31 root@rocky001[ ~]#lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0          11:0    1 10.5G  0 rom  
nvme0n1     259:0    0  200G  0 disk
├─nvme0n1p1 259:1    0    1G  0 part /boot
└─nvme0n1p2 259:2    0  199G  0 part
  ├─rl-root 253:0    0   70G  0 lvm  /
  ├─rl-swap 253:1    0    2G  0 lvm  [SWAP]
  └─rl-home 253:2    0  127G  0 lvm  /home
nvme0n2     259:3    0   20G  0 disk
├─nvme0n2p1 259:6    0   10G  0 part /root/nvme2
└─nvme0n2p2 259:7    0    2G  0 part [SWAP]
[09:29:36 root@rocky001[ ~]#

 8.5.2禁用swap分区:

swapoff [OPTION]... [DEVICE]

 8.5.3swap优先级

  可以指定swap分区0到32767的优先级,值越大优先级越高
  如果用户没有指定,那么核心会自动给swap指定一个优先级,这个优先级从-1开始,每加入一个新的
  没有用户指定优先级的swap,会给这个优先级减一
  先添加的swap的缺省优先级比较高,除非用户自己指定一个优先级,而用户指定的优先级(是正数)永远高于核心缺省指定的优先级(是负数)

 8.5.4swap使用策略

/proc/sys/vm/swappiness 的值决定了当内存占用达到一定的百分比时,会启用swap分区的空间
使用规则:

  当内存使用率达到100-swappiness时,会启用交换分区
  简单地说这个参数定义了系统对swap的使用倾向,此值越大表示越倾向于使用swap。
  可以设为0,这样做并不会禁止对swap的使用,只是最大限度地降低了使用swap的可能性

  • 35
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值