20165233 预备作业3 Linux安装及学习
Linux学习记录
别出心裁的Linux命令学习法学习总结
(由于我的电脑是Mac,Linux安装省略)
操作系统的功能:
- 管家婆和服务生
- 博客中对于这两个词含义的解释为
- 管家婆:通过进程、虚拟内存和文件三个重要抽象管理计算机的CPU、内存、I/O设备。
- 服务生:为用户提供shell,为程序员提供系统调用。
命令行的好处
主要是可以批处理并自动化,还有些功能GUI无法完成
由于我的电脑操作系统为MacOS,所以我自己总结出了快捷键的使用:
Alt+Ctrl+T
:打开终端(由于Mac没有打开终端的快捷键,所以我自己设置为与Ubuntu统一的快捷键。Mac如何设置打开终端的快捷键 )Command+T
:新建标签页Command + { 或 Command + Shift + [
:切换标签页Tab
:命令、文件名等自动补全功能。Ctrl+R
:快速检索使用过的历史命令Ctrl+C
:中断终端中正在执行的任务。
Linux基础入门
实验1 Linux 系统简介
- Linux是什么?
Linux 就是一个操作系统。Linux 主要是系统调用和内核那两层。当然直观地看,我们使用的操作系统还包含一些在其上运行的应用程序,比如文本编辑器、浏览器、电子邮件等。
- Shell是什么?
命令行解释器。
实验2 基本概念及操作
- Terminal是什么?
终端模拟器的程序。
- Shell的详细解释
可以接受用户输入命令的程序。
- 输入和输出
输入:
touch file
创建一个名为file的文件
cd /etc/
进入一个目录
pwd
查看当前所在目录
输出:
输出会返回你想要的结果,比如你要看什么文件,就会返回文件的内容。如果只是执行,执行失败会告诉你哪里错了,如果施行成功那么会没有输出,因为linux的哲学就是:没有结果就是最好的结果
- 问题1:实验过程中,输入
$ tail
,为什么接下来输入什么都没有任何反应? - 问题2:输入
$ find /
,为什么会不停地跳出很多乱七八糟的东西? - 快捷键总结
按键 | 作用 |
Ctrl+d |
键盘输入结束或退出终端 |
Ctrl+s |
暂停当前程序,暂停后按下任意键恢复运行 |
Ctrl+z |
将当前程序放到后台运行,恢复到前台为命令fg |
Ctrl+a |
将光标移至输入行头,相当于Home 键 |
Ctrl+e |
将光标移至输入行末,相当于End 键 |
Ctrl+k |
删除从光标所在位置到行末 |
Alt+Backspace |
向前删除一个单词 |
Shift+PgUp |
将终端显示向上滚动 |
Shift+PgDn |
将终端显示向下滚动 |
- 通配符: 指星号(*)和问号(?)
当查找文件夹时,可以使用它来代替一个或多个真正字符;当不知道真正字符或者懒得输入完整名字时,常常使用通配符代替一个或多个真正字符。
- Shell常用通配符
字符 | 含义 |
* |
匹配 0 或多个字符 |
? |
匹配任意一个字符 |
[list] |
匹配 list 中的任意单一字符 |
[!list] |
匹配 除list 中的任意单一字符以外的字符 |
[c1-c2] |
匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z] |
{string1,string2,...} |
匹配 string1 或 string2 (或更多)其一字符串 |
{c1..c2} |
匹配 c1-c2 中全部字符 如 |
-
问题3:
ls
的具体用法是什么?
(在教材中有时写在一个命令词以前,有时写在之后,有些混淆)解答:通过实验3的学习,了解了
ls
的用法:1、用它列出并显示当前目录下的文件
2、查看文件权限。
ls -l
:使用较长格式列出文件。ls -A
:显示除了 .(当前目录)和 ..(上一级目录)之外的所有文件,包括隐藏文件(Linux 下以 . 开头的文件为隐藏文件)。ls -dl<目录名>
:查看某一个目录的完整属性,而不是显示目录里面的文件属性.ls -AsSh
:显示所有文件大小,并以普通人类能看懂的方式呈现。其中小 s 为显示文件大小,大 S 为按文件大小排序。
-
-w
参数指定打印宽度,因为我们的环境在屏幕中显示比较小,必须要加上宽度限制。例:$ printerbanner -w 50 A
,"50"是上限宽度限制。
实验3 用户及文件权限管理
- 问题4:为什么输入命令行
$ who -r
之后,没有输出任何内容,并没有输出运行等级?运行等级又是什么? - 问题5:给新用户设置密码时,为何不能输入一串数字密码?
| sort
表示将读取的文本进行一个字典排序再输出- 关于文件类型,这里有一句话必须牢记:
Linux里面一切皆文件
文件中的软链接文件相当于Windows中的快捷方式。
-
一个目录同时具有读权限和执行权限才可以打开并查看内部文件而一个目录要有写权限才允许在其中创建其他文件,这是因为目录文件实际保存着该目录里面的文件的列表等信息。
-
修改文件权限,每个文件的三组权限(拥有者,所属用户组,其他用户,记住这个顺序是一定的)
方法一:二进制数字表示
chomd 700 iphone6
中7
指拥有者,即我自己可以、写、执行权限,0
和0
指所属用户组和其他用户无任何权限。方法二:加减赋值操作
g、o 还有 u 分别表示 group、others 和 user,+ 和 - 分别表示增加和去掉相应的权限。
chmod go-rw iphone6
指所属用户组和其他用户去掉读、写权限。 -
adduser 和 useradd 的区别是什么?
答:useradd 只创建用户,创建完了用 passwd lilei 去设置新用户的密码。adduser 会创建用户,创建目录,创建密码(提示你设置),做这一系列的操作。其实 useradd、userdel 这类操作更像是一种命令,执行完了就返回。而 adduser 更像是一种程序,需要你输入、确定等一系列操作。
实验4 Linux 目录结构及文件基本操作
-
FHS标准
-
目录的四种交互作用的形态
-
路径
- 绝对路径:
以根" / "目录为起点的完整路径,以你所要到的目录为终点,表现形式如:
/usr/local/bin
,表示根目录下的usr
目录中的local
目录中的bin
目录。- 相对路径:以当前目录
.
为起点,以你所要到的目录为终点
usr/local/bin
(这里假设你当前目录为根目录)。你可能注意到,我们表示相对路径实际并没有加上表示当前目录的那个 . ,而是直接以目录名开头,因为这个usr
目录为/
目录下的子目录,是可以省略这个 . 的(以后会讲到一个类似不能省略的情况);如果是当前目录的上一级目录,则需要使用..
,比如你当前目录为home
目录,根目录就应该表示为../../
,表示上一级目录(home
目录)的上一级目录( / 目录)。 -
新建空白文件使用
touch
新建目录使用
mkdir
,若要新建多级目录则须在mkdir
之后添加-p
-
复制文件到目录,使用
cp
复制目录,则须在
cp
后加-r
-
删除文件使用
rm
,但如果删除一些只读权限的文件时,会有删除提示,若想强制删除,则在rm
之后添加-f
删除目录在
rm
之后添加-r
-移动文件使用mv 源文件目录 目的目录
-
重命名文件使用
mv 旧文件名 新文件名
批量重命名使用
rename
-
查看文件
1、使用cat
快速查看文件
2、使用nl
命令查看文件
-b : 指定添加行号的方式,主要有两种:
-b a:表示无论是否为空行,同样列出行号("cat -n"就是这种方式)
-b t:只列出非空行的编号并列出(默认为这种方式)
-n : 设置行号的样式,主要有三种:
-n ln:在行号字段最左端显示
-n rn:在行号字段最右边显示,且不加 0
-n rz:在行号字段最右边显示,且加 0
-w : 行号字段占用的位数(默认为 6 位)
3、使用more
命令分页查看文件
可以使用 Enter 键向下滚动一行,使用 Space 键向下滚动一屏。
4、使用tail
命令查看文件
- 因为系统新增加一个用户,会将用户的信息添加到 `passwd`文件的最后,那么这时候我们就可以使用 `tail` 命令了。
- 若想只看一行,在`tail`之后加上`-n`再加上数字`1`就是查看一行文件。
- `-f`可以不停的读取某个文件的内容,实现动态查看,达到监视的目的。
- 查看文件类型
与Windows不同的是,Linux中的文件不是通过看后缀来查看文件类型的,而是利用file
命令。
实验5 环境变量与文件查找
-
变量
- 创建变量
tmp
😒 declare tmp - 赋值:$ tmp=shiyanlou
- 读取:$ echo $tmp
- 创建变量
-
环境变量
环境变量的作用域比自定义变量的要大。如 Shell 的环境变量作用于自身和它的子进程。
关于哪些变量是环境变量,可以简单地理解成在当前进程的子进程有效则为环境变量,否则不是。
- 用
export
命令来体会一下,先在Shell
中设置一个变量temp=shiyanlou
,然后再新创建一个子Shell
查看temp
变量的值:
-
添加自定义路径到
PATH
环境变量以
:
作为分割符;通过"$ PATH=$path:/自定义路径"注意:这里的路径必须为绝对路径
-
>>
表示将标准输出以追加的方式重定向到一个文件中,注意前面用到的>
是以覆盖的方式重定向到一个文件中
-变量修改
变量设置方式 | 说明 |
$ | 从头向后开始匹配,删除符合匹配字串的最短数据 |
$ | 从头向后开始匹配,删除符合匹配字串的最长数据 |
$ | 从尾向前开始匹配,删除符合匹配字串的最短数据 |
$ | 从尾向前开始匹配,删除符合匹配字串的最长数据 |
$ | 将符合旧字串的第一个字串替换为新的字串 |
$ | 将符合旧字串的全部字串替换为新的字串 |
-
变量删除:
$ unset
-
如何让环境变量立即生效?
$ source .zshrc
(zsh的配置文件home目录下的.zshrc) -
搜索文件
whereis
简单快速- 直接从数据库中查询
- 只能搜索二进制文件(-b),man 帮助文件(-m)和源代码文件(-s)
locate
快而全- 它可以用来查找指定目录下的不同文件类型
- 查找 /etc 下所有以 sh 开头的文件:
$ locate /etc/sh
- 查找 /usr/share/ 下所有 jpg 文件:
$ locate /usr/share/\*.jpg
.注意要添加*
号前面的反斜杠转义,否则会无法找到. - 如果想只统计数目可以加上
-c
参数,-i
参数可以忽略大小写进行查找,whereis
的-b
、-m
、-s
同样可以使用。
which
小而精- 通常使用
which
来确定是否安装了某个指定的软件,因为它只从PATH
环境变量指定的路径中去搜索命令
- 通常使用
- find 精而细
-
$ sudo find /etc/ -name interfaces
: 这条命令表示去/etc/
目录下面 ,搜索名字叫做interfaces
的文件或者目录。这是find
命令最常见的格式,千万记住find
的第一个参数是要搜索的地方. -
格式
基本命令格式为 find [path] [option] [action]
-
实验6 文件打包与解压缩
zip压缩打包与解压
- 使用 zip 打包文件夹:
$ zip -r -q -o shiyanlou.zip /home/shiyanlou
-r
参数表示递归打包包含子目录的全部内容,-q
参数表示为安静模式,即不向屏幕输出信息,-o
,表示输出文件,需在其后紧跟打包输出文件名。
设置压缩级别为 9 和 1(9 最大,1 最小),重新打包:
$ zip -r -9 -q -o shiyanlou_9.zip /home/shiyanlou -x ~/*.zip
这里添加了一个参数用于设置压缩级别 -[1-9],1 表示最快压缩但体积大,9 表示体积最小但耗时最久。最后那个-x
是为了排除我们上一次创建的 zip 文件,否则又会被打包进这一次的压缩文件中,注意:这里只能使用绝对路径,否则不起作用。
在-r
之后加-e
,便达到给zip文件加密的目的。
$ du -h shiyanlou.zip
du
命令查看打包后文件的大小
$ du -h -d 0 *.zip ~ | sort
-h
表示将信息变为可读的,-d
表示查看文件深度
$ file shiyanlou.zip
- 使用 unzip 命令解压缩 zip 文件
$ unzip shiyanlou.zip
将 shiyanlou.zip 解压到当前目录
$ unzip -q shiyanlou.zip -d ziptest
使用安静模式,将文件解压到指定目录
$ unzip -l shiyanlou.zip
不解压只查看压缩包的内容可以使用-l
参数
unzip -O GBK 中文压缩文件.zip
使用 -O(英文字母,大写 o)参数指定编码类型。通过此命令行来解决不兼容可能出现的中文变为乱码的情况。
rar 打包压缩命令(使用较少)
tar打包工具
- 创建一个 tar 包:
$ tar -cf shiyanlou.tar ~
-c
表示创建一个 tar 包文件,-f
用于指定创建的文件名,注意文件名必须紧跟在 -f
参数之后,比如不能写成tar -fc shiyanlou.tar
,可以写成tar -f shiyanlou.tar -c ~
。你还可以加上-v
参数以可视的的方式输出打包的文件。上面会自动去掉表示绝对路径的/
,你也可以使用 -P
保留绝对路径符。
- 解包一个文件(
-x
参数)到指定路径的已存在目录(-C
参数):
$ mkdir tardir
$ tar -xf shiyanlou.tar -C tardir
一个总结:
-
zip:
-
打包 :zip something.zip something (目录请加 -r 参数)
-
解包:unzip something.zip
-
指定路径:-d 参数
-
-
tar:
-
打包:tar -zcvf something.tar something
-
解包:tar -zxvf something.tar
-
指定路径:-C 参数
-
-
问题6:
zip打包的时候,文件后跟的目录一定需要有么?如果打包跟解包的目录位置重复了怎么办?
解:可以写文件的名字也可以写目录的名字;位置重复时,会跳出提示:是否替换之前同名的文件,可以选择是或否或重命名。
实验7 文件系统操作与磁盘管理
- 查看磁盘容量
$ df -h
(-h
增加可读性,以K,M,G为单位)
- 查看目录容量
$ du -h
只查看一级目录
$ du -d -h 0 ~
(-d
表示查看目录深度)
其他常用参数:
$ du -a
(显示目录中所有文件的大小)
$ du -s
(显示最后加总的值)
-
简单的磁盘管理
-
创建虚拟磁盘
dd
命令从标准输入读入用户输入到标准输出或者一个文件:$ dd of=test bs=10 count=1
或 $ dd if=/dev/stdin of=test bs=10 count=1
(
bs
是指定块的大小;count
是指定块的数量) -
使用
dd
命令创建虚拟镜像文件从
/dev/zero
设备创建一个容量为 256M 的空文件:$ dd if=/dev/zero of=virtual.img bs=1M count=256
-
使用 mkfs 命令格式化磁盘
$ sudo mkfs.ext4 virtual.img
-
使用 mount 命令挂载磁盘到目录树
知识回顾:挂载是指将一个设备挂接到一个已存在的目录上。我们要访问存储设备中的文件,必须将文件所在的分区挂载到一个已存在的目录上,然后通过访问这个目录来访问存储设备。
- mount命令的一般格式
mount [options] [source] [directory]
- 常用操作
mount [-o [操作选项]] [-t 文件系统类型] [-w|--rw|--ro] [文件系统源] [挂载点]
-
使用 fdisk 为磁盘分区
-
查看硬盘分区表信息
$ sudo fdisk -l
-
进入磁盘分区模式
$ sudo fdisk virtual.img
-
使用 losetup 命令建立镜像与回环设备的关联
$ sudo losetup /dev/loop0 virtual.img
(如果提示设备忙你也可以使用其它的回环设备,"ls /dev/loop*"参看所有回环设备)
(解除设备关联)
$ sudo losetup -d /dev/loop0
-
-
-
问题7:找出当前目录下面占用最大的前十个文件
$ du -h -a | sort -n -r | head -n 10
sort下的-n
指按照字符串表示的数字值来排序;-r
指按照反序排序;head下的-n
指取出前多少行。
实验8 Linux下的帮助命令
-
利用
type
来判断命令类型,是内建命令还是外建命令。 -
先利用
bash
进入bash中(由于zsh中内置并没有help
命令),而help
只能查询内建命令。
-但也有方法利用help
来查询外部命令:
ls --help
-
man
可以查询到比help
所查询出的更详细的解释信息,而且man
无论内建命令还是外部命令都可以查询。 -
info
可以查询到比man
还要详细的信息,一般在bash里面会自带有。
实验9 Linux任务计划crontab
- crontab的格式
Example of job definition:
.---------------- minute (0 - 59)
| .------------- hour (0 - 23)
| | .---------- day of month (1 - 31)
| | | .------- month (1 - 12) OR jan,feb,mar,apr ...
| | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
| | | | | * * * * * user-name command to be executed
- 问题8:
在添加一个计划任务时,crontab -e
之后,在文档后添加*/1 * * * * touch /home/shiyanlou/$(date +\%Y\%m\%d\%H\%M\%S)
命令,该任务是每分钟我们会在/home/shiyanlou目录下创建一个以当前的年月日时分秒为名字的空白文件,但在实验楼环境中第一个*
加不了是为什么?
解答:
添加新任务时,应先按A
进入编辑模式,才能正常添加任务的命令行。结束编辑按Command+C
(我的电脑是Mac,快捷键用法有别于别的系统)再按Shift
和:
,输入wq,退出。
crontab的准备
- 启动rsyslog(在自己本地中 Ubuntu 会默认自行启动不需要手动启动)
sudo service rsyslog start
- 启动crontab(同样在本实验环境中需要手动启动,自己的本地 Ubuntu 的环境中也不需要手动启动)
sudo cron -f &
-
crontab的使用
-
添加计划任务
crontab -e
一个计划任务举例:该任务是每分钟我们会在/home/shiyanlou目录下创建一个以当前的年月日时分秒为名字的空白文件:
*/1 * * * * touch /home/shiyanlou/$(date +%Y%m%d%H%M%S)
-
查看我们添加了哪些任务
crontab -l
-
删除任务
crontab -r
-
-
通过以下2种方式来确定我们的 cron 是否成功的在后台启动:
ps aux | grep cron
or
pgrep cron
-
查看到执行任务命令之后在日志中的信息反馈
sudo tail -f /var/log/syslog
实验10 命令执行顺序控制与管道
-
想一次执行多条程序,利用
;
进行连接。 -
有选择的执行命令
-
使用which来查找是否安装某个命令,如果找到就执行该命令,否则什么也不做
$ which cowsay>/dev/null && cowsay -f head-in ohch~
-
&&
实现选择性执行,如果前面命令执行的结果返回0,则执行下一条命令,否则不执行。||
实现与&&
完全相反的控制效果。 -
使用
$?
环境变量获取上一次命令返回结果。
-
-
管道
-
试用
$ ls -al /etc | less
通过管道将前一个命令(ls)的输出作为下一个命令(less)的输入,然后就可以一行一行地看。
-
cut 命令,打印每一行的某一字段
-
打印/etc/passwd文件中以:为分隔符的第1个字段和第6个字段分别表示用户名和其家目录:
$ cut /etc/passwd -d ':' -f 1,6
-
打印/etc/passwd文件中每一行的前N个字符:
前五个(包含第五个)
$ cut /etc/passwd -c -5
前五个之后的(包含第五个)
$ cut /etc/passwd -c 5-
第五个
$ cut /etc/passwd -c 5
2到5之间的(包含第五个)
$ cut /etc/passwd -c 2-5
-
-
grep 命令,在文本中或 stdin 中查找匹配字符串
grep命令的一般形式为:
grep [命令选项]... 用于匹配的表达式 [文件]...
-
wc 命令,用于统计并输出一个文件中行、单词和字节的数目
-
行数
$ wc -l /etc/passwd
-
单词数
$ wc -w /etc/passwd
-
字节数
$ wc -c /etc/passwd
-
字符数
$ wc -m /etc/passwd
-
最长行字节数
$ wc -L /etc/passwd
-
-
sort 排序命令
-
uniq 去重命令
-
实验11 简单的文本处理
文本处理命令
-
tr 命令:可以用来删除一段文本信息中的某些文字。或者将其进行转换。
- 使用方式:
tr [option]...SET1 [SET2]
-
常用选项:
-
删除 "hello shiyanlou" 中所有的'o','l','h'
$ echo 'hello shiyanlou' | tr -d 'olh'
-
将"hello" 中的ll,去重为一个l
$ echo 'hello' | tr -s 'l'
-
将输入文本,全部转换为大写或小写输出
$ echo 'input some text here' | tr '[:lower:]' '[:upper:]'
(上面的'[:lower:]' '[:upper:]'你也可以简单的写作'[a-z]' '[A-Z]',当然反过来将大写变小写也是可以的)
-
-
col 命令: 可以将Tab换成对等数量的空格键,或反转这个操作。
-
使用方式:
col [option]
-
常规选项:
-x
:将Tab转换为空格-h
:将空格转换为Tab(默认选项)
-
-
join 命令:这个命令就是用于将两个文件中包含相同内容的那一行合并在一起。
-
使用方式:
join [option]... file1 file2
-
-
问题9: 在使用
join
命令时,当合并两个比较小的文件时,直接利用基本使用方式就行,而合并例如/etc/passwd
和/etc/group
这种文件时,join
之前为什么要加sudo
? -
paste 命令: 与join 命令类似,它是在不对比数据的情况下,简单地将多个文件合并一起,以Tab隔开。
-
使用方式:
paste [option] file...
-
常规选项:
-d
:指定合并的分隔符,默认为Tab-s
:不合并到一行,每个文件为一行
-