实验三:shell 编程

Posted zhaoyi506935668

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验三:shell 编程相关的知识,希望对你有一定的参考价值。

 shell 命令应用练习

(1)通过帮助信息查看,简述以下文件的用途 

/etc/passwd记录了用户的账户

/etc/shadow是可选的加密后的密码文件(查看需要sudo权限)

/etc/group保存了系统中所有组的名称

/etc/gshadow安全组账户信息

对几个命令的文件描述说明进行查看,并使用cat查看对照各个字段的含义

技术分享图片

技术分享图片

技术分享图片

技术分享图片

 

 技术分享图片

 技术分享图片

 技术分享图片

技术分享图片

(2)依次输入如下命令,观察运行结果。结合 man id 查看到的帮助信息,指出每一条

命令功能

1 id    显示用户的ID,以及所属群组的ID。

2 id -u  显示当前用户ID

3 id -u root 显示root用户ID

4 id -u zhaoyi 显示zhaoyi用户ID

man帮助下的解释:打印真是和有效的用户与组ID。

id - print real and effective user and group IDs

技术分享图片

技术分享图片

技术分享图片

尝试再root下使用id

技术分享图片

(3)在 shell 命令终端依次输入以下命令,观察执行结果,理解每条命令实现的具体功能

1which python         which是通过 PATH环境变量到该路径内查找可执行文件,所以基本的功能是寻找可执行文件

whereis python          将和python 文件相关的文件都查找出来

locate python              locate命令可以在搜索数据库时快速找到相关的文件

find /usr/bin -name python      在指定的目录下进行磁盘查找

(说明: which,whereis, locate, find 都具有检索的功能,结合执行结果,查找帮助信息,总结其区别)

 

和find相比,whereis查找的速度非常快,这是因为linux系统会将 系统内的所有文件都记录在一个数据库文件中,当使用whereis和下面即将介绍的locate时,会从数据库中查找数据,而不是像find命令那样,通 过遍历硬盘来查找,效率自然会很高。
但是该数据库文件并不是实时更新,默认情况下时一星期更新一次,因此,我们在用whereis和locate 查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有被更新。

技术分享图片

技术分享图片

2.grep -n -E  ‘root|zhaoyi|^user*‘ /etc/passwd:/etc/passwd -n为显示行号,该指令作用是在/etc/passwd文件中查找以root或zhaoyi为行首的行,其中*表示重复零次以上^表示必须出现在行首
grep -n -E ‘ [[:digit:]] ‘ /etc/passwd:在 /etc/passwd文件中查找含有纯数字的行
grep -n -E ‘ [[:alpha:]] ‘ /etc/passwd:在 /etc/passwd文件中查找含有纯字母的行
grep -n ‘[0-9]\\{4,\\}‘ /etc/group 因为不加-E,所以使用花括号加转义符\\{\\} ,[0-9]等价于[[:digit:]],找出纯数字,4代表4位以上

技术分享图片

实验中后面几条指令理解了含义但是无显示,正在解决----------已经解决,在命令行中’’内不得有空格

 技术分享图片

3 sudo apt install gimp 安装软件gimp

which gimp  查询gimp的位置

sudo apt remove gimp       卸载gimp

which gimp  查询gimp的位置,此时已经没有查询结果

 

4 ls -dl /root --time-style=long-iso示

ls -dl /root --time-style=long-iso | cut -d‘ ‘ -f1,8

对比观察

s -dl /root --time-style=long-iso显示文件信息,时间按完整的ios时间格式显示

ls -dl /root --time-style=long-iso | cut -d‘ ‘ -f1,8以空格为分隔符,显示管道线前输出结果中的1,8字段

 技术分享图片

5 ls -l --time-style=long-iso

ls -l --time-style=long-iso -t

ls -l --time-style=long-iso -t -r

对比观察

ls -l --time-style=long-iso,:ls -l 是列出文件的详细信息,时间设置为long-iso格式,默认排序
ls -l --time-style=long-iso -t:时间最近的排列在前
ls -l --time-style=long-iso -t -r:时间最近排在后面

技术分享图片

6ls /usr/share/man:显示/usr/share/man目录内容

ls /usr/share/man | grep man[1-8]:/usr/share/man目录 搜索man1~man8
ls /usr/share/man/man1:显示/usr/share/man/man1下的目录
file /usr/share/man/man1/ls.1.gz (结合执行结果,review2.8.1 节 gzip命令内容)
mkdir ~/temp; cp /usr/share/man/man1/ls.1.gz ~/temp:根目录下创建temp文件夹,把ls.1.gz复制到temp下
cd ~/temp; ls:转到temp目录下,查看所有文件目录,此时有后缀.gz
sudo gzip -d ls.1.gz; ls:解压并查看目录,此时.gz消失,说明已经解压并删除了压缩包

 技术分享图片

