就业班第二周作业:
1. 总结学过的文本处理工具,文件查找工具,文本处理三剑客, 文本格式化命令(printf)的相关命令及选项,示例。
搭建测试环境:
[13:28:28 root@Rocky851 ~]#head -n20 /var/log/messages > test01
[13:47:19 root@Rocky851 ~]#head -n30 /var/log/messages > test02
一、文本处理工具:
①打开文本:nano vi vim
vim命令相关选项及示例
+#:打开文件后,让光标处于第#行的行首,+默认行尾

示例:[13:33:48 root@Rocky851 ~]#vim + test01
[13:34:23 root@Rocky851 ~]#vim +3 test01
+/PATTERN:让光标处于第一个被PATTERN匹配到的行行首
示例: [13:37:46 root@Rocky851 ~]#vim +/Linux test01
-b file 二进制方式打开文件

示例:[13:40:17 root@Rocky851 ~]# vim -b test01
-d file1 file2 ... 比较多个文件,相当于vimdiff

示例:[13:47:35 root@Rocky851 ~]#vim -d test01 test02
-m file 只读打开文件

示例:[13:48:49 root@Rocky851 ~]# vim -m test01
-e file 直接进入ex模式,相当于执行ex file

示例:[13:49:43 root@Rocky851 ~]#vim -e test01
-y file Easy mode 直接可以操作文件,ctrl+o wq|q!保存退出和不保存退出

