第一周作业学习笔记

第一周学习笔记

疑问

1.who -r没有反应
首先我查询了运行等级的含义。

  • 0: 关机
  • 1: 单用户
  • 2: 无网络的多用户
  • 3: 命令行模式
  • 4: 未用
  • 5: GUI(图形桌面 模式)
  • 6 : 重启
    自己的实体机或者虚拟机操作没有问题
    大概是实验楼的那个里面没权限吧
    用户权限管理还需要反复练习。记不住。。
    2.实验楼课程第二个实验的讲解部分出现了三个词,我不知道它们三个是什么关系。查阅了度娘,归纳如下:
  • 终端:
    在UNIX/LINUX系统中,用户通过终端登录系统后得到一个Shell进程,这个终端就成为Shell进程的控制终端。linux下一切皆文件,所以终端本质上也是一个文件,因此每个终端设备都对应一个不同的设备文件。换句话来说:进程与终端相关联,所以可以通过改变进程关联的终端设备文件,使某终端的进程运行在另一个终端。终端指的是硬件设备通常指的是那些连接远程计算设备的只有输入输出没有处理器的硬件设备。shell指的是外壳程序,处于操作系统内核和应用程序之间。是用户和系统交互的界面。也理解成命令解释器。
  • 终端模拟器:
    给开发者用的,开发者开发应用之后,一般都会在模拟器上测试。模拟器其实也是虚拟机的一种,他和我们现在所说的虚拟机的差别在于,模拟器使用固化的操作系统,不能随意更改操作系统,且结构简单,不能随意添加虚拟硬件设备。而虚拟机有如一台终端机,你可以随意安装操作系统,随意更改硬件配置,模仿程度高。
  • shell:
    终端是敲命令的工具 shell就是管理系统的命令。用终端模拟器就是连接远程计算设备并返回一个shell。

实验三

2.1用户

  • who用法
    who -a |打印能打印的全部
    -d |打印死掉的进程
    -m |同am i,mom likes
    -q |打印当前登录用户数及用户名
    -u |打印当前登录用户登录信息
    -r |打印运行等级

2.2创建用户su,su- 与 sudo

  • sudo
    创建用户需要 root 权限,这里就要用到 sudo 这个命令了。不过使用这个命令有两个大前提,一是你要知道当前登录用户的密码,二是当前用户必须在 sudo 用户组。shiyanlou 用户也属于 sudo 用户组
    创建用户
sudo adduser lilei

添加用户到系统,并创建home目录

ls /home
  • su
    su 可以切换到用户 user,执行时需要输入目标用户的密码,sudo 可以以特权级别运行 cmd 命令,需要当前用户属于 sudo 组,且需要输入当前用户的密码。su - 命令也是切换用户,同时环境变量也会跟着改变成目标用户的环境变量。
  • su -
    切换用户lilei(需要密码)
su -l lilei

退出当前用户跟退出终端一样, exit 命令或者使用快捷键 Ctrl+d

2.3 用户组 groups

查询用户组shiyanlou属于哪个用户组,冒号之后是组名

groups shiyanlou

新建用户如果不指定用户组的话,默认会自动创建一个与用户名相同的用户组
将其它用户加入 sudo 用户组需要root用户组密码即实验楼密码

su shiyanlou 
groups lilei
 sudo usermod -G sudo lilei
groups lilei

2.4删除用户

删除用户

sudo deluser lilei --remove-home

3.1 查看文件权限

-ls
使用较长格式列出文件:

 ls -l

使用较长格式更直观列出文件:

 ls -lh

当前、上一级、隐藏文件可以与h组合使用

ls -A

查看某一个目录的完整属性而不是显示目录里面的文件属性

ls -dl <目录名>

显示所有文件大小

 ls -AsSh

其中小 s 为显示文件大小,大 S 为按文件大小排序,若需要知道如何按其它方式排序

  • 文件类型
    关于文件类型,这里有一点你必需时刻牢记 Linux 里面一切皆文件,正因为这一点才有了设备文件( /dev 目录下有各种设备文件,大都跟具体的硬件设备相关)这一说。 socket:网络套接字,具体是什么,感兴趣的用户可以自己去了解或期待实验楼的后续相关课程。pipe 管道,这个东西很重要,我们以后将会讨论到,这里你先知道有它的存在即可。软链接文件:链接文件是分为两种的,另一种当然是“硬链接”(硬链接不常用,具体内容不作为本课程讨论重点,而软链接等同于 Windows 上的快捷方式,你记住这一点就够了)
  • 权限
    加粗文字
    权限,表示你可以使用 cat 之类的命令来读取某个文件的内容;写权限,表示你可以编辑和修改某个文件; 执行权限,通常指可以运行的二进制程序文件或者脚本文件,如同 Windows 上的 exe 后缀的文件,不过 Linux 上不是通过文件后缀名来区分文件的类型。你需要注意的一点是,一个目录同时具有读权限和执行权限才可以打开并查看内部文件,而一个目录要有写权限才允许在其中创建其它文件,这是因为目录文件实际保存着该目录里面的文件的列表等信息。
  • 文件大小

3.2变更文件所有者

  • 新建文件命名为 “ iphone6 ”可见文件所有者是 lilei
$ cd /home/lilei
$ touch iphone6

变更文件所有者为 shiyanlou :

