一、. 总结学过的文本处理工具,文件查找工具,文本处理三剑客, 文本格式化命令(printf)的相关命令及选项,示例。
第一部分:文本处理工具
1.cat:查看一个文件的内容并将其显示在屏幕上,cat后面可以不加选项,也可以加选项,如:-n(对显示出的每一行进行编号);-A(显示所有控制符);-b(非空行编号);-s(压缩连续的空行成一行);-E(显示行结束符$)
例:
[root@Rocky8 data]# echo '213123123' > test1.txt
[root@Rocky8 data]# echo '334324324' >> test1.txt
[root@Rocky8 data]# cat test1.txt
213123123
334324324
[root@Rocky8 data]# cat -n test1.txt
1 213123123
2 334324324
[root@Rocky8 data]# echo "" >> test1.txt
[root@Rocky8 data]# echo "" >> test1.txt
[root@Rocky8 data]# echo "" >> test1.txt
[root@Rocky8 data]# cat -n test1.txt
1 213123123
2 334324324
3
4
5
[root@Rocky8 data]# echo "13213213" >> test1.txt
[root@Rocky8 data]# cat test1.txt
213123123
334324324
13213213
[root@Rocky8 data]# cat -sn test1.txt
1 213123123
2 334324324
3
4 13213213
2.tac:和命令cat一样,文件内容显示在屏幕上,只是先显示最后一行,然后显示倒数第二行,最后是第一行。但是tac好像不支持cat那些选项
例:
[root@Rocky8 data]# tac test1.txt
13213213
334324324
213123123
3.more:如果文件内容太多,cat看不了前面的文件内容,可以使用More命令查看文件,空格继续下一屏,Ctrl+b向上翻屏,Ctrl+F向下翻屏,Q键退出
4.less:作用和more差不多,比More功能强大些,安/然后输入一个字符串,回车,可以搜索这个字符串在文章中,N显示下一个。?也可以接字符串搜索,是从当前行向上搜索
5.head:用于显示文件的前10行内容。-n(代表显示文件的前几行,如果是-n 后是负数,表示从文件头取到倒数第负数位置前,)-c #(指定获取前#字节
例:
[root@Rocky8 data]# head -n 3 /etc/passwd
alt: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
6.tail:和head 类似,显示文件最后10行;-f选项常用,可以动态显示文件的最后10行。比如tail -f /var/log/messages可以动态实时查看文件中的内容。
例:
[root@Rocky8 data]# tail -n3 /etc/passwd
apache:x:48:1003:apache:/var/www:/sbin/nologin
mage:x:1002:1004::/home/mage:/bin/bash
www:x:1003:1005::/home/www:/bin/bash
7.nl:显示行号,相当于cat -b
[root@Rocky8 data]# nl test1.txt
1 213123123
2 334324324
3 13213213
8.rev:将同一行的内容逆向显示
[root@Rocky8 data]# rev test1.txt
321321312
423423433
31231231
9.hexdump:查看非文本文件内容
例:
[root@Rocky8 data]# hexdump test1.txt
0000000 3132 3133 3332 3231 0a33 3333 3334 3432
0000010 3233 0a34 0a0a 310a 3233 3331 3132 0a33
0000020
10.cut:可以提取文本文件或STDIN数据的指定列。常用选项-d(指定分隔符,默认tab);-f #(第#个字段,例如:2)。#,#[,#]:离散的多个字段,例如1,3,6。#-#连续的多个字段,例如1-6。还可以混合使用,1-3,7;-c 按字符切割;--output-delimiter=STRING指定输出分隔符
例:
[root@Rocky8 data]# head -n 3 /etc/passwd | cut -d: -f1,3-4,7
alt:7:0:/sbin/halt
mail:8:12:/sbin/nologin
operator:11:0:/sbin/nologin
[root@Rocky8 data]# ifconfig ens160 | head -n2|tail -n1| tr -s " "|cut -d " " -f3
10.0.0.151
11.paste:合并多个文件同行号的列到一行 -d 分隔符:指定分隔符,默认用TAB;-s 所有行合成一行显示
例:
[root@Rocky8 data]# paste -d":" alpha.log seq.log
a:1
b:2
c:3
d:4
e:5
f:
g:
h:
[root@Rocky8 data]# paste -d":" -s alpha.log seq.log
a:b:c:d:e:f:g:h:
1:2:3:4:5:
12.wc:用于统计文件的行总数、单词数、字节总数和字符总数。可以对文件或STDIN中的数据统计。常用选项,-l(只计数行数);-w(只计数单词总数);-c(只计数字节总数);-m(只计数字符总数);-L(显示文件中最长行的长度)
例:
[root@Rocky8 data]# wc title.txt
3 6 30 title.txt
[root@Rocky8 data]# wc -l title.txt
3 title.txt
13.sort:文本排序,不改变原始文件。常用选项-r(执行反方向“由上至下”整理);-R随机排序;-n(执行按数字大小整理);-h(人类刻度排序,如:2K,1G);-f(忽略字符串中的字符大小写);-u(unique,合并重复项,即去重);-t c (选项使用c作为字段定界符);-k # (选项按照使用C字符分割的#列来整理能够使用多次)
例:
[root@Rocky8 data]# cut -d: -f1,3 /etc/passwd|sort -t: -k2 -nr | head -n3
nobody:65534
www:1003
mage:1002
[root@Rocky8 data]# cut -d" " -f 1 access_log | sort -u | wc -l
201
14.diff:比较两个文件之间的区别,没搞明白,忘了怎么回事了
15.patch:复制在其他文件中进行的改变。-b(选项来自动备份改变了的文件),忘了怎么用了
16.uniq:命令从输入中删除前后相接的重复行。常见选项,-c(显示每行重复出现的次数);-d(仅显示重复过的行);-u(仅显示不曾重复的行)
例:[root@Rocky8 data]# cut -d" " -f1 access_log | sort | uniq -c | sort -nr | head -n3
4870 172.20.116.228
3429 172.20.116.208
2834 172.20.0.222
17.cmp:查看二进制文件的不同
第二部分:文件查找工具
(1)which命令:用来查找在PATH环境便令中出现的路径下的可执行文件,绝对路径。
root@ubuntu2023:~# which vi
/usr/bin/vi
root@ubuntu2023:~# which cat
/usr/bin/cat
(2)whereis命令:通过预先生成的一个文件列表库查找与给出的文件名相关的文件。-b(只查找二进制文件);-m(只查找帮助文件,man目录下的文件);-s(只查找源代码文件)
root@ubuntu2023:~# whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz
(3)locate:类似于whereis,需要安装mlocate才能用locate和updatedb命令,locate查询系统上预建的文件搜索数据库/var/lib/mlocate/mlocate.db,可用updatedb更新数据库,构建索引比较耗费资源。-i(不全邠大小写搜索);-n N(只列巨额前N个匹配目录)-r(使用基本正则表达式)
root@ubuntu2023:~# locate -n 3 conf
/boot/config-5.15.0-88-generic
/boot/config-5.15.0-89-generic
/boot/grub/i386-pc/configfile.mod
文件新创建和删除,无法马上更新Locate数据库
[root@Rocky8 data]# touch test11.log
[root@Rocky8 data]# locate test11.log
[root@Rocky8 data]# updatedb
[root@Rocky8 data]# locate test11.log
/data/test11.log
[root@Rocky8 data]# rm -f test11.log
[root@Rocky8 data]# locate test11.log
/data/test11.log
(4)find命令:是实时查找工具,通过遍历指定路径完成文件查找
工具特点:
查找速度略慢、精确查找、实时查找、查找条件丰富、可能只搜索用户具备读取和执行权限的目录
find【option】 ... 【查找路径】【查找条件】【处理动作】
查找路径:指定具体目标路径;默认为当前目录
查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准;默认为支出指定路径下的所有文件
处理动作:对符合条件的文件做操作,默认输出至屏幕
使用方法如下:
1.指定搜索目录层级
-maxdepth level 最大搜索目录深度,指定目录下的文件为第一级
-mindepth level 最小搜索目录深度
[root@Rocky8 data]# find /etc/ -maxdepth 2
2.根据文件名和inode查找
-name “文件名称”(支持使用glob:如*,?,[],【^】,通配符要加双引号引起来)
-iname “文件名称”(不区分字母大小写)
-inum n (按inode号查找)
-links n (连接数为n的文件)
[root@Rocky8 data]# find -name snow.png
./snow.png
[root@Rocky8 data]# find -iname SNOW.PNG
./snow.png
3.根据属主,属组查找
-user USERNAME 查找属主为指定用户的文件
-group GRPNAME 超找属组为指定组的文件
-uid UserID 查找属主为指定UID号的文件
-gid GroupID 查找属组为指定GID号的文件
-nouser 查找没有属主的文件
-nogroup 查找没有属组的文件
[root@Rocky8 home]# find /home/ -user wang
/home/wang
/home/wang/.mozilla
4.根据文件类型查找
-type TYPE TYPE可以是以下形式:
f:普通文件;d:目录文件;l:符号链接文件;s:套接字文件;b:块设备文件;c:字符设备文件;p:管道文件
[root@Rocky8 ~]# find /data/ -type d -ls
135235301 4 drwxr-xr-x 3 wang admins 4096 Dec 23 13:52 /data/
5.空文件或目录
-empty
[root@Rocky8 ~]# find /etc/ -type d -empty
6.组合条件
与:-a,默认多个条件是与关系,所以可以省略-a
或:-o
非:-not !
[root@Rocky8 ~]# find /etc/ -type d -o -type l | wc -l
653
7.排除目录
#查找/etc/下,除/etc/security目录的其他所有.conf后缀的文件
[root@Rocky8 ~]# find /etc/ -path '/etc/security' -a -prune -o -name "*.conf"
[root@Rocky8 ~]# find /etc/ \( -path "etc/security" -o -path "etc/systemd" -o -path "/etc/dbus-1" \) -a -prune -o -name "*.conf"
8.根据文件大小来查找
-size [+|-] #UNIT :常用单位,K,M,G,c(byte),注意大小写敏感
#UNIT: #表示(#-1, #],如:6k 表示(5k,6k]
-#UNIT #表示[0,#-1],如:-6k 表示[0,5k]
+#UNIT #表示(#,∞),如:+6k 表示(6k,∞)
[root@Rocky8 ~]# find / -size +10G
/proc/kcore
9.根据时间戳查找
以天为单位
-atime [+|-] #
# #表示【#,#+1】
+# #表示【#+1,正无穷】
-# #表示【0,#】
-mtime
-ctime
以分钟为单位
-amin
-mmin
-cmin
10.根据权限查找
-perm [/|-] MODE
MODE精确权限匹配;/MODE 任何一类对象的权限中只要有一位匹配即可
-MODE 每一类对象都必须同时拥有指定权限,与关系
11.处理动作
-print :默认的处理动作,显示至屏幕
-ls : 类似于对查找到的文件执行 “ls -dils”命令格式输出
-fls file :找到的所有文件的长格式信息保存到指定文件中,相当于ls >file
-delete :删除查找到的文件,慎用!!
-ok COMMAND {} \ : 对查找到的每个文件执行由COMMAND指定的命令,每个文件执行之前,都会交互式用户确认
-exec COMMAND {} \ : 对查找到的每个文件执行由COMMAND指定的命令
{}:用于引用查找到的文件名自身
[root@Rocky8 ~]# find -name "*.conf" -exec cp {} {}.orig \;
第三部分.文本处理三剑客
(1)grep 命令
作用:文本搜索工具、根据用户指定的模式对目标文本逐行进行匹配检查;打印匹配到的行
格式:grep [options] pattern [file...]
常用选项:
--color=auto 对匹配到的文本着色显示
-m # 匹配#次后停止
-v 显示不被 pattern
-i 忽略字符大小写
-n 显示匹配的行号
-c统计匹配的行数
-o 仅显示匹配到的字符串
-q 静默模式,不输出任何信息
-A -B -C # after,后#行,berfore,前#行,context,前后各#行
-e 实现多个选项间逻辑Or关系,如:grep -e 'cat' -e 'dog' file
-w 匹配整个单词
-E 使用ERE,相当于egrep
-r 递归目录,但不处理软连接
-R递归目录,但处理软连接
-f 取出第二个文件中有第一个文件的行
例:
[root@Rocky8 ~]# grep `whoami` /etc/passwd
operator:x:11:0:operator:/root:/sbin/nologin
例:
[root@Rocky8 ~]# grep -c processor /proc/cpuinfo
2
例:
[root@Rocky8 data]# grep -f /data/f1.txt /data/f2.txt
b
c
1
例:分区利用率最大的值
[root@Rocky8 data]# df | grep '^/dev/sd' | tr -s ' ' % | cut -d% -f5 | sort -n| tail -1
29
[root@Rocky8 data]# df | grep '^/dev/sd' | grep -oE '\<[0-9]{,3}%'| tr -d % | sort -nr |head -n1
29
[root@Rocky8 data]# df | grep '^/dev/sd' |grep -oE '\<[0-9]{,3}%' | grep -oE '[0-9]+' | sort -nr | head -n1
29
例:哪个IP和当前主机连接数最多的前3位
[root@Rocky8 data]# ss -nt | grep "^ESTAB" | tr -s ' ' :| cut -d: -f6|sort| uniq -c | sort -nr | head -n3
例:连接状态统计:
[root@Rocky8 data]# ss -nta | grep -v '^sTATE'| cut -d " " -f1|sort -nr| uniq -c| sort
例:
[root@Rocky8 data]# grep -o 'r..t' /etc/passwd
root
r/ft
rypt
例:
[root@Rocky8 data]# ifconfig ens160 | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' | head -1
10.0.0.151
例:
[root@Rocky8 data]# grep -oE '[0-9]+' /data/age.txt | paste -s -d+ |bc
60
(2)sed命令:是行编辑器,从文件或管道中读取一行,处理一行,再读取一行,再处理一行,再输出一行,直到最后一行。
基本用法,格式:sed [option] 'script;script;...' [inputfile...]
常用选项:
-n 不输出模式空间内容到屏幕,即不自动打印
-e 多点编辑
-f FILE 从指定文件中读取编辑脚本
-r -E,使用扩展正则表达式
-i.bak 备份文件并原处编辑
-s 将多个文件视为独立文件,而不是单个连续的长文件流
SCRIPT格式:
‘地址命令’
1.不给地址,对全文进行处理
2.单地址,#:指定的行,$:最后一行
3.地址范围,#,# 从第几行到第几行 3,6 从第三行到第六行
#,+# 从第#行到+#行,3,+4 从第三行到第七行
4.步进:~ 1~2 奇数行 2~2 偶数行
命令:
p 打印当前模式空间内容,追加到默认输出之后
Ip 忽略大小写输出
d 删除模式空间匹配的行,并立即启用下一轮循环
w file 保存模式匹配的行到指定文件
r file 读取指定文件的文本至模式空间中匹配到的行后
= 为模式空间中的行打印行号
!模式空间中匹配行取反操作
q 结束或退出sed
查找替换:
s/pattern/string/修饰符
例:
[root@Rocky8 ~]# sed -n '1p' /etc/passwd
alt:x:7:0:halt:/sbin:/sbin/halt
例:
[root@Rocky8 ~]# ifconfig ens160 | sed -n '2p'
inet 10.0.0.151 netmask 255.255.255.0 broadcast 10.0.0.255
[root@Rocky8 ~]# sed -n '$p' /etc/passwd
joe:x:1004:1006::/home/joe:/bin/bash
[root@Rocky8 ~]# sed -n "$[$(cat /etc/passwd | wc -l)-1]p " /etc/passwd
www:x:1003:1005::/home/www:/bin/bash
[root@Rocky8 ~]# ifconfig ens160 | sed -n '/netmask/p'
inet 10.0.0.151 netmask 255.255.255.0 broadcast 10.0.0.255
[root@Rocky8 ~]# ifconfig ens160 | sed -n '/errors/p'
RX errors 0 dropped 0 overruns 0 frame 0
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@Rocky8 ~]# df | sed -n '\/dev\/sd/p'
/dev/sda1 1038336 298384 739952 29% /boot
/dev/sdc 10218772 24 9678076 1% /logs
[root@Rocky8 ~]# seq 10 | sed -n '3,6p'
3
4
5
6
[root@Rocky8 ~]# seq 10 | sed -n '3,+4p'
3
4
5
6
7
[root@Rocky8 ~]# sed '/^#/d;/^$/d' /etc/httpd/conf/httpd.conf
例:
[root@Rocky8 data]# df |sed -En '/^\/dev\/sd/s@.* ([0-9]+)%.*@\1@p'
29
1
例:
[root@Rocky8 data]# sed -n 's/root/&superman/p' /etc/passwd
operator:x:11:0:operator:/rootsuperman:/sbin/nologin
[root@Rocky8 data]# sed -n 's/root/superman&/p' /etc/passwd
operator:x:11:0:operator:/supermanroot:/sbin/nologin
(3)AWK:报告生成器,格式化文本输出,模式扫描和处理语言,可以实现下面功能:
1.文本处理、2.输出格式化的文本报表 、3.执行算数运算、4.执行字符串操作
第一题第四部分:Printf 格式化输出
格式:printf "指定的格式" "文本1" "文本2".........
常用格式替换符
%s 字符串
%d %i 十进制整数
%f 浮点格式
%c ASCII字符,即显示对应参数的第一个字符
说明:
%#s 中的数字代表此替换符中的输出字符串宽度,不足补空格,默认是右对齐,%-10s 表示10个字符宽,-表示左对齐
%03d 表示3位宽度,不足前面用0补全,超出位数原样输出
%.2f 中的2表示小数点后显示的小数位数
常用转义字符
\a 警告字符,通常为ASCII的BEL字符
\b后退
\f换页
\n 换行
\r 回车
\t 水平制表符
\v 垂直制表符
\ \本身
例:
1234[root@Rocky8 ~]# printf "%s" 1 2 3 4
1234[root@Rocky8 ~]# printf "%d" 1 2 3 4
1234[root@Rocky8 ~]# printf "%s\n" 1 2 3 4
1
2
3
4
[root@Rocky8 ~]# printf "%f\n" 1 2 3 4
1.000000
2.000000
3.000000
4.000000
[root@Rocky8 ~]# printf "%.2f\n" 1 2 3 4
1.00
2.00
3.00
4.00
[root@Rocky8 ~]# printf "(%s)" 1 2 3 4 ;echo
(1)(2)(3)(4)
[root@Rocky8 ~]# printf "%-10s %-10s %-4s %s \n" 姓名 性别 年龄 体重 小明 男 20 70 小红 女 18 50
姓名 性别 年龄 体重
小明 男 20 70
小红 女 18 50
welcomtomagedu[root@Rocky8 ~]# VAR="welcom to magedu";printf "\033[1;32m%s\033[0m\n" $VAR
welcom
to
magedu
[root@Rocky8 ~]# VAR="welcom to magedu";printf "\033[1;32m%s\033[0m\n" "$VAR"
welcom to magedu
2. 总结文本处理的grep命令相关的基本正则和扩展正则表达式。
例:
[root@Rocky8 ~]# grep `whoami` /etc/passwd
operator:x:11:0:operator:/root:/sbin/nologin
例:
[root@Rocky8 ~]# grep -c processor /proc/cpuinfo
2
例:
[root@Rocky8 data]# grep -f /data/f1.txt /data/f2.txt
b
c
1
例:分区利用率最大的值
[root@Rocky8 data]# df | grep '^/dev/sd' | tr -s ' ' % | cut -d% -f5 | sort -n| tail -1
29
[root@Rocky8 data]# df | grep '^/dev/sd' | grep -oE '\<[0-9]{,3}%'| tr -d % | sort -nr |head -n1
29
[root@Rocky8 data]# df | grep '^/dev/sd' |grep -oE '\<[0-9]{,3}%' | grep -oE '[0-9]+' | sort -nr | head -n1
29
例:哪个IP和当前主机连接数最多的前3位
[root@Rocky8 data]# ss -nt | grep "^ESTAB" | tr -s ' ' :| cut -d: -f6|sort| uniq -c | sort -nr | head -n3
例:连接状态统计:
[root@Rocky8 data]# ss -nta | grep -v '^sTATE'| cut -d " " -f1|sort -nr| uniq -c| sort
例:
[root@Rocky8 data]# grep -o 'r..t' /etc/passwd
root
r/ft
rypt
例:
[root@Rocky8 data]# ifconfig ens160 | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' | head -1
10.0.0.151
例:
[root@Rocky8 data]# grep -oE '[0-9]+' /data/age.txt | paste -s -d+ |bc
60
3. 总结变量命名规则,不同类型变量(环境变量,位置变量,只读变量,局部变量,状态变量)如何使用。
变量:变量表示命名的内存空间,将数据放在内存空间中,通过变量名引用,获取数据
命名要求:
(1)区分大小写
(2)不能使用程序中的保留字和内置变量:如if ,for
(3)只能使用数字、字母及下划线,且不能以数字开头,不支持短横线-,和主机名相反
命名习惯:
见名知意,用英文单词命名,体现出实际作用,不要用简写,如ATM
变量名大写
局部变量小写
函数名小写
大驼峰/小驼峰
下划线
变量定义和引用
普通变量:生效范围为当前shell进程,对当前shell之外的其他shell进程,包括当前shell的子shell进程均无效
环境变量:生效范围为当前shell进程及其子进程
本地变量:生效范围为当前shell进程中某代码片段,通常指函数
变量赋值:
name='value'
value可以是以下多种形式
直接字符串:name='root'
变量引用:name="$USER"
命令引用: name=`COMMAND` 或者 name=$(COMMAND)
例:
[root@Rocky8 ~]# TITLE='cto'
[root@Rocky8 ~]# echo $TITLE
cto
[root@Rocky8 ~]# echo i am $TITLE
i am cto
[root@Rocky8 ~]# echo "i am $TITLE"
i am cto
[root@Rocky8 ~]# echo 'i am $TITLE'
i am $TITLE
[root@Rocky8 ~]# NAME=$USER
[root@Rocky8 ~]# echo $NAME
root
[root@Rocky8 ~]# USER=`whoami`
[root@Rocky8 ~]# echo $USER
root
[root@Rocky8 ~]# TITLE=CTO
[root@Rocky8 ~]# TITLE+=:wang
[root@Rocky8 ~]# echo $TITLE
CTO:wang
[root@Rocky8 ~]# bash systeminfo.sh
----------------------------Host systeminfo-------------------------
HOSTNAME: Rocky8.zhou.org
IPADDR: 10.0.0.151
OSVERSION: Rocky Linux 9.2 (Blue Onyx)
KERNEL: 5.14.0-284.11.1.el9_2.x86_64
CPU: Intel(R) Core(TM) i7-4770K CPU @ 3.50GHz
MEMORY: 1.7Gi
DISK: 200G
-------------------------------------------------------------------
[root@Rocky8 ~]#
环境变量:
可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量
一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程
一般只在系统配置文件中使用,在脚本中较少使用
声明并赋值:
export name =VALUE
declare -x name =VALUE
或者分两步实现
name=VALUE
export name
变量引用:
$name
${name}
显示所有环境变量:
env printenv export declare -x
查看指定进程的环境变量
[root@Rocky8 ~]# cat /proc/2186/environ
bash 内建环境变量
PATH SHELL USER UID HOME PWD SHLVL LANG MAIL HOSTNAME HISTSIZE _
例:
[root@Rocky8 ~]# cat /proc/2186/environ |tr '\0' '\n'
只读变量:只能声明定义,但后续不能修改和删除,即常量
声明只读变量:
readonly name
declare -r name
查看只读变量:
readonly [-p]
declare -r
位置变量:在bash shell中内置的变量,在脚本代码中调用通过命令行传递给脚本的参数
$1,$2,....对应第一个,第二个参数
$0 命令本身,包括路径
$* 传递给脚本的所有参数,全部参数合为一个字符串
$@ 传递给脚本的所有参数,每个参数为独立字符串
$# 传递给脚本的参数个数
清空所有位置变量
set --
例:
[root@Rocky8 ~]# bash arg.sh {a..z}
1st arg is a
2st arg is b
3st arg is c
10st arg is j
11st arg is k
the number of arg is 26
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 scriptname is arg.sh
4. 通过shell编程完成,30鸡和兔的头,80鸡和兔的脚,分别有几只鸡,几只兔?
[root@Rocky8 ~]# bash chook_rabbit.sh 30 80
RABBIT:10
CHOOK:20
[root@Rocky8 ~]# cat chook_rabbit.sh
#!/bin/bash
HEAD=$1
FOOT=$2
RABBIT=$(((FOOT-HEAD-HEAD)/2))
CHOOK=$[HEAD-RABBIT]
echo RABBIT:$RABBIT
echo CHOOK:$CHOOK
5. 结合编程的for循环,条件测试,条件组合,完成批量创建100个用户,
1)for遍历1..100
2)先id判断是否存在
3)用户存在则说明存在,用户不存在则添加用户并说明已添加。
[root@Rocky8 ~]# bash user.sh
user1 is created
user2 is created
user3 is created
[root@Rocky8 ~]# cat user.sh
#!/bin/bash
for i in {1..100};do
id user$i &> /dev/null && echo user$i is exist || { useradd user$i ; echo user$i is created; }
done
6. 磁盘存储术语总结: head, track, sector, sylinder.
head:磁头,一个盘面对应一个磁头
track:磁道,盘面上每一圈就是一个磁道
sector:扇区,把每个磁道按512bytes大小再进行划分,就是扇区,每个磁道上的扇区数量是不一样的
cylinder:柱面,磁头移动的时候,是一起移动的,如果是6个盘面,则6个磁头对应的磁道是一致的,这就是柱面
7. 总结MBR,GPT结构。
MBR:1982年,使用32位表示扇区数,分区不超过2T
划分分区的单位:
CentOS 5 之前按柱面划分
CentOS 6 版本后可以按sector划分
MBR分区中一块硬盘最多有4个主分区,也可以3主分区+1扩展(N个逻辑分区)
MBR分区:主和扩展分区对应1--4 ,/dev/sda3 ,逻辑分区从5开始,/dev/sda5
GPT分区
GPT:支持128个分区,使用64位,支持8Z 64Z
使用128位UUID表示磁盘和分区,GPT分区表自动备份在头和尾两份,并有CRC校验位
UEFI硬件支持GPT,使得操作系统可以启动
8. 总结学过的分区,文件系统管理,SWAP管理相关的命令及选项,示例
fdisk, parted, mkfs, tune2fs, xfs_info, fsck, mount, umount, swapon, swapoff
fdisk,
root@ubuntu2023:~# fdisk -l /dev/sda
Disk /dev/sda: 200 GiB, 214748364800 bytes, 419430400 sectors
Disk model: VMware Virtual S
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 8F752F8A-7F5E-4C8A-A493-B928C4BD5054
Device Start End Sectors Size Type
/dev/sda1 2048 4095 2048 1M BIOS boot
/dev/sda2 4096 4198399 4194304 2G Linux filesystem
/dev/sda3 4198400 419428351 415229952 198G Linux filesystem
parted,
root@ubuntu2023:~# parted -l
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sda: 215GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 2097kB 1049kB bios_grub
2 2097kB 2150MB 2147MB ext4
3 2150MB 215GB 213GB
Model: Linux device-mapper (linear) (dm)
Disk /dev/mapper/ubuntu--vg-ubuntu--lv: 106GB
Sector size (logical/physical): 512B/512B
Partition Table: loop
Disk Flags:
Number Start End Size File system Flags
1 0.00B 106GB 106GB ext4
mkfs,
[root@Rocky8 ~]# mkfs.ext4 /dev/sdb
mke2fs 1.46.5 (30-Dec-2021)
Creating filesystem with 5242880 4k blocks and 1310720 inodes
Filesystem UUID: c0571ef3-c9f6-4771-8d1a-37c4d0a27d69
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
tune2fs,
[root@Rocky8 ~]# tune2fs -l /dev/sdc
tune2fs 1.46.5 (30-Dec-2021)
Filesystem volume name: <none>
Last mounted on: <not available>
Filesystem UUID: bebb2205-e47e-48f8-97b2-d35d1926cd1b
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
xfs_info,
root@ubuntu2023:~# xfs_info /dev/sda
xfs_info: /dev/sda is not a valid XFS filesystem (unexpected SB magic number 0xeb639000)
Use -F to force a read attempt.
fsck,
[root@Rocky8 ~]# fsck -a
fsck from util-linux 2.37.4
mount,
[root@Rocky8 ~]# mkdir /sdb
[root@Rocky8 ~]# mount /dev/sdb /sdb
[root@Rocky8 ~]# lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sdb 8:16 0 20G 0 disk /sdb
[root@Rocky8 ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 4096 0 4096 0% /dev
tmpfs 896416 0 896416 0% /dev/shm
tmpfs 358568 8656 349912 3% /run
/dev/mapper/rl-root 73364480 6213652 67150828 9% /
/dev/mapper/rl-home 133075472 967136 132108336 1% /home
/dev/sda1 1038336 298384 739952 29% /boot
/dev/sdc 10218772 24 9678076 1% /logs
tmpfs 179280 52 179228 1% /run/user/42
tmpfs 179280 36 179244 1% /run/user/0
/dev/sdb 20466256 24 19401272 1% /sdb
[root@Rocky8 ~]# lsblk /dev/sdb -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
sdb ext4 1.0 c0571ef3-c9f6-4771-8d1a-37c4d0a27d69 18.5G 0% /sdb
[root@Rocky8 ~]#
umount,
[root@Rocky8 ~]# lsblk /dev/sdb -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
sdb ext4 1.0 c0571ef3-c9f6-4771-8d1a-37c4d0a27d69 18.5G 0% /sdb
[root@Rocky8 ~]# umount /dev/sdb
[root@Rocky8 ~]# lsblk /dev/sdb -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
sdb ext4 1.0 c0571ef3-c9f6-4771-8d1a-37c4d0a27d69
swapon,
swapoff
swapoff [options] []#常用选项-a|--all #禁用 /proc/swaps 中的所有交换区
-v|--verbose #显示过程
创建swap分区
#spec 参数
-L label #要使用设备的标签
-U uuid #要使用设备的 UUID
LABEL=label #要使用设备的标签
UUID=uuid #要使用设备的 UUID
device #要使用设备的名称
filename #要使用文件的名称