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 0lo: 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 0virbr0: 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
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
avb1234
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 [OPTIONS] PATTERN [FILE...]
常见选项:
--color=auto 对匹配到的文本着色显示
-v 显示不被pattern匹配到的行,即不显示匹配到的行,取反。
-m # 匹配#次后停止-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就避免了这种情况,一行一行的处理,打开速度非常快,执行速度也很快。
工作原理图:
帮助:
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
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 name259 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的可能性