一、LInux 系统简介

操作系统(Linux)在计算机系统中扮演的角色
Linux - 实验楼 - 图1

UNIX进化史(UNIX大家族族谱1969-2013)

Linux - 实验楼 - 图2

二、Linux 基本概念

终端

命令解析器(Shell),Shell 即壳,有壳就有核,指的就是 UNIX/Linux 内核。之所以被称作 Shell 是因为隐藏了操作系统底层的细节
在 UNIX/Linux 中比较流行的常见的 Shell 有 bash、zsh、ksh、csh 等等,CentOS 7、Ubuntu 终端默认使用的是 bash

命令行

常用快捷键

Ctrl+c 键来强行终止当前程序
Tab 补全目录、补全命令、补全命令参数
Ctrl+d 键盘输入结束或退出终端
Ctrl+s 暂停当前程序,暂停后按下任意键恢复运行
Ctrl+z 将当前程序放到后台运行,恢复到前台为命令fg
Ctrl+a 将光标移至输入行头,相当于Home键
Ctrl+e 将光标移至输入行末,相当于End键
Ctrl+k 删除从光标所在位置到行末
Alt+Backspace 向前删除一个单词
Shift+PgUp 将终端显示向上滚动
Shift+PgDn 将终端显示向下滚动
恢复历史命令

通配符

字符 含义
* 匹配 0 或多个字符
? 匹配任意一个字符
[list] 匹配 list 中的任意单一字符
[^list] 匹配 除list 中的任意单一字符以外的字符
[c1-c2] 匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z]
{string1,string2,…} 匹配 string1 或 string2 (或更多)其一字符串
{c1..c2} 匹配 c1-c2 中全部字符 如{1..10}

通配符是一种特殊语句,主要有星号()和问号(?),用来对字符串进行模糊匹配(比如文件名、参数名)。
终端里面输入的通配符是由 Shell 处理的,不是由所涉及的命令语句处理的,它只会出现在命令的“参数值”里(它不能出现在命令名称里, 命令不记得,那就用Tab补全)。当 Shell 在“参数值”中遇到了通配符时,Shell 会将其当作路径或文件名在磁盘上搜寻可能的匹配:若符合要求的匹配存在,则进行代换(路径扩展);否则就将该通配符作为一个普通字符传递给“命令”,然后再由命令进行处理。
👉总之,通配符实际上就是一种 Shell 实现的*路径扩展功能
。在通配符被处理后, Shell 会先完成该命令的重组,然后继续处理重组后的命令,直至执行该命令。

调用帮助手册(man 命令)

man 是Manual Pages 的缩写,man 手册的内容很多,为了便于查找,man 手册通常被分为8个区段。
要查看相应区段的内容,就在 man 后面加上相应区段的数字即可,如:$ man 1 ls

区段 说明
1 Standard commands (标准命令)
2 System calls (系统调用)
3 Library functions (库函数)
4 Special devices (设备说明)特殊文件(通常是/dev中的设备)和驱动程序
5 File formats (文件格式)
6 Games and toys (游戏和娱乐)
7 Miscellaneous (杂项)
8 Administrative Commands (管理员命令)
9 其他(Linux特定的), 用来存放内核例行程序的文档。

查看 man 手册常用操作
搜索:/<你要搜索的关键字>;
查找完毕后可以使用n键切换到下一个关键字所在处,shift+n为上一个关键字所在处。
翻页:Space(空格键)
向下滚动一行:Enter(回车键),或者使用k,j(vim 编辑器的移动键)进行向前向后滚动一行
显示使用帮助:按下h键(因为 man 使用 less 作为阅读器,实为less工具的帮助)
退出:q 键

三、用户及文件权限管理

用户管理

