Shell编程学习及相关作业解答
一、Shell小知识(相关ppt来自于兄弟连)
1、shell概述
- 查询Linux支持的Shell:在/etc/shells文件中
2、脚本执行方式
基本格式:
运行脚本:
3、Bash基本功能
bash常用快捷键:
记住蓝色的即可
①echo输出命令
②hiostry 历史命令
③alias命令别名
命令执行时顺序:
④输入输出重对象
其中,2与>之间没有空格
如果文件是新的,则现场写,以Ctrl + d结束
不加选项则输出:行数 单词数 字符数(包括空格和换行)
⑤多命令顺序执行与管道符
例子的两个date,便于计算复制时间
最后一个例子的相当于(A&&B)||C
⑥通配符与其它特殊符号
通配符常用前三个
3、Bash变量
关于变量:
从上到下变量的限制与要求越发严格。其中,位置参数变量是预定义变量的一种
①用户自定义变量(本地变量)
变量叠加示例:
set命令所显示的是整个系统的变量,也包括自定义的
②环境变量
要创建子shell,如下
查询多少子shell用pstree命令(确认进程树)
env用来查询环境变量
至于调用环境变量方法同本地变量
其中,可以本地变量——>自定义环境变量
③位置参数变量
简单来说就是把命令行/参数传入变量当中
④预定义变量
4、Bash的运算符
5、环境变量配置文件
6、正则表达式
-n是标出行数
7、字符截取命令(①②③是列,④是行)
①cut字段提取命令
默认的分隔符是一个tab
不用空格作为分隔符
②printf命令
注意单引号
有几个%s代表一行中有几个字符串
- printf和cat命令最大的不同在于cat是按照原本的格式输出,而printf把文件内容直接连成一句
- printf不支持|(管道符)连用
- printf存在似乎为了awk?
③awk命令
- 当cut命令无法使用时在考虑awk命令
- 动作中拥双引号,因为外层已有单引号
- FS是用来定义分隔符的
- 以上事例中若不加入BEGIN,第一行数据无法处理
④grep命令
[root@www ~]# grep [-acinv] [–color=auto] ‘搜寻字符串’ filename
选项与参数:
-a :将 binary 文件以 text 文件的方式搜寻数据
-c :计算找到 ‘搜寻字符串’ 的次数
-i :忽略大小写的不同,所以大小写视为相同
-n :顺便输出行号
-v :反向选择,亦即显示出没有 ‘搜寻字符串’ 内容的那一行!
–color=auto :可以将找到的关键词部分加上颜色的显示喔!
- 若不搜索指定字符串,也要用""标上
⑤sed命令
8、字符处理命令
- 若不加-n,则默认10是字符串1和0
关于sort的详解:命令sort详解
9、条件判断
- 主要用途是将结果告诉计算机,而不是针对用户的
- 【与-e间有空格,g与】间也有空格
10、流程控制
①if语句
②case语句
③for循环
语法一:不知循环次数
语法二:已知循环次数
④while循环与until循环
二、作业解答
SHELL1:编写一个shell脚本(SHELL1.sh)以输出一个文本文件 a.txt 中的行数
其中,a.txt内容为
SHELL1.sh内容为(7种写法)
#!/bin/bash
#TASK:count the number of lines in a.txt
#Method1:awk '{print NR}' a.txt|tail -n1
#Method2:wc -l < a.txt
#Method3:cat a.txt|wc -l
#Method4:wc -l a.txt
#Method5:grep -n "" a.txt|awk 'BEGIN{FS=":"} {print $1}'|tail -n1
#Method6:
grep -n "" a.txt|awk 'BEGIN{FS=":"} END{print $1}'
#Method7:sed -n '$=' a.txt
解析:
-
Method1:打印已读的记录数(每行行号)→ 显示文件最后一行
-
Method2:把文件a.txt作为命令输入,wc -l指打印行数
-
Method3:先打开a.txt,显示内容 → 打印行数
-
Method4:打印a.txt的行数
-
Method5:带行数和冒号打印文本a.txt的内容 → 以“:”为分隔符打印第一列参数的内容 → 显示文件的最后一行
-
Method6:带行数和冒号打印文本a.txt的内容 → 以“:”为分隔符打印第一列最后一行参数的内容
-
Method7:-n指把经过sed处理的行打印出来,而sed处理的动作中$代表正则表达式中匹配行尾,=表示sed编辑命令中显示行号
SHELL2:查看日志的时候,经常会从文件的末尾往前查看,请编写一个shell脚本以输出一个文本文件 a.txt 中的最后5行
其中,a.txt的内容为
SHELL2.sh内容为(7钟写法)
#!/bin/bash
#TASK:print the last five lines of a.txt
lines=$(awk '{print NR}' a.txt|tail -n1)
#Method1:tail -n 5 a.txt
#MEthod2:
#for((i=$(($lines-4));i<=$lines;i++))
#do
# head -$i a.txt|tail -1
#done
#Method3:awk "{if(NR>$(($lines-5))) print \$0}" a.txt
#Method4:awk 'NR>$(($lines-5))' a.txt
#Method5:awk 'BEGIN{x=1}{arr[x]=$0;x++} END{for(i=NR-4;i<=NR;i++)print arr[i]}' a.txt
Method6:
for((i=$(($lines-4));i<=$lines;i++))
do
#awk "FNR==$i{print;exit}" a.txt
awk "NR==$i{print;exit}" a.txt
done
#Method7:tac a.txt|head -n 5|tac
解析:
- $0: 当前记录(这个变量中存放着整个行的内容)
- Method5:使用 awk 来编程求解。其中 BEGIN{} 中声明一个变量 x 来记录行数;{} 中将每一行内容存放到数组 arr 中,并且变量 x 加一;最后在 END{} 语句中遍历数组 arr 最后五行打印输出。
- Method6:由于awk打印完也不会立即退出,可以添加exit优化
SHELL3:编写shell脚本,实现对后台CPU使用率的的监控,并将CPU利用率前三的进程信息存储到文件中
其中,SHELL3.sh的内容为
#!/bin/bash
#TASK:将CPU利用率前三的进程信息存储到文件中
top -n 1 -b>b.txt
sed -n '7p' b.txt>c.txt
sed -i '1,7d' b.txt
sort -r -n -k 9 b.txt -o b.txt
sed -i '4,$d' b.txt
cat c.txt
cat b.txt