$ cd /home/lilei
$ ls iphone6
$ sudo chown shiyanlou iphone6

查看文件所有者成功修改为 shiyanlou

ll iphone6

实验四:

1.FHS标准

tree

tree /
sudo apt-get update
sudo apt-get install tree

2.目录

使用 cd 命令可以切换目录,在 Linux 里面使用 . 表示当前目录,.. 表示上一级目录(注意,我们上一节介绍过的,以 . 开头的文件都是隐藏文件,所以这两个目录必然也是隐藏的,你可以使用 ls -a 命令查看隐藏文件), - 表示上一次所在目录,~ 通常表示当前用户的 home 目录。使用 pwd 命令可以获取当前所在路径(绝对路径)。
进入上一级目录:

$ cd ..

进入你的 home 目录:

$ cd ~ 

或者

cd /home/<你的用户名> 

使用 pwd 获取当前路径:

$ pwd

绝对路径
关于绝对路径,简单地说就是以根" / "目录为起点的完整路径,以你所要到的目录为终点,表现形式如: /usr/local/bin,表示根目录下的 usr 目录中的 local 目录中的 bin 目录。
相对路径
相对路径,也就是相对于你当前的目录的路径,相对路径是以当前目录 . 为起点,以你所要到的目录为终点,表现形式如: usr/local/bin

cd /usr/local/bin

或者

cd ../../usr/local/bin

目录切换的过程中请多使用 Tab 键自动补全,可避免输入错误,连续按两次 Tab 可以显示全部候选结果

3.Linux 文件基本操作

3.1 新建

  • touch 新建
    创建名为 test 的空白文件,因为在其它目录没有权限,所以需要先 cd ~ 切换回用户的 /home/shiyanlou 目录:
$ cd ~
$ touch test
  • mkdir新建目录
mkdir mydir
  • 创建父目录
mkdir -p father/son/grandson

3.2 复制

  • cp(copy)复制文件
    将之前创建的“ test ”文件复制到“ /home/shiyanlou/father/son/grandson ”目录中:
$ cp test father/son/grandson
  • 复制目录
    不可直接复制目录
cp -r father family

3.3删除

  • rm删除文件
    使用 rm(remove files or directories)命令删除一个文件:
$ rm test
  • -f 参数强制删除:
$ rm -f test
  • rm删除目录
    跟复制目录一样,要删除一个目录,也需要加上 -r 或 -R 参数:
$ rm -r family

3.4 移动文件和删除文件

  • mv移动文件 ()
    $ mkdir Documents
    $ mv file1 Documents
  • 重命名文件
    将文件“ file1 ”重命名为“ myfile ”:
    mv 旧的文件名 新的文件名:
$ mv file1 myfile
  • rename批量重命名
    要用 perl 正则表达式来作为参数,关于正则表达式我们要在后面才会介绍到,
$ cd /home/shiyanlou/
# 使用通配符批量创建 5 个文件:
$ touch file{1..5}.txt
# 批量将这 5 个后缀为 .txt 的文本文件重命名为以 .c 为后缀的文件:
$ rename 's/\.txt/\.c/' *.txt
# 批量将这 5 个文件,文件名和后缀改为大写:
$ rename 'y/a-z/A-Z/' *.c

3.5 查看文件

  • cat
 cat passwd
可以加上 -n 参数显示行号:
$ cat -n passwd

nl 命令,添加行号并打印,这是个比 cat -n 更专业的行号打印命令。

这里简单列举它的常用的几个参数:

  • -b : 指定添加行号的方式,主要有两种:
    -b a:表示无论是否为空行,同样列出行号("cat -n"就是这种方式)
    -b t:只列出非空行的编号并列出(默认为这种方式)
  • -n : 设置行号的样式,主要有三种:
    -n ln:在行号字段最左端显示
    -n rn:在行号字段最右边显示,且不加 0
    -n rz:在行号字段最右边显示,且加 0
  • -w : 行号字段占用的位数(默认为 6 位)

3.6 file 命令查看文件的类型

file /bin/ls

3.7 编辑文件

vimtutor

3.8 眼睛

xeyes

你可以使用如下命令将它放到后台运行:

$ nohup xeyes &

实验五

5.1环境变量

变量类型有三种:

  • 当前 Shell 进程私有用户自定义变量 如上面我们创建的 tmp 变量,只在当前 Shell 中有效

  • Shell 本身内建的变量

  • 从自定义变量导出的环境变量

  • set 显示当前 Shell 所有变量,包括其内建环境变量(与 Shell 外观等相关),用户自定义变量及导出的环境变量。

  • env 显示与当前用户相关的环境变量,还可以让命令在指定环境中运行。

  • export 显示从 Shell 中导出成环境变量的变量,也能通过它将自定义变量导出为环境变量
    /etc/bashrc(有的 Linux 没有这个文件) 和 /etc/profile ,它们分别存放的是 shell 变量和环境变量。

$temp=shiyanlou
$ export temp_env=shiyanlou
$ env|sort>env.txt
$ export|sort>export.txt
$ set|sort>set.txt

上述操作将命令输出通过管道 | 使用 sort 命令排序,再重定向到对象文本文件中。

$ vimdiff env.txt export.txt set.txt

