本随笔为Linux实验三,主要内容为shell的基本使用
一特殊字符
二:shell命令应用练习
①:/etc/passwd:
/etc/passwd每一行表示一个用户账户,使用:分割七个字段,如:
中最后一条,从前至后分别是:
登录名,可选的加密后的密码,数字用户ID,数字组ID,用户名和注释字段,用户主目录,可选的用户命令解释器
②:/etc/shadow
shadow是一个文件,包含系统账户的密码信息和可选的年龄信息,每行包含9个字段,使用:分隔,如
从前至后分别是
登录名;
加密了的密码,最后一次修改密码的日期,数字指的是从1970年1月1日开始的天数;
最后一次更改密码的时期
密码的最小年龄,即两次修改之间的限制时间,为0则表示不限制;
最大密码年龄,即对应时间后,用户必须更改密码。时间到后,密码仍然可用,但用户将在下次登录的时候被要求更改密码,空字段表示没有最大密码年龄,若最大密码时间小于最小年龄,则无法修改;
密码警告时间段,即密码过期前,提前警告用户的天数如上图中的7
密码禁用期,即密码过期后仍可使用的天数,若过了这个宽限期,则之后无法登陆,需联系系统管理员,空字段表示没有强制密码过期
账户过期时间,注意,账户过期不同于密码过期。账户过期时,用户将不被允许登录;密码过期时,用户将不被允许使用其密码登录。空字段表示永不过期
保留字段,此字段保留作将来使用。
③:/etc/group
这是用户组文件,保存系统中的组,每一组占一行,通过:分隔,如
从前至后,分别是组名,加密后的密码,GID,本组成员列表
④:/etc/gshadow
影子化了的组文件,包含影子化了的组账户信息,用:分隔,如
可以看到,与③中的图类似,从前至后分别是组名,加密了的密码,管理员,成员
⑤:id
id命令显示用户的id,用户的组id,组后面跟着guqi1901所在组的组id
id -u则只显示用户的id,后面加上root等具体用户,则显示对应的用户的信息
⑥:检索
which:查找可执行文件的位置
whereis:显示指定命令的相关文件,包括二进制文件、源代码文件以及手册页
locate:查找档案系统内是否有指定的文档。需要注意的是,locate的速度比find快,因为它并不是真的查找文件,而是查数据库
find:在指定的目录中进行查找,可接-name选项,表示指定字符串作为寻找文件或目录的范本样式
⑦:grep与正则表达式
grep "match_pattern" file_name即在对应文件下搜索与正则表达式匹配的结果
一些常用的通配符:
*:匹配任意长度的任意字符
?:匹配任意单个字符
[]:匹配指定范围内的任意单个字符
[^]:匹配指定范围之外的任意单个字符
[:space:]:空白字符
[:punct:]:标点符号
[:lower:]:小写字母
[:upper:]:大写字母
[:alpha:]:大小写字母
[:digit:]:数字
[:alnum:]:数字和大小写字母
因此 grep -n -E 'root|guqi1901|^user*' /etc/passwd显示出了对应文件中包含root或guqi1901或以user为开头字母的行
grep -n -E ' [[:digit:]] ' /etc/passwd显示出了对应文件中包含数字的行
grep -n -E ' [[:alpha:]] ' /etc/passwd显示出来对应文件中包含字母的行grep -n '[0-9]\{4,\}' /etc/group显示出了对应文件中包含连续四个数字的行⑧:安装卸载
sudo apt install gimp 安装gimp
which gimp 查找gimp可执行文件的位置sudo apt remove gimp 卸载gimpwhich gimp 再次查找,以确认删除⑨:ls
ls -l --time-style=long-iso 将时间以long-iso的形式全部列出
ls -l --time-style=long-iso -t 按照时间排序ls -l --time-style=long-iso -t -r 在上面的基础上逆序⑩:cp gzip
ls /usr/share/man 打开对应目录
ls /usr/share/man | grep man[1-8] 查看此目录中是否有man1—man8文件ls /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 在home/user/下新建一个dir,将文件拷贝进去cd ~/temp; ls 进入tempsudo gzip -d ls.1.gz; ls 解压文件⑪:通配符的使用
ls –l /home | grep "^d" | wc –l 找出对应文件夹下的文件夹数 ,^d用于确定是文件类型
sudo adduser user7 添加一个新用户user7
ls /home | tee users | wc -l 列出home中的信息,将其写入users文件中,并统计行数⑫:四个实例
在目录/usr/include 下搜索文件 signal.h 是否存在 find /usr/include -name signal.h
在/usr/include 目录下的所有文件中查找包含 BUFSIZ 的行,并显示所在行号 find /usr/include -exec grep -nH "BUFSIZ" {} \; 2>/dev/null
在用户名密码文件/etc/passwd 中查找登录 shell 为 bash 的用户信息记录 grep -n 'bash' /etc/passwd
从/etc/group 文件中截取第 1 列(组名)和第 3 列(组 id),并按照组 id 号的数值大小由小到大排序 cat /etc/group | cut -d':' -f1,3 | sort -t ':' -k 2n
⑬:awk, sed
/etc/apt/sources.list是包管理工具apt所用的记录软件包仓库位置的配置文件,如
从左至右分别为:
档案类型:deb表示类型为二进制预编译软件包,是一般我们所用的档案类型;dev-src为用于编译二进制软件包的源代码
仓库地址 我们可以更换仓库地址为地理位置更靠近自己的镜像来提高下载速度,上图中就不是默认的地址
发行版 发行版有两种分类方法,一类是发行版的具体代号,如xenial,trusty,precise等,还有一类则是发行版的发行类型,如oldstable,stable,testing和unstable。发行版后还可能有进一步的指定,如xenial-updates,trusty-security,stable-backports等。
软件包分类 在ubuntu中,main为官方支持的自由软件。restricted官方支持的非完全自由的软件。universe社区维护的自由软件。multiverse非自由软件。
sed是一个文件处理工具,主要以行为单位进行处理,可以将数据行进行替换、删除、新增、选取的等工作。
其中常用命令s表示取代工作,格式为sed 's/要替换的字符串/新的字符串/g'
awk是一种处理文本文件的语言,是一个强大的文本分析工具。如awk ‘{[pattern] action}’ {filenames} 表示行匹配语句,其中$0表示整行,$n表示第n个词
⑭:curl和wget
curl命令是一个利用URL规则在命令行下工作的文件传输工具,支持文件的上传和下载,但习惯上,称curl为下载工具。curl支持包括HTTP、HTTPS、ftp等众多协议,还支持POST、cookies、认证等功能。
wget命令用来从指定的URL下载文件。wget非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性,如果是由于网络的原因下载失败,wget会不断的尝试,直到整个文件下载完毕。如果是服务器打断下载过程,它会再次联到服务器上从停止的地方继续下载。这对从那些限定了链接时间的服务器上下载大文件非常有用。
三:两个shell脚本
filename=backup-$(date +%Y%m%d%H%M) 文件命名为当前时间
tar -cJf - 'find . -mtime -1 -type f -print' >${filename}.tar.xz 2>error_info 将最近一天被修改的文档的信息写到对应的tar.xz中
echo "backup archive file:"
ls ${filename}.tar.xz 显示已压缩成功的文件echo
echo "fail to backup:"cat error_info 显示错误的信息#!/bin/bash
# exercise for shell variableread -p '请输入你的学号: ' -n11 stu_no 限定最多读入11个字符,读到数量时结束grade=${stu_no:0:4} 找出前五个num=${stu_no:(-3)} 找到后三位code=${stu_no:4:4} 找到中间的四位printf "\n"printf "你是$grade级学生.\n" printf "你的专业代号是$code.\n"printf "你的学号的后三位是$num.\n"filename="major_code.txt"
if [ -f $filename ]then grep $code $filename > t1 && read x major < t1 搜索code和filename重定向到t1,然后从t1输出到major if [ "$major" ] then echo "你的专业是: $major." else echo "查不到你的专业." fielse echo "找不到文件$filename."fiunset grade num code x major四:总结
1.空格不能随意添加,很多地方对高级语言来讲不会产生歧义才对。
2.基础命令的熟练程度直接影响shell编程:-)