查看用户:whoami
创建用户:sudo adduser <user>
👉每次新建用户如果不指定用户组的话,默认会自动创建一个与用户名相同的用户组
su <user> 可以切换到用户 user,执行时需要输入目标用户的密码
sudo <cmd> 可以以特权级别运行 cmd 命令,需要当前用户属于 sudo 组,且需要输入当前用户的密码
用户组
显示用户所属用户组:groups <user> ,返回结果中冒号前表示用户,冒号后表示用户所属用户组
将用户添加进用户组:adduser <``user``> <group>usermod -G <group> <user>
删除用户
删除普通用户:deluser <user> --remove-home 包括用户的主目录和邮箱
deluser <user> --remove-all-files 删除用户拥有的所有文件
deluser <user> <group> 将用户从用户组中删除

文件权限

查看文件权限:llls -l
Linux - 实验楼 - 图3
Linux - 实验楼 - 图4
👉 一个目录同时具有读权限和执行权限才可以打开并查看内部文件
,一个目录要有写权限才允许在其中创建其它文件
**
变更文件所有者:chown <``user[:group]``> <``file``>
修改文件权限

  • 二进制数字表示:chmod 600 filename 其他用户不能查看该文件Linux - 实验楼 - 图5
  • 加减赋值操作:chmod go-rwx filename
    👉u、g、o 分别表示 user 、group、others;+ 、- 分别表示增加、去除相应权限

四、Linux 目录结构和文件基本操作

4.1 Linux 目录结构

树形形式查看目录结构:tree <dir>

👉Linux 目录与 Windows 目录实现机制完全不同:

  • Windows 以存储介质为主,主要以盘符(C 盘,D 盘…)及分区实现文件管理,然后才是目录
  • Linux 以树形目录来构建整个系统,可以理解为树形目录是一个用户可操作系统的骨架
    ※虽然本质上无论是目录结构还是操作系统内核都是存储在磁盘上的,从逻辑上来说 Linux 的磁盘是“挂在”(挂载在)目录上的,每一个目录不仅能使用本地磁盘分区的文件系统,也可以使用网络上的文件系统,举例来说,可以利用网络文件系统(Network File System,NFS)服务器载入某特定目录等。

4.1.1 FHS 标准

FHS(英文:Filesystem Hierarchy Standard 中文:文件系统层次结构标准),多数 Linux 版本采用这种文件组织形式,FHS 定义了系统中每个区域的用途、所需要的最小构成的文件和目录同时还给出了例外处理与矛盾处理。 FHS 定义了两层规范,第一层是, / 下面的各个目录应该要放什么文件数据,例如 /etc 应该放置设置文件,/bin/sbin 则应该放置可执行文件等等。第二层则是针对 /usr/var 这两个目录的子目录来定义。例如 /var/log放置系统日志文件,/usr/share 放置共享数据等等。

👉 FHS 是根据以往无数 Linux 用户和开发者的经验总结出来的,并且会维持更新,FHS 依据文件系统使用的频繁与否以及是否允许用户随意改动,将目录定义为四种交互作用的形态,如下表所示:
Linux - 实验楼 - 图6
fhs 标准文档-2.3.pdf
Linux 系统目录结构导图.png

4.2 路径

目录切换:cd <path>
👉 . 表示当前目录
.. 表示上一级目录
- 表示上一次所在目录
~ 当前用户的home目录
👉 目录切换过程中请多使用 Tab 键自动补全,可避免输入错误,连续按两次 Tab 可以显示全部候选结果
显示当前所在绝对路径:pwd

4.3 Linux 文件基本操作