使用 vimdiff 工具比较导出的几个文件的内容
这里介绍两个重要文件 /etc/bashrc(有的 Linux 没有这个文件) 和 /etc/profile ,它们分别存放的是 shell 变量和环境变量。还有要注意区别的是每个用户目录下的一个隐藏文件:
.profile 可以用 ls -a 查看

cd /home/shiyanlou
ls -a 

.profile 只对当前用户永久生效。而写在 /etc/profile 里面的是对所有用户永久生效,添加一个永久生效的环境变量,打开 /etc/profile,在最后加上添加的环境变量.
查看 PATH 环境变量的内容:
$ echo $PATH

5.2

创建一个 Shell 脚本文件:

$ gedit hello_shell.sh
在脚本中添加如下内容,保存并退出(注意不要省掉第一行,这不是注释,论坛有用户反映有语法错误,就是因为没有了第一行):

#!/bin/bash
for ((i=0; i<10; i++));do
    echo "hello shell"
done
exit 0

为文件添加可执行权限:

$ chmod 755 hello_shell.sh
执行脚本:

$ ./hello_shell.sh
创建一个 C 语言“ hello world ”程序:

$ gedit hello_world.c

include <stdio.h>

int main(void)
{
printf("hello world!\n");
return 0;
}
保存后使用 gcc 生成可执行文件:

$ gcc -o hello_world hello_world.c
gcc 生成二进制文件默认具有可执行权限,不需要修改

在 /home/shiyanlou 家目录创建一个 mybin 目录,并将上述 hello_shell.sh 和 hello_world 文件移动到其中:

$ mkdir mybin
$ mv hello_shell.sh hello_world mybin/
现在你可以在 mybin 目录中分别运行你刚刚创建的两个程序:

$ cd mybin
$ ./hello_shell.sh
$ ./hello_world

5.3 添加自定义路径:

$ PATH=$PATH:/home/shiyanlou/mybin

注意这里一定要使用绝对路径。
现在你就可以在任意目录执行那两个命令了(注意需要去掉前面的 ./)

home 目录中有一个 Shell 每次启动时会默认执行一个配置脚本,以初始化环境。zsh 的配置文件是 .zshrc,相应 Bash 的配置文件为 .bashrc .一般只修改用户目录下的配置文件。

  • 自动执行添加内容到 .zshrc 中:
$ echo "PATH=$PATH:/home/shiyanlou/mybin" >> .zshrc

上述命令中 >> 表示将标准输出以追加的方式重定向到一个文件中,注意前面用到的 > 是以覆盖的方式重定向到一个文件中,使用的时候一定要注意分辨。在指定文件不存在的情况下都会创建新的文件。

5.4变量修改

