实验1 Linux系统简介
本节主要学习了 Linux 的历史,Linux 与 Windows 的区别等入门知识。通过学习,我明确了目的,是要用 Linux 来做程序开发、搭建服务器等;并且非常接受不用或少用图形界面;尽可能多学习一些Linux的发行版。在安装Ubuntu时也遇到了不支持虚拟化的问题,进入BIOS设置得以解决。
实验2 基本概念及操作
- 学习实践
- 通配符
?
和*
的区别?
匹配一个字符,*
匹配一个或者多个字符。 - 批量建立文件
- 作业
-
banner
命令
-w参数指定打印宽度,因为实验楼的环境在屏幕中显示比较小,必须要加上宽度限制。 -
toilet
命令
-
flight
命令
实验3 用户及文件权限管理
- 学习实践
- 切换用户
- 添加用户组
可以使用groups
命令,或者查看/etc/group
文件查看用户组,使用usermod
添加用户组。
- 更改文件所有者
使用chown
命令更改文件权限
- 权限更改
(1)数字更改权限
数字说明:
0 - 无权限
1 - 可执行
2 - 可写
3 - 可写可执行
4 - 可读
5 - 可读可执行
6 - 可读可写
7 - 可读可写可执行
三个数字分别对应文件所有者、所属用户组、其他用户。
(2)加减赋值更改权限
u、g、o分别对应文件所有者、所属用户组、其他用户。
+和-分别表示增加、去除权限。
r、w、x分别表示读、写、执行。
- 作业
题目:添加一个用户 loutest,使用 sudo 创建文件 /opt/forloutest,设置成用户 loutest 可以读写。
- 添加用户loutest
- 用户loutest加入sudo用户组
- 切换用户创建文件并修改权限
实验4 Linux目录结构及文件基本操作
FHS(英文:Filesystem Hierarchy Standard 中文:文件系统层次结构标准),多数 Linux 版本采用这种文件组织形式,FHS 定义了系统中每个区域的用途、所需要的最小构成的文件和目录同时还给出了例外处理与矛盾处理。
FHS 定义了两层规范,第一层是,/
下面的各个目录应该要放什么文件数据,例如 /etc
应该放置设置文件,/bin
与/sbin
则应该放置可执行文件等等。第二层则是针对 /usr 及 /var 这两个目录的子目录来定义。例如/var/log
放置系统日志文件,/usr/share
放置共享数据等等。
- 学习实践
-
rename
批量修改文件名
修改文件名可以使用mv
命令,但是想要批量修改的话,需要使用rename
命令。
-
cat
和tac
命令(正反)
-
file
命令查看文件类型
- 作业
- 创建一个 homework 目录,建立名为 1.txt~10.txt 文件,并删除 1.txt~5.txt
- Linux的日志文件在哪个目录?
日志文件基本在/var/log和/var/run中。
(1)/var/log/boot.log(自检过程)
(2)/var/log/cron (crontab守护进程crond所派生的子进程的动作)
(3)/var/log/maillog (发送到系统或从系统发出的电子邮件的活动)
(4)/var/log/syslog (只记录警告信息)
(5)/var/run/utmp
(6)/var/log/wtmp(记录每个用户登录、注销及系统的启动、停机的事件)
(7)/var/run/utmp(记录有关当前登录的每个用户的信息)
(8)/var/log/xferlog(记录FTP会话)
实验5 环境变量与文件查找
- 学习实践
- 添加环境变量
- 添加自定义路径且立即生效
- 搜索文件
whereis
--简单快速which
--小而精find
--精而细locate
--快而全,通过/var/lib/mlocate/mlocate.db
数据库查找,不过这个数据库也不是实时更新的,系统会使用定时任务每天自动执行updatedb
命令更新一次,所以有时候你刚添加的文件,它可能会找不到,需要手动执行一次updatedb
命令。
- 作业
题目:寻找文件。找出 /etc/ 目录下的所有以 .list 结尾的文件
实验楼的环境运行不了updatedb
命令,所以本次作业在自己电脑上进行。
挑战1 寻找文件
- 目标:
- 找到
sources.list
文件(依稀记得在/etc/
目录下) - 把文件所有者改为自己(shiyanlou)
- 把权限修改为仅仅只有自己可读可写
- 解答:
实验6 文件打包与解压缩
- 学习实践
- zip打包
-r
表示递归打包,将目录下所有文件打包。-9
表示打包速度与大小等级设定,1表示最快压缩但体积大,9表示体积最小但耗时最久。-q
表示静默打包,不向终端输出信息。-o
表示输出文件。
- tar命令
-c
表示创建一个 tar 包文件-x
表示解压缩文件,只能解压缩到一个已存在的目录,所以下图中第一次实现错误提示。-f
用于指定创建的文件名,注意文件名必须紧跟在 -f 参数之后
- 作业
题目:创建一个名为 test 的文件,分别用 zip 和 tar 打包成压缩包,再解压到 /home/shiyanlou 目录。
实验7 文件系统操作与磁盘管理
- 学习实践
- 创建虚拟磁盘
- 虚拟磁盘挂载
由于实验楼环境的问题(环境中使用的 Linux 内核在编译时没有添加对 Loop device的支持),所以将无法挂载成功。
在自己机器上挂载成功。
- 作业
题目:找出当前目录下面占用最大的前十个文件du -a | sort -n -r | head -n 10
使用du
查看当前目录,并使用-a
参数显示大小,sort
进行排序,head
取前十。
实验8 Linux下的帮助命令
- 学习实践
Linux命令分为内建命令和外部命令。内建命令是 shell 程序的一部分,其中包含的是一些比较简单的 Linux 系统命令,这些命令是写在bash源码的builtins里面的,并由 shell 程序识别并在 shell 程序内部完成运行,而且解析内部命令 shell 不需要创建子进程,因此其执行速度比外部命令快。比如:history、cd、exit 等等。外部命令是 Linux 系统中的实用程序部分,在系统加载时并不随系统一起被加载到内存中,而是在需要时才将其调用内存。虽然其不包含在 shell 中,但是其命令执行过程是由 shell 程序控制的。外部命令是在 Bash 之外额外安装的,通常放在/bin,/usr/bin,/sbin,/usr/sbin等等。比如:ls、vi等。
可以使用type
进行区分。help
命令是用于显示 shell 内建命令的简要帮助信息。man
没有内建与外部命令的区分,显示系统手册页中的内容,大多数都是对命令的解释信息,还有一些相关的描述。info
是 GNU 的超文本帮助系统,能够更完整的显示出 GNU 信息。
实验9 Linux任务计划crontab
- 学习实践
- crontab
添加*/1 * * * * touch /home/shiyanlou/$(date +\%Y\%m\%d\%H\%M\%S)
可以实现每分钟在/home/shiyanlou
目录下创建一个以当前的年月日时分秒为名字的空白文件。 - 查看守护进程
虽然刚刚添加了任务,但是如果cron
的守护进程并没有启动,它根本都不会监测到有任务,当然也就不会执行.可以通过以下2种方式来确定cron
是否成功的在后台启动。
- 查看文件,可以看到已经自动执行了几次
挑战2 备份日志
- 目标:
- 为shiyanlou用户添加计划任务。
- 每天凌晨3点的时候定时备份alternatives.log到/home/shiyanlou/tmp/目录。
- 命名格式为年-月-日,比如今天是2017年4月1日,那么文件名为2017-04-01。
- 解答:
使用crontab -e
为当前用户添加计划任务,此时不能使用sudo,否则是给root用户添加计划任务。
添加如下代码即可:0 3 * * * cp alternatives.log /home/shiyanlou/tmp/$(date +\%Y-\%m-\%d)
实验10 命令执行顺序控制与管道
- 学习实践
- 有选择的执行命令
&& 表示前一条命令执行成功时才执行后一条命令,|| 表示上一条命令执行失败后才执行下一条命令
- cut命令,1,6显示第1和第6段,1~6显示1到6段。
-
wc
计数命令
wc 命令用于统计并输出一个文件中行、单词和字节的数目。-l
:行数-w
:单词数-c
:字节数-m
:字符数-L
:最长行字节数
-
wc
结合管道,统计/etc
下面所有目录数
实验11 简单的文本处理
- 学习实践
tr命令可以用来删除一段文本信息中的某些文字。或者将其进行转换。
-d参数:删除。
-s参数:去重。 - 作业
题目:在不使用转换工具的情况下,使用学过的命令手动完成 dos 文本格式到 UNIX 文本格式的转换。
使用tr -d '\r' <test.txt> tes.txt
进行转换,将test.txt转换为tst.txt。
实验12 数据流重定向
- 学习实践
- 重定向
分别进行:将cat
的连续输出(heredoc方式)重定向到一个文件;
将echo
命令通过管道传过来的数据作为cat命令的输入,将标准输出作为命令的输出;
将echo
命令的输出从默认的标准输出重定向到一个普通文件。
- 标准错误定向到标准输出再定向到文件
标准错误不能直接定向到标准输出,可以用以下两种方式:
-
tee
命令同时重定向到文件和终端
-
exec
实现shell重定向
- 创建、关闭文件描述符
- 作业
题目:理解下面这段代码的作用,实际这段代码不会正常工作,请结合这一小节的知识分析这段代码没有正确工作的原因,并设法解决这个问题。
while read filename; do
rm -iv $filename
done <<(ls)
理解:这段代码的本意是读取当前目录的文件列表,并有交互地删除。rm -iv
的作用是在删除时进行交互,并且显示步骤。它期待用户从标准输入中输入y或者n来进行是否删除的操作,但是标准输入被<<(ls)
重定向了,rm
命令在 <<(ls)
中寻找y或者n,找不到就中断退出了。
解决:标准输入一定要给到循环体,此时将标准输入复制一份,给予rm -iv
命令进行交互即可。
exec 8<&0 //此时使用3~8均可
while read filename; do
rm --iv $filename <&8
done <<(ls)
挑战3 历史命令
- 目标:
- 处理文本data
- 将结果写入result
- 结果包含次数和命令,如“
100 ls
”
- 解答:
cat data1 | cut -c 8- | sort |uniq -dc | sort -n -r | head -3 > result
实验13 正则表达式基础
- 学习实践
-
grep
操作,使用正则表达式(作业:结合正则表达式做更多练习)
注意:当^
放到中括号内为排除字符,否则表示行首。
- 使用扩展正则表达式,加
-E
,不加则不执行
-
sed
sed
工具用于过滤和转换文本的流编辑器。打印奇数行,并将"shiyanlou" 全局替换为"ly"。p
通常与-n
参数配合使用,不能省略最后的p
命令。
-
awk
文本处理语言\t
要用双引号。
- 作业
题目:基于 pattern space 和 hold space 实现将一个文本倒序输出和交换奇数行和偶数行。
- 反序
sed '1!G;h;$!d' test.txt
1!G
—— 只有第一行不执行G命令,将hold space中的内容append回到pattern spaceh
—— 第一行都执行h命令,将pattern space中的内容拷贝到hold space中$!d
—— 最后一行不执行。其它行执行d命令,删除当前行
- 奇偶互换
sed -n 'h;$!{n;G};p' test.txt
-n
—— -n参数静默模式,只打印受影响的行h
—— 将pattern space中内容拷贝到 hold space中$!{n,G}
—— 最后一行不执行。n进入下一行,G将hold space中内容append到pattern space中,appttern space中的两行位置交换了p
—— 打印出交换后的两行
注意:最后一行不执行的目的,是如果最后一行是奇数行,不需要交换直接打印。
挑战4 数据提取
- 目标:
在文件data2中匹配数字开头的行,结果写入/home/shiyanlou/num
文件
在文件data2中匹配出正确格式的邮箱,结果写入一个名为/home/shiyanlou/mail
的文件 - 解答:
- data2的内容
- 匹配数字开头的行
grep '^[[:digit:]]' data2>num
- 匹配正确格式邮箱
grep'^[[:alnum:]]*@[[:alnum:]]*\.com' data2>mail
实验14 Linux下软件安装
- 学习实践
-
apt-get
是用于处理 apt包的公用程序集,我们可以用它来在线安装、卸载和升级软件包等。
比较有用的几个参数:-f
——修复损坏的依赖关系-d
——只下载不安装--reinstall
——重新安装已经安装但可能存在问题的软件包 -
dpkg
工具——"Debian Package"的简写
可以安装deb
形式打包的软件包。 - 从二进制包安装
二进制包的安装比较简单,将从网络上下载的二进制包解压后放到合适的目录,然后将包含可执行的主程序文件的目录添加进PATH环境变量即可。
实验15、16 Linux 进程概念和管理
通过这两节大致了解进程的概念、进程之间存在的相互关系、进程的查看命令ps
、pstree
、top
、进程的管理命令kill
、nice
、renice
等。
实验17 Linux 日志系统
通过本实验,了解了较新的系统日志收集工具rsyslog及其配置文件,还有一个日志文件管理工具logrotate
,省心省力,不但可以压缩日志文件,减少存储空间,还可以将日志发送到指定E-mail,方便管理员及时查看日志。logrotate
是基于CRON
来运行的,其脚本是 /etc/cron.daily/logrotate
;同时我们可以在 /etc/logrotate
中找到其配置文件。
小结
本次进行了共计21个实验,即使以前使用过Ubuntu系统,也学习到了很多新的知识,将我对Linux系统的认识扳回了正确的方向,即使表面相似,内部的原理也是大有不同的。学习了很多知识,但是很多命令还不熟练,需要自己在实际使用中加深理解,熟练使用。