新建文件:touch <file> 👉创建一个指定文件名的空白文件(不会覆盖同名文件)
新建目录:mkdir <dir>
mkdir -p father/son/grandson 创建多级目录
复制文件:cp -T <SOURCE> <DEST> 复制源文件到目标文件
cp <SOURCE>... <DIR> 复制源文件到目录
复制文件夹:cp -r <DIR> <DIR> 复制文件夹
删除文件:rm <file>
rm -f <file> 强制删除文件,忽略提醒
删除文件夹:rm -r <DIR>
移动文件:mv <SOURCE> <DEST> 移动文件
mv <file> <DIR> 移动文件至目录
重命名文件:mv <old file> <new file>
查看文件:cat -n <file> 查看文件并显示行号
分页查看文件(”阅读”):more <file>less <file>
👉 打开后默认只显示一屏内容,终端底部显示当前阅读的进度。
可以使用 Enter 键向下滚动一行,使用 Space 键向下滚动一屏,按下 h 显示帮助,q 退出。
查看文件头部:head [-n <num>] file> -n 参数指定行数,默认10行
查看文件尾部:tail [-n <num>]<file> -n 参数指定行数,默认10行
tail -f <file> -f 监视文件,查看文件最新内容
查看文件类型:file <file>
编辑文件:vim编辑器 👉vimtutor Linux 内部 vim 编辑器教程

五、环境变量

5.1 变量

变量声明:declare <var> 或直接给变量赋值如 tmp=shiyanlou
👉 变量名只能是英文字母、数字或者下划线,且不能以数字作为开头
读取变量的值:echo $<var>
👉 $ 符号用于表示引用一个变量的值
变量删除:unset temp

常见的三种变量类型:

  1. 自定义变量:当前 Shell 进程私有用户自定义变量,如上面创建的 tmp 变量,只在当前 Shell 中有效
  2. 内建变量:Shell 本身内建的变量
  3. 环境变量:从自定义变量导出的环境变量

👉与普通变量区分,通常我习惯将环境变量名设为大写

5.1.1 环境变量
环境变量:在当前进程的子进程有效则为环境变量,否则不是(即变量的作用域在进程与子进程)
👉Shell 作为一个进程运行在操作系统之上,在 Shell 中运行的大部分命令都将以 Shell 的子进程的方式运行。
👉在所有的 UNIX 和类 UNIX 系统中,每个进程都有其各自的环境变量设置,且默认情况下,当一个进程被创建时,除了创建过程中明确指定的话,它将继承其父进程的绝大部分环境设置。
Linux - 实验楼 - 图7

打印环境变量

命 令 说 明
set 显示当前 Shell 所有变量,包括其内建环境变量(与 Shell 外观等相关),用户自定义变量及导出的环境变量。
env 显示与当前用户相关的环境变量,还可以让命令在指定环境中运行。
export 显示从 Shell 中导出成环境变量的变量,也能通过它将自定义变量导出为环境变量。

👉这三个命令很相似,都是用于打印环境变量信息,区别在于涉及的变量范围不同
Linux - 实验楼 - 图8

两个重要文件 /etc/bashrc(有的 Linux 没有这个文件) 和 /etc/profile ,它们分别存放的是 shell 变量和环境变量。
👉 每个用户目录(/home/shiyanlou)下的一个隐藏文件:.profile 可以用 ls -a 查看
.profile 只对当前用户永久生效。
/etc/profile 里面的是对所有用户永久生效

5.2 命令的查找路径与顺序

查看环境变量:echo $PATH
👉 环境变量 PATH 保存了 Shell 中执行的命令的搜索路径
添加自定义路径到“ PATH ”环境变量:PATH=$PATH:/home/shiyanlou/mybin
👉 这里一定要用绝对路径;
这条命令中的环境变量只在当前SHELL 生效,退出终端后变量就会失效
环境变量 PATH 以: 分隔符;

每个用户的 home 目录中有一个 Shell 每次启动时会默认执行一个配置脚本,以初始化环境,包括添加一些用户自定义环境变量等等。zsh 的配置文件是 .zshrc,相应 Bash 的配置文件为 .bashrc 。它们在 etc 下还都有一个或多个全局的配置文件,不过我们一般只修改用户目录下的配置文件。 👉 将命令添加配置脚本:$ echo "PATH=$PATH:/home/shiyanlou/mybin" >> .bashrc 修改完配置脚本后需重新打开终端,甚至重启计算机才会生效。 👉 让环境变量立即生效,使用source命令:cd /home/shiyanlou & ``source .bashrc