\({变量名#匹配字串} 从头向后开始匹配,删除符合匹配字串的最短数据 \){变量名##匹配字串} 从头向后开始匹配,删除符合匹配字串的最长数据
\({变量名%匹配字串} 从尾向前开始匹配,删除符合匹配字串的最短数据 \){变量名%%匹配字串} 从尾向前开始匹配,删除符合匹配字串的最长数据
\({变量名/旧的字串/新的字串} 将符合旧字串的第一个字串替换为新的字串 \){变量名//旧的字串/新的字串} 将符合旧字串的全部字串替换为新的字串

  • 将 PATH 赋值给一个新的自定义变量 path:
    为了避免操作失误导致命令找不到
$ path=$PATH
$ echo $path
$ path=${path%/home/shiyanlou/mybin}
# 或使用通配符,*表示任意多个任意字符
$ path=${path%*/mybin}
  • 变量删除
    可以使用 unset 命令删除一个环境变量:
unset temp

5.3 搜索文件

  • whereis 简单快速
$whereis who
  • locate 快而全
    通过“ /var/lib/mlocate/mlocate.db ”数据库查找,不过这个数据库也不是实时更新的,系统会使用定时任务每天自动执行 updatedb 命令更新一次,所以有时候你刚添加的文件,它可能会找不到,需要手动执行一次 updatedb 命令
    查找 /etc 下所有以 sh 开头的文件:
$ sudo apt-get install locate
$ locate /etc/sh

注意,它不只是在 /etc 目录下查找,还会自动递归子目录进行查找。
查找 /usr/share/ 下所有 jpg 文件:

$ locate /usr/share/\*.jpg

注意要添加 * 号前面的反斜杠转义,否则会无法找到。
如果想只统计数目可以加上 -c 参数,-i 参数可以忽略大小写进行查找,whereis 的 -b、-m、-s 同样可以使用

  • which 小而精
    which 本身是 Shell 内建的一个命令,我们通常使用 which 来确定是否安装了某个指定的软件,因为它只从 PATH 环境变量指定的路径中去搜索命令:
$ which man
  • find 精而细
    find 应该是这几个命令中最强大的了,它不但可以通过文件类型、文件名进行查找而且可以根据文件的属性(如文件的时间戳,文件的权限等)进行搜索。find 命令强大到,要把它讲明白至少需要单独好几节课程才行,我们这里只介绍一些常用的内容。
    这条命令表示去 /etc/ 目录下面 ,搜索名字叫做 interfaces 的文件或者目录。这是 find 命令最常见的格式,千万记住 find 的第一个参数是要搜索的地方:
$ sudo find /etc/ -name interfaces

注意 find 命令的路径是作为第一个参数的, 基本命令格式为 find [path] [option] [action]
-atime 最后访问时间
-ctime 最后修改文件内容的时间
-mtime 最后修改文件属性的时间

  • -mtime 参数举例:
    -mtime n:n 为数字,表示为在 n 天之前的“一天之内”修改过的文件
    -mtime +n:列出在 n 天之前(不包含 n 天本身)被修改过的文件
    -mtime -n:列出在 n 天之内(包含 n 天本身)被修改过的文件
    -newer file:file 为一个已存在的文件,列出比 file 还要新的文件名
  • 列出 home 目录中,当天(24 小时之内)有改动的文件:
find ~ -mtime 0
  • 列出用户家目录下比 Code 文件夹新的文件:
 find ~ -newer /home/shiyanlou/Code

实验六

6.1

  • 常见的格式
    *.zip zip 程序打包压缩的文件
    *.rar rar 程序压缩的文件
    *.7z 7zip 程序压缩的文件
    *.tar tar 程序打包,未压缩的文件
    *.gz gzip 程序(GNU zip)压缩的文件
    *.xz xz 程序压缩的文件
    *.bz2 bzip2 程序压缩的文件
    *.tar.gz tar 打包,gzip 程序压缩的文件
    *.tar.xz tar 打包,xz 程序压缩的文件
    *tar.bz2 tar 打包,bzip2 程序压缩的文件
    *.tar.7z tar 打包,7z 程序压缩的文件

6.2 压缩

  • 使用 zip 打包文件夹:
$ cd /home/shiyanlou
$ zip -r -q -o shiyanlou.zip /home/shiyanlou/Desktop
$ du -h shiyanlou.zip
$ file shiyanlou.zip

上面命令将目录 /home/shiyanlou/Desktop 打包成一个文件,查看了打包后文件的大小和类型。-r 参数表示递归打包包含子目录的全部内容,-q 参数表示为安静模式,即不向屏幕输出信息,-o,表示输出文件,需在其后紧跟打包输出文件名。后面使用 du 命令查看打包后文件的大小

  • 设置压缩级别为 9 和 1(9 最大,1 最小),重新打包:
$ zip -r -9 -q -o shiyanlou_9.zip /home/shiyanlou/Desktop -x ~/*.zip
$ zip -r -1 -q -o shiyanlou_1.zip /home/shiyanlou/Desktop -x ~/*.zip

这里添加了一个参数用于设置压缩级别 -[1-9],1 表示最快压缩但体积大,9 表示体积最小但耗时最久。最后那个 -x 是为了排除我们上一次创建的 zip 文件,否则又会被打包进这一次的压缩文件中,注意:这里只能使用绝对路径,否则不起作用。

  • du 命令分别查看默认压缩级别、最低、最高压缩级别及未压缩的文件的大小:
$ du -h -d 0 *.zip ~ | sort
  • 创建加密 zip 包
    使用 -e 参数可以创建加密压缩包:
$ zip -r -e -o shiyanlou_encryption.zip /home/shiyanlou/Desktop

6.3 解压

  • shiyanlou.zip 解压到当前目录:
$ unzip shiyanlou.zip

-使用安静模式,将文件解压到指定目录:

$ unzip -q shiyanlou.zip -d ziptest

上述指定目录不存在,将会自动创建。如果你不想解压只想查看压缩包的内容你可以使用 -l 参数:

$ unzip -l shiyanlou.zip
  • -O(英文字母,大写 o)参数指定编码类型:
unzip -O GBK 中文压缩文件.zip

6.4 tar 工具

  • 创建一个 tar 包:
$ tar -cf shiyanlou.tar /home/shiyanlou/Desktop

上面命令中,-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

只查看不解包文件 -t 参数:

$ tar -tf shiyanlou.tar

保留文件属性和跟随链接(符号链接或软链接),有时候我们使用 tar 备份文件当你在其他主机还原时希望保留文件的属性(-p 参数)和备份链接指向的源文件而不是链接本身(-h 参数):

$ tar -cphf etc.tar /etc

对于创建不同的压缩格式的文件,对于 tar 来说是相当简单的,需要的只是换一个参数,这里我们就以使用 gzip 工具创建 *.tar.gz 文件为例来说明。

我们只需要在创建 tar 文件的基础上添加 -z 参数,使用 gzip 来压缩文件:

$ tar -czf shiyanlou.tar.gz /home/shiyanlou/Desktop

解压 *.tar.gz 文件:

$ tar -xzf shiyanlou.tar.gz

现在我们要使用其它的压缩工具创建或解压相应文件只需要更改一个参数即可:
压缩文件格式 参数
*.tar.gz -z
*.tar.xz -J
*tar.bz2 -j

  • 使用 du 命令查看目录的容量
    这个命令前面其实已经用了很多次了:
# 默认同样以 块 的大小展示
$ du 
# 加上`-h`参数,以更易读的方式展示
$ du -h
  • -d参数指定查看目录的深度
# 只查看1级目录的信息
$ du -h -d 0 ~
# 查看2级
$ du -h -d 1 ~
  • dd命令从标准输入读入用户的输入到标准输出或者一个文件中:
# 输出到文件
$ dd of=test bs=10 count=1 # 或者 dd if=/dev/stdin of=test bs=10 count=1
# 输出到标准输出
$ dd if=/dev/stdin of=/dev/stdout bs=10 count=1
# 注
在打完了这个命令后,继续在终端打字,作为你的输入

上述命令从标准输入设备读入用户输入(缺省值,所以可省略)然后输出到 test 文件,bs(block size)用于指定块大小(缺省单位为 Byte,也可为其指定如'K','M','G'等单位),count用于指定块数量

  • dd 命令创建虚拟镜像文件
    通过上面一小节,你应该掌握了dd的基本使用,下面就来使用dd命令来完成创建虚拟磁盘的第一步。
    从/dev/zero设备创建一个容量为 256M 的空文件:
$ dd if=/dev/zero of=virtual.img bs=1M count=256
$ du -h virtual.img
  • mkfs 命令格式化磁盘(我们这里是自己创建的虚拟磁盘镜像)
    虚拟磁盘镜像格式化为ext4文件系统:
$ sudo mkfs.ext4 virtual.img
  • mount 命令挂载磁盘到目录树
    mount来查看下主机已经挂载的文件系统:
$ sudo mount

挂载真正的磁盘到目录树呢,mount命令的一般格式如下:

mount [options] [source] [directory]

一些常用操作:

mount [-o [操作选项]] [-t 文件系统类型] [-w|--rw|--ro] [文件系统源] [挂载点]
现在直接来挂载我们创建的虚拟磁盘镜像到/mnt目录:
$ mount -o loop -t ext4 virtual.img /mnt 
# 也可以省略挂载类型,很多时候 mount 会自动识别
# 以只读方式挂载
$ mount -o loop --ro virtual.img /mnt
# 或者mount -o loop,ro virtual.img /mnt

使用 umount 命令卸载已挂载磁盘

# 命令格式 sudo umount 已挂载设备名或者挂载点,如:
$ sudo umount /mnt
  • fdisk 为磁盘分区(关于分区的一些概念不清楚的用户请参看主引导记录)
    同样因为环境中没有物理磁盘,也无法创建虚拟磁盘的原因我们就无法实验练习使用该命令了,下面我将以我的物理主机为例讲解如何为磁盘分区。
# 查看硬盘分区表信息
$ sudo fdisk -l
# 进入磁盘分区模式
$ sudo fdisk virtual.img
  • losetup 命令建立镜像与回环设备的关联
    同样因为环境原因中没有物理磁盘,也没有 loop device 的原因我们就无法实验练习使用该命令了,下面我将以我的物理主机为例讲解。
$ sudo losetup /dev/loop0 virtual.img
# 如果提示设备忙你也可以使用其它的回环设备,"ls /dev/loop*"参看所有回环设备
# 解除设备关联
$ sudo losetup -d /dev/loop0

然后再使用mkfs格式化各分区(前面我们是格式化整个虚拟磁盘镜像文件或磁盘),不过格式化之前,我们还要为各分区建立虚拟设备的映射,用到kpartx工具,需要先安装:

$ sudo apt-get install kpartx
$ sudo kpartx -av /dev/loop0
# 取消映射
$ sudo kpartx -dv /dev/loop0

格式化,我们将其全部格式化为 ext4:

$ sudo mkfs.ext4 -q /dev/mapper/loop0p1
$ sudo mkfs.ext4 -q /dev/mapper/loop0p5
$ sudo mkfs.ext4 -q /dev/mapper/loop0p6

在/media目录下新建四个空目录用于挂载虚拟磁盘:

$ mkdir -p /media/virtualdisk_{1..3}
# 挂载磁盘分区
$ sudo mount /dev/mapper/loop0p1 /media/virtualdisk_1
$ sudo mount /dev/mapper/loop0p5 /media/virtualdisk_2
$ sudo mount /dev/mapper/loop0p6 /media/virtualdisk_3
# 卸载磁盘分区
$ sudo umount /dev/mapper/loop0p1
$ sudo umount /dev/mapper/loop0p5
$ sudo umount /dev/mapper/loop0p6
$ df -h

实验八

8.1 命令类型

  • type 命令来区分命令是内建的还是外部
    例如这两个得出的结果是不同的
type exit


type vim
type ls
  • 得到这样的结果说明是内建命令


xxx is a shell builtin

得到这样的结果说明是外部命令

xxx is an alias for xx --xxx


8.2 常见命令

  • help命令
    实验环境是 zsh,而 zsh 中内置并没有 help 命令,进入 bash 中(在 bash 中内置有该命令

bash
ls --help


  • man
man ls
  • info
info ls

实验九 Linux任务计划crontab

9.1crontab 准备

  • rsyslog查看日志信息

来源

sudo apt-get install -y rsyslog

sudo service rsyslog start

9.2 crontab 使用

man crontab

  • crontab [-e [UserName]|-l [UserName]|-r [UserName]|-v [UserName]|File ]
    说明:
    crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。
  • -u user 是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。
  • -e [UserName]: 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe)
  • -r [UserName]: 删除目前的时程表
  • -l [UserName]: 列出目前的时程表
  • -v [UserName]:列出用户cron作业的状态
    时程表的格式如下:
    f1 f2 f3 f4 f5 program
    其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程式。
    当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程式,其余类推
    当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其余类推
    当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其余类推
    当 f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行,f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行,其余类推
    使用者也可以将所有的设定先存放在档案 file 中,用 crontab file 的方式来设定时程表。
  • 每月每天每小时的第 0 分钟执行一次 /bin/ls :
0 * * * * /bin/ls
  • 在 12 月内, 每天的早上 6 点到 12 点中,每隔 20 分钟执行一次 /usr/bin/backup :
*/20 6-12 * 12 * /usr/bin/backup
  • 注意:
  1. 当程式在你所指定的时间执行后,系统会寄一封信给你,显示该程式执行的内容,若是你不希望收到这样的信,请在每一行空一格之后加上 > /dev/null 2>&1 即可。
  2. %在crontab中被认为是newline,要用\来escape才行。比如crontab执行行中,如果有"date +%Y%m%d",必须替换为:"date +%Y%m%d"
  • 添加任务
    在文档的最后一排加上这样一排命令,该任务是每分钟我们会在/home/shiyanlou目录下创建一个以当前的年月日时分秒为名字的空白文件
*/1 * * * * touch /home/shiyanlou/$(date +\%Y\%m\%d\%H\%M\%S)

  • 查看添加的任务

crontab -l

实验十 命令执行顺序控制与管道

顺序执行多条命令



$ sudo apt-get update;sudo apt-get install some-tool;some-tool
# 

##有选择性的来执行命令
- 使用whic
查找是否安装某个命令,如果找到就执行该命令,否则什么也不做(虽然这个操作没有什么实际意义,但可帮你更好的理解一些概念)

$ which cowsay>/dev/null && cowsay -f head-in ohch~

&&就是用来实现选择性执行的,它表示如果前面的命令执行结果(不是表示终端输出的内容,而是表示命令执行状态的结果)返回0则执行后面的,否则不执行,你可以从$?环境变量获取上一次命令的返回结果.||在这里就是与&&相反的控制效果,当上一条命令执行结果为≠0($?≠0)时则执行它后面的命令

$ which cowsay>/dev/null || echo "cowsay has not been install, please run 'sudo apt-get install cowsay' to install"


#实验十一
##tr 命令
- 删除一段文本信息中的某些文字或者转换

tr [option]...SET1 [SET2]

常用的选项有:
-d	删除和set1匹配的字符,注意不是全词匹配也不是按字符顺序匹配
-s	去除set1指定的在输入文本中连续并重复的字符
操作举例:

删除 "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]',当然反过来将大写变小写也是可以的

去除oops.txt里面的重复的小写字符 ( # -s会保留第一个字符)

[root@localhost ~]# cat oops.txt
ddddfffabccccc
lerrrrdddd
[root@localhost ~]# tr -s "a-z" < oops.txt > result.txt
[root@localhost ~]# cat result.txt

  • 删除空行(除了第一行外)
    [root@localhost ~]# cat oops.txt
    ddddfffabccccc
    lerrrrdddd
    [root@localhost ~]# tr -s "\012" < oops.txt > result.txt
    [root@localhost ~]# cat result.txt
  • 删除所有行结束符
    [root@localhost ~]# cat oops.txt
    ddddfffabccccc
    lerrrrdddd
    [root@localhost ~]# tr -d "\012" <oops.txt > result.txt
    [root@localhost ~]# cat result.txt
  • 小写到大写
    [root@localhost ~]# cat oops.txt
    ddddfffabccccc
    errrrdddd
    [root@localhost ~]# cat oops.txt | tr "a-z" "A-Z" > result.txt
    [root@localhost ~]# cat result.txt
  • 删除指定的字符(# -d 与 -s 不同,-d会全部删除,但-s会保留第一个)
    [root@localhost ~]# cat oops.txt
    ddddfffabccccc
    errrrdddd
    [root@localhost ~]# cat oops.txt | tr -d "bd" > result.txt
    [root@localhost ~]# cat result.txt
    fffaccccc
    errrr
    [root@localhost ~]# cat oops.txt | tr -s "bd" > result.txt
    [root@localhost ~]# cat result.txt
    dfffabccccc
    errrrd
  • 替代指定的字符(#一对一的替代)
    [root@localhost ~]# cat oops.txt
    ddddfffabccccc
    errrrdddd
    [root@localhost ~]# cat oops.txt | tr "bd" "BD" > result.txt
    [root@localhost ~]# cat result.txt

col命令

  • Tab换成对等数量的空格键,或反转这个操作
col [option]

-x 将Tab转换为空格
-h 将空格转换为Tab(默认选项)

  • tab to space
#查看 /etc/protocols 中的不可见字符,可以看到很多 ^I ,这其实就是 Tab 转义成可见字符的符号
$ cat -A /etc/protocols
# 使用 col -x 将 /etc/protocols 中的 Tab 转换为空格,然后再使用 cat 查看,你发现 ^I 不见了
$ cat /etc/protocols | col -x | cat -A

join

  • 将两个文件中包含相同内容的那一行合并在一起
join [option]... file1 file2

-t 指定分隔符,默认为空格
-i 忽略大小写的差异
-1 指明第一个文件要用哪个字段来对比,默认对比第一个字段
-2 指明第二个文件要用哪个字段来对比,默认对比第一个字段

# 创建两个文件
$ echo '1 hello' > file1
$ echo '1 shiyanlou' > file2
$ join file1 file2
# 将/etc/passwd与/etc/shadow两个文件合并,指定以':'作为分隔符
$ sudo join -t':' /etc/passwd /etc/shadow
# 将/etc/passwd与/etc/group两个文件合并,指定以':'作为分隔符, 分别比对第4和第3个字段
$ sudo join -t':' -1 4 /etc/passwd -2 3 /etc/group

paste

  • 在不对比数据的情况下,简单地将多个文件合并一起,以Tab隔开
paste [option] file...

-d 指定合并的分隔符,默认为Tab
-s 不合并到一行,每个文件为一行
操作举例:

$ echo hello > file1
$ echo shiyanlou > file2
$ echo www.shiyanlou.com > file3
$ paste -d ':' file1 file2 file3
$ paste -s file1 file2 file3

实验十二:重定向

reweive

$ echo 'hello shiyanlou' > redirect 
$ echo 'www.shiyanlou.com' >> redirect
$ cat redirect

设备

0 /dev/stdin 标准输入
1 /dev/stdout 标准输出
2 /dev/stderr 标准错误
文件描述符是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符
默认使用终端的标准输入作为命令的输入和标准输出作为命令的输出

重定向

$ cat
(按Ctrl+C退出)
将cat的连续输出(heredoc方式)重定向到一个文件

$ mkdir Documents
$ cat > Documents/test.c <<EOF

include <stdio.h>

int main()
{
printf("hello world\n");
return 0;
}

EOF
将一个文件作为命令的输入,标准输出作为命令的输出

$ cat Documents/test.c
将echo命令通过管道传过来的数据作为cat命令的输入,将标准输出作为命令的输出

$ echo 'hi' | cat
将echo命令的输出从默认的标准输出重定向到一个普通文件

$ echo 'hello shiyanlou' > redirect
$ cat redirect

管道默认是连接前一个命令的输出到下一个命令的输入,而重定向通常是需要一个文件来建立两个命令的连接

  • 标准错误重定向
    标准输出和标准错误都被指向伪终端的屏幕显示,所以我们经常看到的一个命令的输出通常是同时包含了标准输出和标准错误的结果的。
# 使用cat 命令同时读取两个文件,其中一个存在,另一个不存在
$ cat Documents/test.c hello.c
# 你可以看到除了正确输出了前一个文件的内容,还在末尾出现了一条错误信息
# 下面我们将输出重定向到一个文件
$ cat Documents/test.c hello.c > somefile
- 隐藏某些错误或者警告

将标准错误重定向到标准输出,再将标准输出重定向到文件,注意要将重定向到文件写到前面

$ cat Documents/test.c hello.c >somefile 2>&1

或者只用bash提供的特殊的重定向符号"&"将标准错误和标准输出同时重定向到文件

$ cat Documents/test.c hello.c &>somefilehell
注意你应该在输出重定向文件描述符前加上&,否则shell会当做重定向到一个文件名为1的文件中

- tee
要将输出重定向到文件,也需要将信息打印在终端

$ echo 'hello shiyanlou' | tee hello

  • exec命令实现“永久”重定向
    exec命令的作用是使用指定的命令替换当前的 Shell,即使用一个进程替换当前进程,或者指定新的重定向
# 先开启一个子 Shell
$ zsh
# 使用exec替换当前进程的重定向,将标准输出重定向到一个文件
$ exec 1>somefile
# 后面你执行的命令的输出都将被重定向到文件中,直到你退出当前子shell,或取消exec的重定向(后面将告诉你怎么做)
$ ls
$ exit
$ cat somefile
  • 查看当前 Shell 进程中打开的文件描述符:
$ cd /dev/fd/;ls -Al

同样使用exec命令可以创建新的文件描述符:

$ zsh
$ exec 3>somefile
# 先进入目录,再查看,否则你可能不能得到正确的结果,然后再回到上一次的目录
$ cd /dev/fd/;ls -Al;cd -
# 注意下面的命令>与&之间不应该有空格,如果有空格则会出错
$ echo "this is test" >&3
$ cat somefile
$ exit
  • 关闭文件描述符
$ exec 3>&-
$ cd /dev/fd;ls -Al;cd -
  • 完全屏蔽命令的输出
$ cat Documents/test.c nefile 1>/dev/null 2>&1
  • xgras分割参数列表
    当用来处理产生大量输出结果的命令如 find,locate 和 grep 的结果
$ cut -d: -f1 < /etc/passwd | sort | xargs echo

实验十三

grep用法

  • |竖直分隔符
    表示选择,例如"boy|girl"可以匹配"boy"或者"girl"
  • 数量限定
    不加数量限定符则表示出现一次且仅出现一次
    • 前面的字符必须出现至少一次(1次或多次),例如,"goo+gle",可以匹配"gooogle","goooogle"等;
  • ? 前面的字符最多出现一次(0次或1次),例如,"colo?r",可以匹配"color"或者"colour";
    • 前面的字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次),例如,“0*42”可以匹配42、042、0042、00042等
      grep命令用于打印输出文本中匹配的模式串,它使用正则表达式作为模式匹配的条件。grep支持三种正则表达式引擎,分别用三个参数指定:

参数 说明
-E POSIX扩展正则表达式,ERE
-G POSIX基本正则表达式,BRE
-P Perl正则表达式,PCRE

使用基本正则表达式

  • 查找
    /etc/group文件中以"shiyanlou"为开头的行


$ grep 'shiyanlou' /etc/group

$ grep '^shiyanlou' /etc/group

数量


# 将匹配以'z'开头以'o'结尾的所有字符串

$ echo 'zero\nzo\nzoo' | grep 'z.*o'

# 将匹配以'z'开头以'o'结尾,中间包含一个任意字符的字符串

$ echo 'zero\nzo\nzoo' | grep 'z.o'

# 将匹配以'z'开头,以任意多个'o'结尾的字符串

$ echo 'zero\nzo\nzoo' | grep 'zo*'
注意:其中\n为换行符



选择

# grep默认是区分大小写的,这里将匹配所有的小写字母

$ echo '1234\nabcd' | grep '[a-z]'

# 将匹配所有的数字

$ echo '1234\nabcd' | grep '[0-9]'

# 将匹配所有的数字

$ echo '1234\nabcd' | grep '[[:digit:]]'

# 将匹配所有的小写字母
$ echo '1234\nabcd' | grep '[[:lower:]]'

# 将匹配所有的大写字母
$ echo '1234\nabcd' | grep '[[:upper:]]'

# 将匹配所有的字母和数字,包括0-9,a-z,A-Z

$ echo '1234\nabcd' | grep '[[:alnum:]]'

# 将匹配所有的字母

$ echo '1234\nabcd' | grep '[[:alpha:]]'


  • 排除字符

$ echo 'geek\ngood' | grep '[^o]'

注意:当^放到中括号内为排除字符,否则表示行首。

ERE

扩展正则表达式
要通过grep使用扩展正则表达式需要加上-E参数,或使用egrep。

  • 数量

# 只匹配"zo"

$ echo 'zero\nzo\nzoo' | grep -E 'zo{1}'

# 匹配以"zo"开头的所有单词

$ echo 'zero\nzo\nzoo' | grep -E 'zo{1,}'
  • 选择
# 匹配"www.shiyanlou.com"和"www.google.com"

$ echo 'www.shiyanlou.com\nwww.baidu.com\nwww.google.com' | grep -E 'www\.(shiyanlou|google)\.com'

# 或者匹配不包含"baidu"的内容

$ echo 'www.shiyanlou.com\nwww.baidu.com\nwww.google.com' | grep -Ev 'www\.baidu\.com'

注意:因为.号有特殊含义,所以需要转义

sed 流编辑器

  • 打印指定行
cp /etc/passwd ~


# 打印2-5行

$ nl passwd | sed -n '2,5p'

# 打印奇数行

$ nl passwd | sed -n '1~2p'


  • 行内替换
# 将输入文本中"shiyanlou" 全局替换为"hehe",并只打印替换的那一行,注意这里不能省略最后的"p"命令

$ sed -n 's/shiyanlou/hehe/gp' passwd


  • 行间替换
$ nl passwd | grep "shiyanlou"

# 删除第21行

$ sed -n '21c\www.shiyanlou.com' passwd

(这里我们只把要删的行打印出来了,并没有真正的删除,如果要删除的话,请使用-i参数)

实验十四

apt

  • install
    其后加上软件包名,用于安装一个软件包
  • update
    从软件源镜像服务器上下载/更新用于更新本地软件源的软件包列表
  • upgrade
    升级本地可更新的全部软件包,但存在依赖问题时将不会升级,通常会在更新之前执行一次update
  • dist-upgrade
    解决依赖关系并升级(存在一定危险性)
  • remove
    移除已安装的软件包,包括与被移除软件包有依赖关系的软件包,但不包含软件包的配置文件
  • autoremove
    移除之前被其他软件包依赖,但现在不再被使用的软件包
  • purge
    与remove相同,但会完全移除软件包,包含其配置文件
  • clean
    移除下载到本地的已经安装的软件包,默认保存在/var/cache/apt/archives/
  • autoclean
    移除已安装的软件的旧版本软件包
  • 参数 说明
    -y 自动回应是否安装软件包的选项,在一些自动化安装脚本中使用这个参数将十分有用
    -s 模拟安装
    -q 静默安装方式,指定多个q或者-q=#,#表示数字,用于设定静默级别,这在你不想要在安装软件包时屏幕输出过多时很有用
    -f 修复损坏的依赖关系
    -d 只下载不安装
    --reinstall 重新安装已经安装但可能存在问题的软件包
    --install-suggests 同时安装APT给出的建议安装的软件包
  • 重新安装:
$ sudo apt-get --reinstall install w3m
  • update
# 更新软件源
$ sudo apt-get update
# 升级没有依赖问题的软件包
$ sudo apt-get upgrade
# 升级并解决依赖关系
$ sudo apt-get dist-upgrade
  • 移除
不保留配置文件的移除
$ sudo apt-get purge w3m
# 或者 sudo apt-get --purge remove
# 移除不再需要的被依赖的软件包
$ sudo apt-get autoremove
- search

sudo apt-cache search softname1 softname2 softname3……

##dpkg
-i	安装指定deb包
-R	后面加上目录名,用于安装该目录下的所有deb安装包
-r	remove,移除某个已安装的软件包
-I	显示deb包文件的信息
-s	显示已安装软件的信息
-S	搜索已安装的软件包
-L	显示已安装软件包的目录信息
- 查看deb包目录信息

$ sudo dpkg -L emacs24

尝试加一个超链接:[next](https://www.cnblogs.com/Ychancy/p/9779148.html)
![](https://img2018.cnblogs.com/blog/1505842/201810/1505842-20181014215424232-1271451993.jpg)
posted @ 2018-10-14 21:57  假的课代表  阅读(171)  评论(2编辑  收藏  举报