示例:[13:51:21 root@Rocky851 ~]# vim -y test01
②查找并替换
s/要查找的内容/替换为的内容/修饰符
修饰符:
i #忽略大小写
g #全局替换,默认情况下,每一行只替换第一次出现
gc #全局替换,每次替换前询问
③查看文本:cat
[选项]
-E:显示结束符$ [14:18:15 root@Rocky851 ~]#cat -e test01
-A:显示所有控制符 [14:18:26 root@Rocky851 ~]#cat -A test01
-n:对显示出的每一行进行编号 [14:18:50 root@Rocky851 ~]#cat -n test01
-b:非空行编号 [14:19:23 root@Rocky851 ~]#cat -b test01
-s:压缩连续的空行成一行 [14:19:38 root@Rocky851 ~]#cat -s test01
查看文本并显示行号:nl [14:19:54 root@Rocky851 ~]#nl test01
逆向显示文本内容:tac [14:20:14 root@Rocky851 ~]#tac test01
同一行的内容逆向显示:rev [14:20:28 root@Rocky851 ~]#rev test01
分页查看:more [14:21:09 root@Rocky851 ~]#more /var/log/messages
分页查看:less [14:21:23 root@Rocky851 ~]# less /var/log/messages
显示文本前面行:head [14:22:10 root@Rocky851 ~]#head test01
显示文本后面行:tail [14:22:32 root@Rocky851 ~]#tail test01
抽取文本列:cut
选项:-d :指明分隔符,默认tab
-f #:第#个字段;#,#[,#]:离散的多个字段;#-#:连续的多个字段
[14:22:58 root@Rocky851 ~]#cut -d: -f1,3-5,7 /etc/passwd
-c 按字符切割
--output-delimiter=STRING指定输出分隔符
合并多个文件:paste [14:27:46 root@Rocky851 ~]#paste test01 test02
文本数据统计:wc [14:28:58 root@Rocky851 ~]# wc test01
文本排序:sort
-r 执行反方向(由上至下)整理
-R 随机排序
-n 执行按数字大小整理
-h 人类可读排序,如:2K 1G
-f 忽略大小写
-u 去重
-t c选项使用c作为字段界定符
-k # 选项按照使用c字符分隔的#列来整理能够使用多次
比较文件:diff和patch
去重:uniq
-c:显示每行重复出现的次数
-d:仅显示重复过的行
-u:仅显示不曾重复的行
文件查找工具:locate find
locate常用选项:
-i 不区分大小写的搜索
-n N 只列举前N个匹配的项目
-r 使用基本正则表达式
find [OPTION] ...[查找路径] [查找条件] [处理动作]
①指定搜索目录层级
-maxdepth level 最大搜索目录深度,指定目录下的文件为第1级
-mindepth level 最小搜索目录深度
[20:24:30 root@Rocky851 ~]#find /proc -maxdepth 2 -mindepth 2
②对每个目录先处理目录内的文件,再处理目录本身
-depth:[20:24:30 root@Rocky851 ~]#find /var/log -depth
③根据文件名和inode查找
-name
④根据属主、属组查找
-user #查找属主为指定用户(UID)的文件
-group #查找属主为指定组的(GID)文件
⑤根据文件类型查找
-type:文件类型有f普通文件,d目录文件,l符号链接文件,s套接字文件,b块设备文件,c字符设备文件,p管道文件
⑥根据文件大小来查找
-size
#UNIT 表示(-1,#]
-#UNIT 表示[0,#-1]
+#UNIT 表示(#,∞)
⑦根据时间戳
以天为单位
-atime
# [#,#+1)
+# [#+1,∞]
-# [0,#)
-mtime
-ctime
以分钟为单位
-amin
-mmin
-cmin
根据权限查找
-perm
文本处理三剑客:grep sed awk
grep 选项 表达式 文件
常见选项:
--color-auto 对匹配到的文本着色显示
-m # 匹配到#次后停止
-v 显示不被表达式匹配到的行,即取反
-i 忽略字符大小写
-n 显示匹配的行号
-c 统计匹配的行数
-o 仅显示匹配到的字符串
-q 静默模式,不输出任何信息
-A # 后#行
-B # 前#行
-C # 前后各#行
-e 实现多个选项间的逻辑or关系
-w 匹配整个单词
-E 相当于egrep
-F 不支持正则表达式,相当于fgrep
-P 支持perl格式的正则表达式
-f file 根据模式文件处理
-r 递归目录,但不处理软链接
-R 递归目录,但处理软链接
[21:03:13 root@Rocky851 ~]#ifconfig eth0 | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'|head -n1
printf格式化输出
常用格式替换符
%s 字符串
%d,%i 十进制整数
%f 浮点格式
%c ASCII字符,即显示对应参数的第一个字符
%b 相对应的参数中包含转义字符时,可以使用此替换符进行替换,对应的转义字符会被转义
%o 八进制值
%u 不带正负号的十进制
%x 十六进制(a-f)
%X 十六进制(A-F)
%% 表示%本身
常用转义字符
\a 警告字符,通常为ASCii的BEL字符
\b 后退
\f 换页
\n 换行
\r 回车
\t 水平制表符
\w 垂直制表符
\ 表示\本身
2. 总结文本处理的grep命令相关的基本正则和扩展正则表达式。
基本正则表达式
字符匹配
. 匹配任意单个字符(除了\n),可以是一个汉字或其他国家的文字
[] 匹配指定范围内的任意单个字符
[^] 匹配指定范围外的任意单个字符
[21:03:17 root@Rocky851 ~]#ls /etc/ | grep 'rc[.0-6].'
匹配次数
* 匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
.* 任意长度的任意字符
\? 匹配其前面的字符出现0次或1次,即:可有可无
\+ 匹配其前面的字符出现最少1次
\{n\} 匹配前面的字符n次
\{m,n\} 匹配前面的字符至少m次,至多n次
\{,n\} 匹配前面的字符至多n次
\{n,\} 匹配前面的字符至少n次
[21:18:16 root@Rocky851 ~]#echo /etc/ |grep "/etc/\?"
位置锚定
^ 行首锚定,用于模式的最左侧
$ 行尾锚定,用于模式的最右侧
^PATTERN$ 用于模式匹配整行
^$ 空行
扩展正则表达式 -E 基本正则表达式本该带\的去掉
3. 总结变量命名规则,不同类型变量(环境变量,位置变量,只读变量,局部变量,状态变量)如何使用。
变量命名规则:区分大小写,不能使程序中的保留字和内置变量,只能使用数字,字母以及下划线,且不能以数字开头,注:不支持“-”,用英文单词命名,不要用简写,变量名大写,局部变量小写,函数名小写,大驼峰StudentFirstName,小驼峰studentFirstName,下划线student_name
环境变量:可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量,一旦子进程修改其父进程继承的变量,将会新的值传递给孙子进程,一般只在系统配置文件中使用,在脚本中较少使用
声明变量:export name=VALUE
declare -x name=VALUE
变量引用:$name 或 ${name}
删除变量:unset name
只读变量:只能声明定义,后续不能修改删除,即常量
声明变量:readonly name
declare -r name
位置变量:在bash shell中内置的变量,在脚本代码中调用通过命令行传递给脚本的参数
$1,$2...对应第1个,第2个参数
$0 命令本身,包括路径
$* 传递给脚本的所有参数,全部参数合为一个字符串
$@ 传递给脚本的所有参数,每个参数为独立字符串
$# 传递给脚本参数的个数
清空所有位置变量:set --
4. 通过shell编程完成,30鸡和兔的头,80鸡和兔的脚,分别有几只鸡,几只兔?
[22:12:26 root@Rocky851 ~]#cat ChickenRabbit.sh
#!/bin/bash
HEAD=$1
FOOT=$2
RABBIT=$(((FOOT-HEAD-HEAD)/2))
CHICKEN=$[HEAD-RABBIT]
echo RABBIT:$RABBIT
echo CHICKEN:$CHICKEN
[22:11:30 root@Rocky851 ~]#bash ChickenRabbit.sh 30 80
RABBIT:10
CHICKEN:20
5. 结合编程的for循环,条件测试,条件组合,完成批量创建100个用户,
1)for遍历1..100
2)先id判断是否存在
3)用户存在则说明存在,用户不存在则添加用户并说明已添加。
批量创建用户脚本:
#!/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