技术分享图片

7 ls –l /home | grep "^d" | wc –l  在home下查看以d开头的行,并统计行数

 技术分享图片

8 sudo adduser user7创建用户user7

ls /home | tee users | wc -l  把home下

技术分享图片

这里我建立了user7我发现好难删除

技术分享图片

依旧没有删除,然后通过手动删除

 技术分享图片

(4)根据要求写出相应的 shell 命令 

1 在目录/usr/include 下搜索文件 signal.h 是否存在 (提示: find 命令)

技术分享图片

2 在/usr/include 目录下的所有文件中查找包含 BUFSIZ 的行,并显示所在行号。

要求:屏幕上只显示查找到的结果,过滤错误信息。

(提示:1 利用 grep 和通配符*; 2利用错误信息重定向和特殊设备文件/dev/null)

 

后面的重定向可能有些问题,这个程序中没有错误信息所以我也难以判定是否正确,等后面再研究

验证正确,我用1>重定向到一个文件 然后查看文件发现规则符合

技术分享图片

下面一种方法在处理速度我感觉比我第一种快,因为他直接查找了,没有传递参数,这只是我的猜测,后面还要验证。

技术分享图片

3 在用户名密码文件/etc/passwd 中查找登录 shell 为 bash 的用户信息记录,并显示行号

(提示:使用 grep 和正则表达式中的$)

技术分享图片

4 从/etc/group 文件中截取第 1 列(组名)和第 3 列(组 id),并按照组 id 号的数值大小由小到大排序。

(提示:综合使用 cut, 管道线及 sort 命令)

# -n是按照数字大小排序,-r是以相反顺序,-k是指定需要爱排序的栏位,-t指定栏位分隔符为冒号

技术分享图片

(5)体验 awk, sed 用法:依次执行命令,观察执行结果

1 cp /etc/apt/sources.list t1; less t1

技术分享图片

2 sed -e "s/#.*//g" t1

技术分享图片

3 sed -e "s/#.*//g" t1 | awk ‘{if (length != 0) print $0}‘

技术分享图片

4 tail -5 /etc/passwd | awk -F: ‘{print $1}‘

技术分享图片

5 tail -5 /etc/group | tee t2

awk ‘BEGIN{print "file t2"} {print "line" NR ":" $0} END {print "over"}‘ t2

技术分享图片

几种命令的初探:

sources.list:linux中更新系统地址之类的信息,在我的认识中这个文件可以更改,因为往往因为网络的原因,需要将源改为网易的源或者阿里的源

sed:以前没有用过,网上的简述:sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

awk:awk是一种强大的文本分析工具,它在对数据分析并生成报告时显得尤为强大,简单说,awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

curl是利用URL语法在命令行方式下工作的开源文件传输工具。

wget 是一个从网络上自动下载文件的自由工具,支持通过 HTTP、HTTPS、FTP 三个最常见的 TCP/IP协议 下载,并可以使用 HTTP 代理。"wget" 这个名称来源于 “World Wide Web” 与 “get” 的结合。

所谓自动下载,是指 wget 可以在用户退出系统的之后在继续后台执行,直到下载任务完成。

 

 练习

技术分享图片

技术分享图片

结合运行结果,分析脚本代码,在实验报告中总结以下内容:

1 写出 line3 中 read 命令选项-n11 功能

-n选项可以设置read命令记录指定个数的输入字符,当输入字符达到11时,自动退出,并将输入的数据赋值给变量。

2 写出 line14 的功能

比对filename中内容与数组code中的内容中相同的字符串,并把相同的字符串重定向到major,为条件语句判断提供依据

 

 

总结:很好的实验设计,这次实验真的很充实,学到的命令很多,各个细节都有涉及,对于我来说帮助很大,比自己没有方向的乱摆弄效率高很多。下次我一定要早一点做实验,这次的实验到最后一天才做,拖延症患者真的,好了,加油!正则表达式还没懂自己找找练习锻炼!!!













以上是关于实验三:shell 编程的主要内容,如果未能解决你的问题,请参考以下文章

实验三:shell 编程

Linux实验三 shell编程

Linux实验三: shell 编程

合肥工业大学Linux实验三Linux 下的 shell 编程

合肥工业大学Linux实验三Linux 下的 shell 编程

合肥工业大学Linux实验三Linux 下的 shell 编程