六、文件查找

whereis
👉 简单快速,因为没有从硬盘中依次查找,而是直接从数据库中查询。whereis 只能搜索二进制文件(-b),man 帮助文件(-m)和源代码文件(-s)

locate
👉 快而全,通过“ /var/lib/mlocate/mlocate.db ”数据库查找,不过这个数据库也不是实时更新的,系统会使用定时任务每天自动执行 updatedb 命令更新一次,所以有时候你刚添加的文件,它可能会找不到,需要手动执行一次 updatedb 命令

which
👉 小而精,本身是 Shell 内建的一个命令,通常使用 which 来确定是否安装了某个指定的软件,因为它只从 PATH 环境变量指定的路径中去搜索命令

find :find [path] [option] [action]
👉 精而细,
find 常用命令
# To find files:find . -type f
# To find files by octal permission:find . -type f -perm 777
# To find files with setuid bit set:find . -xdev \( -perm -4000 \) -type f -print0 | xargs -0 ls -l
# To find files with extension ‘.txt’ and remove them:find ./path/ -name '*.txt' -exec rm '{}' \;
# To find files with extension ‘.txt’ and look for a string into them:
find ./path/ -name '*.txt' | xargs grep 'string'
# To find files with size bigger than 5 Mebibyte and sort them by size:
find . -size +5M -type f -print0 | xargs -0 ls -Ssh | sort -z
# To find files bigger than 2 Megabyte and list them:
find . -type f -size +200000000c -exec ls -lh {} \; | awk '{ print $9 ": " $5 }'
# To find files modified more than 7 days ago and list file information
find . -type f -mtime +7d -ls
# To find symlinks owned by a user and list file information
find . -type l --user=username -ls
# To search for and delete empty directories
find . -type d -empty -exec rmdir {} \;
# To search for directories named build at a max depth of 2 directories
find . -maxdepth 2 -name build -type d
# To search all files who are not in .git directory
find . ! -iwholename '*.git*' -type f
# To find all files that have the same node (hard link) as MY_FILE_HERE
find . -type f -samefile MY_FILE_HERE 2>/dev/null
# To find all files in the current directory and modify their permissions
find . -type f -exec chmod 644 {} \;

七、文件打包与解压缩

👉 tar 原本只是一个打包工具,只是同时还是实现了对 7z、gzip、xz、bzip2 等工具的支持,这些压缩工具本身只能实现对文件或目录(单独压缩目录中的文件)的压缩,没有实现对文件的打包压缩,所以我们也无需再单独去学习其他几个工具,tar 的解压和压缩都是同一个命令,只需参数不同,使用比较方便。

文件打包tar -cvf shiyanlou.tar /home/shiyanlou
-c :创建一个tar包
-v :以可视的方式输出打包的文件
-f : 指定创建的文件名
解包文件至指定目录:tar -xf shiyanlou.tar -C /home/shiyanlou
-x:解包
👉 -C:已存在的目录
查看包:tar -tf shiyanlou.tar
打包压缩文件:tar -czf shiyanlou.tar.gz /home/shiyanlou
-z 参数,使用 gzip 来压缩文件:
👉使用其它的压缩工具创建或解压相应文件只需要更改一个参数即可:

压缩文件格式 参数
*.tar.gz -z
*.tar.xz -J
*tar.bz2 -j

八、文件系统操作与磁盘管理

查看磁盘容量:df -h
查看目录容量:du [OPTION]... [FILE]...
只看一级目录的信息:du -h -d 0 ~
只查看总计值:du -s
按文件/目录大小排序(默认当前目录):du -sk *| sort -rn<br />

九、Linux 下的帮助命令

内建命令与外部命令

