实验三: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 编程的主要内容,如果未能解决你的问题,请参考以下文章
合肥工业大学Linux实验三Linux 下的 shell 编程