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中。

【总结体会】

   本次实验内容较多,很多新知识来不及消化,还要日后多加练习。

posted @ 2018-05-02 16:29  ppp_p  阅读(302)  评论(0编辑  收藏  举报