shell编程
【shell命令应用】
1.通过帮助信息,查看以下文件的用途
①/etc/passwd:保存用户账户信息。
每个账户一行,每行七个字段,用冒号分隔。
用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell
②/etc/shadow:保存安全用户账户信息。它是/etc/passwd文件的影子,etc/shadow文件中的记录行与/etc/passwd中的一一对应。
每行九个字段,用冒号分隔。
登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
但是/etc/shadow文件只有系统管理员才能够进行修改和查看。
③/etc/group:存放linux用户组的信息。
组名:口令:组标识号:组内用户列表
④/etc/gshadow:它是/etc/group文件的影子,与/etc/group互补。
组名:口令:组管理者:组内用户列表
注:man 手册分为多个section,每个section用一个字符表示,例如man 1 passwd和man 5 passwd是不一样的。详见下图。
2.输入命令,观察运行结果,并指出功能
①id:显示当前用户id(uid)和用户组id(gid)。
②id -u:显示当前用户id。
③id -u root:查看用户名为root的uid。
④id -u cyj:查看用户名为cyj的uid。
3.命令区分及实践
①which python:查找python命令的路径。
whereis python:查找和python有关的文件。whereis只能用于搜索程序名。
locate python:查找和python相关的所有文件。locate不是实时查找,查找的是一个数据库,结果不精确,但速度快。
find /usr/bin -name python:在/usr/bin目录下查找名为python的文件或文件夹。find实时查找,结果精确但速度慢。
②grep -n -E 'root|cyj|^user*' /etc/passwd:在/etc/passwd中查找root或cyj或user开头的行并输出,同时输出行号。
grep -n -E '[[:digit:]]' /etc/passwd:在/etc/passwd中查找所有数字并输出,同时输出行号。
grep -n -E '[[:alpha:]]' /etc/passwd:在/etc/passwd中查找所有字母并输出,同时输出行号。
grep -n '[0-9]\{4,\}' /etc/group:在/etc/group中查找gid是四位数及以上的,同时输出行号。
③sudo apt install gimp:安装gimp图像处理软件
whereis gimp:查找gimp安装的位置
sudo apt remove gimp:卸载gimp
whereis gimp:再次查看gimp的位置,结果为空
④ls -dl /root --time-style=long-iso:-dl表示用长列表的方式列出/root目录的详细信息,时间格式为long-iso
ls -dl /root--time-style=long-iso | cut -d' ' -f1,8:空格作为分隔符,截取前面命令结果的第一个和第八个字段
⑤ls -l --time-style=long-iso:输出当前目录下所有文件的详细信息,时间格式为long-iso,默认按文件名排序
ls -l --time-style=long-iso -t:将上面的结果按修改时间排序输出
ls -l --time-style=long-iso -t -r:将上面的结果按文件名倒序输出
⑥ls /usr/share/man:列出/usr/share/man目录下的所有文件
ls /usr/share/man | grep man[1-8]:在/usr/share/man目录下查找man1-man8并列出
ls /usr/share/man/man1:列出man1中的所有文件
file /usr/share/man/man1/ls.1.gz:显示ls.1.gz的文件类型
mkdir ~/temp; cp /usr/share/man/man1/ls.1.gz ~/temp:在根目录下创建文件夹temp,将/usr/share/man/man1/ls.1.gz复制到temp下
cd ~/temp; ls:切换到temp目录,显示该目录下所有文件
sudo gzip -d ls.1.gz; ls:解压并查看
⑦ls -l /home | grep "^d" | wc -l:在/home目录下查找以"d"开头的信息,统计行数再输出
⑧sudo adduser user7:新建一个名为"user7"的用户
ls /home | tee users | wc -l:在/home目录下,将所有users重定向到屏幕上,统计个数再输出
4.根据要求写shell命令
①在目录/usr/include 下搜索文件 signal.h 是否存在
②在/usr/include 目录下的所有文件中查找包含 BUFSIZ 的行,并显示所在行号
③在用户名密码文件/etc/passwd 中查找登录 shell 为 bash 的用户信息记录,并显示行号
④从/etc/group 文件中截取第 1 列(组名)和第 3 列(组 id),并按照组 id 号的数值大小由小到大排序。
5.体验awk,sed用法
①cp /etc/apt/sources.list t1;less t1:复制到t1中
②sed -e "s/#.*//g" t1:与上一条命令显示结果相比,去除了注释部分
③sed -e "s/#.*//g" t1 | awk '{if (length != 0) print $0}':与上一条命令显示结果相比,去除了空行(即length为0的行)
④tail -5 /etc/passwd | awk -F: '{print $1}':取/etc/passwd最后五行,以冒号为分隔符,打印第一个字段
⑤tail -5 /etc/group | tee t2:将/etc/group中最后五行重定向到t2中
awk 'BEGIN{print "file t2"} {print "line" NR ":" $0} END {print "over"}' t2:首先输出“BEGIN”,然后输出t2中的内容,并在每一行前加上“line”和行号和“:”,t2输出完成能后,最后输出“OVER”。
【编写shell脚本】
1.使用 vi/vim/gedit 或其它编辑器,编写 shell 脚本 ex1.sh,内容如下:
该脚本的功能是,备份当前目录下最近 1 天以内(即 24 小时内)被修改过的普通文件。以 backup 系统当前日期时间为文件名,并压缩存档。备份过程中出错信息写入 error_info。然后分别查看备份文档和报错信息。
用三种方式运行该脚本。
①bash < ex1.sh
②bash ex1.sh
③ex1.sh <--此种方式失败了:找不到命令
④. ex1.sh
2.使用 vi/vim/gedit 或其它编辑器,编写 shell 脚本 ex2.sh,内容如下:
用四种方式运行该脚本。
①bash < ex2.sh <--此种当时失败了:第四行未找到命令
②bash ex2.sh
③chmod a+x ex2.sh; PATH=%PATH:.; ex2.sh
④. ex2.sh
line3中read命令-n11表示指定读入11个字符,超过11就会自动退出。
line14的功能是将变量code和变量filename中匹配的内容重定向到t1中,并将t1中的内容重定向到major中。
【总结体会】
本次实验内容较多,很多新知识来不及消化,还要日后多加练习。