内建命令实际上是 shell 程序的一部分,其中包含的是一些比较简单的 Linux 系统命令,这些命令是写在bash源码的builtins里面的,由 shell 程序识别并在 shell 程序内部完成运行,通常在 Linux 系统加载运行时 shell 就被加载并驻留在系统内存中。而且解析内部命令 shell 不需要创建子进程,因此其执行速度比外部命令快。比如:history、cd、exit 等等。

外部命令是 Linux 系统中的实用程序部分,因为实用程序的功能通常都比较强大,所以其包含的程序量也会很大,在系统加载时并不随系统一起被加载到内存中,而是在需要时才将其调入内存。虽然其不包含在 shell 中,但是其命令执行过程是由 shell 程序控制的。外部命令是在 Bash 之外额外安装的,通常放在/bin,/usr/bin,/sbin,/usr/sbin等等。比如:ls、vi等。

查看命令类型type <cmd>
#得到这样的结果说明是内建命令,正如上文所说内建命令都是在 bash 源码中的 builtins 的.def中
xxx is a shell builtin
#得到这样的结果说明是外部命令,正如上文所说,外部命令在/usr/bin or /usr/sbin等等中
xxx is /usr/bin/xxx
#若是得到alias的结果,说明该指令为命令别名所设定的名称;
xxx is an alias for xx —xxx

帮助命令

help 命令:help <cmd>
👉 help 命令只显示内建命令简要帮助信息
如要显示外部命令帮助信息,可用 —help 参数
man 命令:man <cmd>
👉 man 工具是显示系统手册页中的内容,也就是一本电子版的字典,这些内容大多数都是对命令的解释信息,还有一些相关的描述

info 命令:**info <cmd>
👉 与 man 相比,info 工具可显示更完整的 GNU 工具信息。若 man 页包含的某个工具的概要信息在 info 中也有介绍,那么 man 页中会有“请参考 info 页更详细内容”的字样。

十、linux 任务计划crontab

crontab 命令常见于Unix 系统或类Unix 系统,用于设置周期性执行的指令。 crontab 命令从输入设备读取指令,并将其存放于 crontab 文件中,以供之后读取和执行。通常,crontab 储存的指令被守护进程激活,crond 为其守护进程,crond 常常在后台运行,每一分钟会检查一次是否有预定的作业需要执行。 通过 crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script 脚本。时间间隔的单位可以是分钟、小时、日、月、周的任意组合。

crontab 格式

  1. # Example of job definition:
  2. # .---------------- minute (0 - 59)
  3. # | .------------- hour (0 - 23)
  4. # | | .---------- day of month (1 - 31)
  5. # | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
  6. # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
  7. # | | | | |
  8. # * * * * * [user-name] command_to_be_executed
  9. #example
  10. # every 15 min
  11. */15 * * * * /home/user/command.sh
  12. # every midnight
  13. 0 0 * * * /home/user/command.sh
  14. # every Saturday at 8:05 AM
  15. 5 8 * * 6 /home/user/command.sh

👉 注意 “ % ” 在 crontab 文件中,有结束命令行、换行、重定向的作用,前面加 ” \ ” 符号转义,否则,“ % ” 符号将执行其结束命令行或者换行的作用,并且其后的内容会被做为标准输入发送给前面的命令。
👉 每个用户使用 crontab -e 添加计划任务,都会在 /var/spool/cron/crontabs 中添加一个该用户自己的任务文档,这样目的是为了隔离
👉 如果是系统级别的定时任务,只需要以 sudo 权限编辑 /etc/crontab 文件就可以
👉 cron 服务监测时间最小单位是分钟,所以 cron 会每分钟去读取一次 /etc/crontab/var/spool/cron/crontabs 里面的內容

  1. [root@space ~]# ll /etc | grep cron
  2. -rw------- 1 root root 541 Aug 9 07:07 anacrontab
  3. drwxr-xr-x. 2 root root 4096 Dec 27 15:12 cron.d
  4. drwxr-xr-x. 2 root root 4096 Aug 28 14:15 cron.daily
  5. -rw------- 1 root root 0 Aug 9 07:07 cron.deny
  6. drwxr-xr-x. 2 root root 4096 Dec 27 15:10 cron.hourly
  7. drwxr-xr-x. 2 root root 4096 Jun 10 2014 cron.monthly
  8. -rw-r--r--. 1 root root 451 Jun 10 2014 crontab
  9. drwxr-xr-x. 2 root root 4096 Jun 10 2014 cron.weekly