批量删除用户脚本:
#!/bin/bash
for i in {1..100};do
userdel user$i
rm -rf /home/user$i /var/spool/mail/user$i && echo "user$i is deltele"
done

6. 磁盘存储术语总结: head, track, sector, sylinder.
head:磁头 磁头数=盘面数
track:磁道 磁道=柱面数
sector:扇区,512bytes
cylinder:柱面 1柱面=512*sector/track*head数=512*63*255=7.84M
7. 总结MBR,GPT结构。
MBR分区结构:主分区和逻辑分区
主引导记录MBR组成:
主引导程序:负责从活动分区中装载,并运行系统引导程序
数据区:出错信息数据区,偏移地址0089H--00E1H为出错信息,00E2H--01BDH全为0字节
分区表:含4个分区项,偏移地址01BEH--01FDH,每个分区表项长16个字节,共64字节为分区项1,分区项2,分区项3,分区项4
结束标志:结束标志字,偏移地址01FE--01FF的2个字节值为结束标志55AA
GPT分区结构:GPT头,分区表,GPT分区,备份区域
8. 总结学过的分区,文件系统管理,SWAP管理相关的命令及选项,示例
fdisk相关命令及选项示例
[root@zhao ~]# fdisk -l /dev/sda 查看是MBR分区还是GPT分区
parted相关命令及选项示例
[root@zhao ~]# parted -l 列出所有硬盘分区信息
[root@zhao ~]# parted /dev/sdb print
mkfs相关命令及选项示例
-t {ext2|ext3|ext4|xfs}
-b {1024|2048|4096}
-L 'LABEL'
-j 相当于-t ext3, mkfs.ext3
tune2fs 相关命令及选项示例
[root@zhao ~]# tune2fs -l /dev/sdb
xfs_info 相关命令及选项示例
[root@zhao ~]# xfs_info /dev/sdb 显示已挂载xfs文件系统信息
fsck 相关命令及选项示例
-a 自动修复
-r 交互式修复错误
fsck -t FS_TYPE 文件系统检测修复(注:一定不要在挂载状态下执行命令修复,FS_TYPE一定要与分区上文件类型相同)
mount 相关命令及选项示例
[root@zhao ~]# mount /dev/sdb /mnt
添加新的挂载项,需要执行命令生效:[root@zhao ~]# mount -a
umount 相关命令及选项示例
[root@zhao ~]# umount /mnt
swapon 相关命令及选项示例
-a 激活所有交换分区 [root@zhao ~]# swapon -a
-p PRIORITY 指定优先级(-1到32767之间),值越大,优先级越高
swapoff 相关命令及选项示例
禁用swap分区:[root@zhao ~]# swapoff -a