Linux视频学习笔记(十五)--Shell编程(一)
声明:本系列文章是博主根据 “兄弟连新版Linux****”做的笔记和视频截图,只为学习和教学使用,不适用任何商业用途。
PS:文章基于Linux版本CentOS6.9,如果对Linux感兴趣,建议去看《细说Linux》,沈超老师和李明老师的教学风格我很喜欢:)
第十一章 Shell编程
视频11.1 基础正则表达式
注意:
通配符只用来匹配文件名;
正则表达式用来匹配文件中的内容;
s///是替换正则,如:
s/[0-9]/a/就是将数字替换为a,
s/^[ \t]*//表示如果匹配到以制表符开头的字符串那就把开头的制表符去掉;
g是全局匹配,匹配整个字符串中符合正则的字串,(待验证)如:
[0-9]/g匹配全字符串中的数字,
s/[0-9]//g将字串中所有的数字删除
11.2 字符截取命令
视频11.2.1 cut字段提取命令
1.cut命令
例子:
如果想要批量删除/添加 etc/passwd中的用户,需要结合grep(查找所在行)和cut(查找所在列):
比如,先创建三个用户user1,user2,user3,在/etc/passwd中:
1.只有可登陆用户的登陆shell(权限)是/bin/bash,其他所有系统用户的登陆shell都是/sbin/nologin,所以想筛选出所有普通用户所在行及列,使用cat /bin/passwd|grep “/bin/bash”命令查找:
2.但是如果只想批量删除普通用户,而不删除root用户,需要对上面的结果取反grep –v str:
3.此时再对上面的结果用cut命令确定要删除的用户名:cut –d “:” –f 1
4.最后,将上面的结果赋给变量,循环删除用户。
一般cut命令不会单独使用,需要结合其他命令共同使用
2.cut命令的局限
如果想要统计根分区的使用情况,超过80%时报警,
首先,在df –h命令的结果,查找到sda5为根分区:
使用命令df –h|grep sda5过滤根分区所在行:
然后,使用cut –f 5获取空间使用量:
发现无效,原因是中间使用空格而非tab键做分割,cut命令默认使用tab做分割符,
但使用cut –d “ “ –f 5发现:
没有结果,因为命令中的分割符为一个空格,命令会去精确匹配一个空格作为分隔符,查找第五列还是空格,
此时需要使用awk命令去查找,但是awk比较复杂,有时称awk编程。
视频11.2.2 printf命令
printf是格式化输出命令,格式为:
printf “输出类型输出格式” 输出内容
(可以用‘’,也可以用“”将输出类型和输出格式引起来)
例子:
printf命令后不能直接跟文件名,也不能作为管道符后的命令执行:
但是可以用printf %s $(cat student.txt)后跟命令的结果 $(命令) 来进行打印,但是打印出的内容没有任何格式:
视频11.2.3 awk命令
也是按列截取,类似cut命令,但是比cut命令更加强大,可以分割使用空格作为分隔符的内容;
1.命令格式
例子:
输出结果:
df –h这条命令使用cut做截取发现无效,原因是使用空格作为分隔符,而使用awk命令可以识别:df –h|awk ‘{printf $1 “\t” $5 “\t” $6 “\n”}’
printf后的分隔符可以使用单引号也可使用双引号括起来,这里使用双引号为了不和包裹动作的单引号混淆,$n代表第n列:
在系统Linux命令中只有printf没有print,但是在awk命令中两者都有,使用print可以在行尾自动加入换行符:
接着cut里的一个问题:如何能自动获取主分区里的使用量,判断大于80%时自动报警?
判断的肯定是一个数字,对df –h 使用df –h|grep sda5|awk ‘{print $5}’|cut –d ‘%’ –f 1 做截取:
2.BEGIN条件
在执行下面的动作之前执行的动作:
3.FS内置变量
结合BEGIN使用,指定内容分隔符
例子:使用awk ‘{FS=”:”} {print $1 “\t” $3}’ /etc/passwd 命令使用“:”分隔符来打印第一列和第三列的内容:
发现第一行没有被分割,这是因为awk命令默认先读取一行,再执行动作,这时需要在FS动作之前先使用BEGIN设定分隔符:
4.END条件
END条件是在执行完所有动作后再执行END后的动作:
打印所有除root用户外的可登陆用户的用户名及uuid,执行完打印一句话:
cat /etc/passwd|grep “/bin/bash”|grep –v root|awk ‘BEGIN{FS=”:”} END{print “this is the last line”} {print $1 “\t” $3}’
5.关系运算符
awk命令也可以支持关系运算符
例子:
视频11.2.4 sed命令
1.sed命令介绍
sed:Linux中的流编辑器:
注:增删改查和打印都是行级动作,字串替换可以多行操作。
栗子:
2.打印
3.删除
4.插入和追加
5.替换
6.字符串替换