十一、命令执行顺序与管道

顺序执行

;连接命令实现简单的顺序执行

选择执行

&&它表示如果前面的命令执行结果(不是表示终端输出的内容,而是表示命令执行状态的结果)返回0($?=0)则执行后面的,否则不执行
||&&相反的控制效果,当上一条命令执行结果为≠0($?≠0)时则执行它后面的命令
👉 可以从$?环境变量获取上一次命令的返回结果:echo $?

管道

管道是一种通信机制,通常用于进程间的通信(也可通过socket进行网络通信),它表现出来的形式就是将前面每一个进程的输出(stdout)直接作为下一个进程的输入(stdin)。
管道又分为匿名管道和具名管道:
匿名管道在命令行中由|分隔符表示;
具名管道简单的说就是有名字的管道,通常只会在源程序中用到具名管道。
👉 一般搭配具有“过滤”功能的命令使用,比如:
ls -al /etc | less cut grep wc sort uniq

十二、简单文本处理

tr [option]...SET1 [SET2]

删除或替换一段文本信息中的某些文字 Translate, squeeze, and/or delete characters from standard input,writing to standard output.

col [option] 将Tab换成对等数量的空格键,或反转这个操作
-x 将Tab转换为空格
-h 将空格转换为Tab(默认选项)

十三、数据流重定向

文件描述符

文件描述符:文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于 UNIX、Linux 这样的操作系统。

常见文件描述符 设备文件 说明 备注
0 /dev/stdin 标准输入 stdin,对应在终端的输入
1 /dev/stdout 标准输出 stdout,对应终端的输出
2 /dev/stderr 标准错误输出 stderr,对应终端的输出
& 1+2,标准输出和标准错误输出

输出重定向符号

  • “>” :覆盖
  • “>>”:追加
  • “2>”:标准错误重定向
  • “&>”:全部重定向(标准输出+标准错误输出)

👉 < << 区别在于重定向的方向不一致而已
👉 初学者容易将管道和重定向混淆,管道默认是连接前一个命令的输出到下一个命令的输入,而重定向通常是需要一个文件来建立两个命令的连接
👉 # 将标准错误重定向到标准输出,再将标准输出重定向到文件,注意要将重定向到文件写到前面
$ cat Documents/test.c hello.c >somefile 2>&1 注意你应该在输出重定向文件描述符前加上&,否则shell会当做重定向到一个文件名为1的文件中

将标准输出复制到指定文件,并显示标准输出echo "hello shiyanlou" | tee hello.txt
永久重定向

  1. # 先开启一个子 Shell
  2. $ zsh
  3. # 使用exec替换当前进程的重定向,将标准输出重定向到一个文件
  4. $ exec 1>somefile
  5. # 后面你执行的命令的输出都将被重定向到文件中,直到你退出当前子shell,或取消exec的重定向
  6. $ ls
  7. $ exit
  8. $ cat somefile

屏蔽命令的输出
$ cat Documents/test.c 1>/dev/null 2>&1
👉 在类 UNIX 系统中,/dev/null,或称空设备,是一个特殊的设备文件,它通常被用于丢弃不需要的输出流,或作为用于输入流的空文件,这些操作通常由重定向完成。读取它则会立即得到一个EOF。

十四、正则表达式