Shell编程学习及相关作业解答

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命令
    在这里插入图片描述
  • 动作中拥双引号,因为外层已有单引号
    在这里插入图片描述
    在这里插入图片描述
    wcvi

在这里插入图片描述

  • 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

top小知识

  在Linux系统的/etc目录下有这样一个文件passwd,该文件里包含系统中所有用户信息的记录,记录里包含每个用户的如下信息:用户名、密码、用户ID、组ID、用户全名、用户主目录和用户登录所用的shell。请设计一个脚本(shell)程序能实现增加、删除、查找和显示特定用户信息的功能。你们可以通过创建一些UNIX/LINUX shell 脚本文件来满足以上需求。   可以用任意一个文本编辑器打开passwd文件,该文件里包含用冒号分隔开的字段组成的记录,如下所示:   root:x:0:0:root:/root:/bin/bash   zxj:x:500:500:zxj303:/home/zxj:/bin/bash    . .   在主Shell脚本文件里(必须以 menu 命名)要有一个多操作选项的菜单以便用户从中选择。在不同任务的中,这些操作能自动实现以下功能: 在屏幕上显示当前所有用户的记录 在屏幕上显示当前所有用户(经过格式化和排序的)的记录 只在屏幕上显示用户名和用户ID 只在屏幕上显示(经过格式化和排序的)用户名和用户ID 查询并显示特定用户的记录 往passwd文件里增加新的用户记录 从passwd文件里删除某个用户记录   你可以使用UNIX/LINUX中一些比较简单的命令或命令组合来执行1、2、3、4、5的任务。对于任务6和7,你需要编写单独的Shell脚本文件(必须分别命名为add和delete)并且在你的主脚本menu文件中调用这些脚本文件。   可能你还需要查询一些Unix/Linux命令,比如awk,、sort、tr、cut、paste、sed、grep;你也可能还需要查询其他的Unix/Linux命令。   建议你在主目录下建立一个以 xx xx xx(xx xx xx为学号)命名的目录,并且在本次作业中使用它作为工作目录。 主脚本文件中的菜单   在menu脚本文件里将创建如下菜单,菜单里包含供用户选择的一些操作。 用户信息主菜单 打印当前所有记录 打印当前所有记录(格式化后的) 打印用户名和用户ID 打印(格式化了的)用户名和用户ID 查询特定记录 增加新记录 删除记录 Q——退出 你的选择是:(等待用户输入)   当用户做了选择且所选的操作完成之后,应再次显示主菜单以供用户做下一步选择。你必须用while循环和case条件语句配合来完成此操作。另外在显示主菜单前必须先清除用户屏幕。在以下所有步骤中,当显示主菜单前都需要先清屏。   在menu脚本文件的前面部分你首先要定义三个变量,这三个变量分别存放passwd、add、delete文件的文件名,并且能在所有涉及到passwd、add、delete文件的语句中使用他们。 比如,可以定义成:           record_file=passwd   在所有访问passwd文件的语句中,只要使用 $record_file 即可。这样做的一个优点就是,如果以后你需要重新命名记录或者需要在不同的记录文件中使用你的脚本的话,你只需要修改以上一个语句而不须在所有有关的记录文件里逐一修改语句。如下定义另外两个变量:   add_file=add   delete_file=delete   定义以上变量之后,你必须核对menu脚本文件,看看所需的文件(passwd、add、delete)是否准确存放在当前目录下。如果其中任何一个不存在,你的脚本menu文件就必须显示以下信息,然后退出:   Required file theMissingFile does not exist.(所需文件不存在)   比如,如果passwd文件不存在,就显示“Required file passwd does not exist.(所需文件记录不存在)”然后退出。   在以上等待用户做出选择的菜单中,如果用户偶尔输入了一个代码而不是1、2、3、4、5、6、7或Q,就有信息提示“无效的代码,请按回车键继续``````”(务必保证光标停留在此信息行末尾而不是在下一行的开始处)。等用户按了回车键之后,再次显示主菜单供用户做其他选择。可以允许用户使用Q或q退出。   在以上等待用户做出选择的菜单中,如果用户简单地按了回车键(而不是输代码)的话,就会出现信息“Selection not entered. Press Enter to continue…"(务必保证光标停留在此信息行末尾而不是在下一行的开始处)。等用户按了回车键之后,再次显示主菜单供用户做其他选择。   当用户选择了第一项——打印当前所有用户记录   以下是当用户在主菜单中选择第一个选项后,menu脚本文件输出的内容的例子:    (此处是主菜单—略) 你的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值