当前位置:   article > 正文

Linux学习_ere03nf.xyz

ere03nf.xyz

基本概念及操作

1、命令行操作体验

1.1 一些常用快捷键
按键作用
Ctrl + d键盘输入结束后退出终端
Ctrl + s暂停当前程序,暂停后按下任意键恢复运行
Ctrl + z将当前程序放到后台运行,恢复到前台为命令fg
Ctrl + a将光标移至输入行头,相当于Home键
Ctrl + e将光标移至输入行末,相当于End键
Ctrl + k删除从光标所在位置到行末
Alt + Backspace向前删除一个单词
shift + Pgup将终端显示向上滚动
shift + PgDn将终端向下滚动
1.2 Shell 常用通配符
字符含义
*匹配 0 或多个字符
匹配任意一个字符
[ list ]匹配 list 中的任意单一字符
[ ^list ]匹配除 list 中的任意单一字符以外的字符
[ c1 - c2 ]匹配 c1-c2 中的任意单一字符 如 : [0-9] [a-z]
{string1, string2, … }匹配 string1 或 string2 (或更多) 其一字符串
{ c1 … c2 }匹配 c1-c2 中全部字符 { 1…10 }

image-20211219102209146

创建如下文件夹 1 到 10

image-20211219102226654

1.3man 手册

通常被分为 8 个区段

区段说明
1一般命令
2系统调用
3库函数,涵盖了C标准函数库
4特殊文件(通常是/dev中的设备)和驱动程序
5文件格式和约定
6游戏和屏保
7杂项
8系统管理命令和守护进程

要查看相应区段的内容,在man后面加上相应区段的数字即可

man 1 ls
  • 1

会显示第一区段中的 ls 命令man页面

image-20211219101651381

用户及文件权限管理

用户组

who 命令
参数说明
-a打印能打印的全部
-d打印死掉的进程
-mam imom likes
-q打印当前登录用户数及用户名
-u打印当前登录用户登录信息
-r打印运行等级
root

root 权限,系统权限的一种,与 SYSTEM 权限可以理解成一个概念,但高于 Administrator 权限,root 是 Linux 和 UNIX 系统中的超级管理员用户帐户,该帐户拥有整个系统至高无上的权力,所有对象他都可以操作,所以很多黑客在入侵系统的时候,都要把权限提升到 root 权限,这个操作等同于在 Windows 下就是将新建的非法帐户添加到 Administrators 用户组。更比如安卓操作系统中(基于 Linux 内核)获得 root 权限之后就意味着已经获得了手机的最高权限,这时候你可以对手机中的任何文件(包括系统文件)执行所有增、删、改、查的操作。

使用groups命令

groups [用户]

结果
	用户 : 用户
  • 1
  • 2

其中冒号之前表示用户,后面表示该用户所属的用户组

新建用户如果不指定用户组的话,默认会自动创建一个与用户名相同的用户组

/etc/group文件格式说明

/etc/group 的内容包括用户组(Group)、用户组口令、GID(组 ID) 及该用户组所包含的用户(User),每个用户组一条记录。格式如下:

group_name:password:GID:user_list

image-20211219184340837

将其他用户加入sudo用户组

sudo usermod --G sudo [其他用户]

删除用户组

sudo deluser [用户] --remove-home

使用 --remove-home 参数在删除用户时候会一并将该用户的工作目录一并删除。如果不使用那么系统会自动在 /home 目录为该用户保留工作目录。

文件权限

查看文件权限

image-20211219131535796

image-20211219131623439

socket 网络套接字

pipe 管道

软链接文件:链接分为两种,一种为硬链接(不常用),另一个为软链接。等同于Windows中的快捷方式

  • 文件权限

一个目录同时具有读权限和执行权限才可以打开并查看内部文件,而一个目录要有写权限才允许在其中创建其它文件

  • 链接数

链接到该文件所在的inode结点的文件数目

  • 文件大小

以inode结点大小为单位来表示的文件大小,在ls后加上 -lh 参数直观的查看文件的大小

变更文件所有者

在 新建的 b 用户下 创建 文件A

为变更文件 A 所在的 B 用户

需在当前情况下,切换到 A 用户 使用以下命令

sudo chown [ A用户 ] [ filename ]

修改文件权限

image-20211219191153655

依次是:

  • 这个文件的拥有者
  • 所属用户组
  • 其他用户的读写权限
adduseruseradd 的区别是什么

答:useradd 只创建用户,不会创建用户密码和工作目录,创建完了需要使用 passwd <username> 去设置新用户的密码。adduser 在创建用户的同时,会创建工作目录和密码(提示你设置),做这一系列的操作。其实 useradduserdel 这类操作更像是一种命令,执行完了就返回。而 adduser 更像是一种程序,需要你输入、确定等一系列操作。

因此推荐使用 adduser .

Linux目录结构及文件基本操作

介绍:

1、Linux 的文件组织目录结构

2、相对路径和绝对路径

3、对文件的移动、复制、重命名、编辑等操作

Linux 的磁盘是“挂在”(挂载在)目录上的,每一个目录不仅能使用本地磁盘分区的文件系统,也可以使用网络上的文件系统。举例来说,可以利用网络文件系统(Network File System,NFS)服务器载入某特定目录等。

FHS(英文:Filesystem Hierarchy Standard 中文:文件系统层次结构标准),多数 Linux 版本采用这种文件组织形式,FHS 定义了系统中每个区域的用途、所需要的最小构成的文件和目录同时还给出了例外处理与矛盾处理。

FHS 定义了两层规范,第一层是, / 下面的各个目录应该要放什么文件数据,例如 /etc 应该放置设置文件,/bin/sbin 则应该放置可执行文件等等。

第二层则是针对 /usr/var 这两个目录的子目录来定义。例如 /var/log 放置系统日志文件,/usr/share 放置共享数据等等。

1、新建

若当前目录已经创建了一个 test 文件,再使用 mkdir test 新建同名的文件夹,系统会报错文件已存在。这符合 Linux 一切皆文件的理念。

图片描述

若当前目录存在一个 test 文件夹,则 touch 命令,则会更改该文件夹的时间戳而不是新建文件。

2、复制

复制文件

使用 cp 命令复制一个文件到指定目录

cp [A] [B]


  • 1
  • 2
  • 3

将文件 A 复制到 B 路径目录中 ,B == ?/?/?

复制目录

如果直接使用 cp 命令复制目录的话,会出现错误

若要成功复制目录 要加上 -r 或 -R 参 ,表示递归复制。

3、删除

删除文件

使用 rm 命令删除一个文件

有时若要删除一些只读权限的文件,直接使用rm删除会显示一个提示。

若要忽略该提:加参数 -r 参数强制删除

rm -f test
  • 1
删除目录

和复制目录一样 要删除目录,需要加上 -r 或 -R 参数

rm -r [content]
  • 1

遇到权限不足删除不了的目录和删除文件一样加上 -f 参数

4、移动文件和文件重命名

移动文件

使用mv 命令移动文件(剪切), 命令格式是mv源目录文件

mkdir [content]
touch [filename]
mv [filename] [content] 
  • 1
  • 2
  • 3
重命名文件

mv 命令除了能移动文件外,还能给文件重命名,命名格式为mv 旧的文件名 新的文件名

mv [oldfileName] [newfileName]
  • 1
批量重命名

rename命令

image-20211219205040720

5、查看文件

使用cat,tac和nl 命令查看文件

前两个命令都是用来打印文件内容到标准输出(终端),其中 cat 为正序显示,tac 为倒序显示。

标准输入输出:当我们执行一个 shell 命令行时通常会自动打开三个标准文件,即标准输入文件(stdin),默认对应终端的键盘、标准输出文件(stdout)和标准错误输出文件(stderr),后两个文件都对应被重定向到终端的屏幕,以便我们能直接看到输出内容。进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。

默认的终端窗口大小,一屏显示不完文本的内容,得用鼠标拖动滚动条或者滑动滚轮才能继续往下翻页,要是可以直接使用键盘操作翻页就好了,那么你就可以使用下面要介绍的命令

使用more和less命令分页查看文件

打开后默认只显示一屏内容,终端底部显示当前阅读的进度。可以使用 Enter 键向下滚动一行,使用 Space 键向下滚动一屏,按下 h 显示帮助,q 退出。

使用head和tail命令查看文件

关于 tail 命令,不得不提的还有它一个很牛的参数 -f,这个参数可以实现不停地读取某个文件的内容并显示。这可以让我们动态查看日志,达到实时监视的目的。

系统新增加一个用户,会将用户的信息添加到文件的最后

这时使用tail命令

甚至可以更直接的只看一行 加 -n 参数,后面紧跟行数。

6、查看文件类型

可以使用 file命令查看文件类型:

与Windows 不同的是,如果新建.txt文件,Windows会自动把它识别为文本文件,而file命令会识别一个空文件,而Linux中文件的类型不是根据文件后缀来判断的,当在文件输入内容后才会显示文件类型。

7、编辑文件

在此首先要学会使用编辑器 vim

vim 学习
1、第一讲

按确保我处于正常模式,即阅读模式

在shell 的提示符下输入命令 :vim tutor <回车>

’ vim ’ 是启动Vim 编辑器的命令,’ tutor '是您希望编辑的文件的名字

2、第二讲

image-20211219212640489

在绿色光标处以及处于正常模式下

输入dw,则删除 fun

同样的

输入d$ ,则输出4个键位,不论是中文、英文、符号均删去四个

关于命令和对象

许多改变文本的命令都是由一个操作符和一个动作构成,使用以上删除操作符 d 的删除命令的格式如下:

d motion

其中:

​ d - 删除操作符

​ motion - 操作符的操作对象

一个简短的动作列表:

  • w - 从当前光标当前位置直到下一个单词起始处,不包括它的第一个字符
  • e - 从当前光标当前位置直到单词末尾,包括最后一个字符
  • $ - 从当前光标位置到当前行末
使用计数以删除更多

使用操作符时输入数字可以使它重复多次

d number(数字) motion

操作整行

dd删除整行

2dd删除两整行

撤销类命令

输入 u 来撤销最后执行的命令,输入 U 来撤销对整行的修改

U是回到执行最后一条指令之前的状态

Ctrl + R重做被撤销的命令,撤销掉撤销命令

3、第三讲

置入类命令

输入 p 将最后一次删除的内容置于光标之后

替换类命令

输入 r 和一个字符替换光标所在位置的字符

更改类命令

要改变文本直到一个单词的末尾 ,请输入 ce

使用 c 更改更多

更改类操作符可以与删除中使用的同样的动作配合使用

c [number] motion

4、第四讲
定位及文件状态

1、输入大写G可以使得当前光标直接跳转到文件最后一行

2、输入gg则是最后一行

3、输入曾经停留的行号,然后输入大写G,如此可以返回第一次按下Ctrl - G时所在的行了。

搜索类命令

输入 / 加上一个字符串可以用以在当前文件中查找该字符串

1、要查找同上一次的字符串,只需按n键,要向反方向查找同上一次的字符串,输入大写N即可。

2、若要逆向查找字符串,需使用 ? 代替 / 进行

3、回到之前的位置按 Ctrl - O ,Ctrl - I 跳转到较新的位置

匹配括号的查找

输入 % 可以查找配对的括号 )、]、}。

  1. 把光标放在任意(、[、{ 处,按 % 会匹配对应的括号
  2. 再按则返回原位置

程序调试时,此功能用来查找不配对的括号是非常有用的

替换指令

输入 : s/old/new/g 可以替换 old 为 new

要替换两行之间出现的每个匹配串,请输入:

:#,#s/old/new/g 其中#,#代表的是替换操作的若干行中首尾两行的行号

替换整个文件中的每个匹配串

:%s/old/new/g

找到整个文件中的每个匹配串,并且对每个匹配串提示是否进行替换

:%s/old/new/gc

5、第五讲
在VIM内执行外部命令的方法

输入 :! 然后接着输入一个外部命令即可执行外部命令

如:输入 !ls 该命令就会列举出您当前目录的内容

所有的外部命令都可以以这种方式执行,包括带参数的那些

关于保存文件的更多信息

**要将对文件的改动保存到文件中,输入 :w FILENAME **

注意FILENAME后方加空格之后回车

一个具有选择性的保存命令

**要保存文件的部分内容,输入 v motion :w FILENAME **

image-20211220003608802

提取和合并文件

**要向当前的文件中插入另外的文件的内容,输入 :r FILENAME **

image-20211220004035170

6、第六讲
打开类命令

输入 o 将在光标的下方打开新的一行进入插入模式

输入 O 将在光标的上方打开新的一行进入插入模式

附加类命令

输入 a 将可在光标之后插入文本

替换一个置换类命令的版本

输入大写的 R 可连续替换多个字符

在光标处替换

复制粘贴文本

使用操作 y 复制文本,使用 p 粘贴文本

输入 v 进入可视模式,可以条状选择如下

image-20211220113528098

输入 y 抽出(复制)高亮的文本

最后 p 以放置(粘贴)复制了的文本

还可以把 y 当做操作符来使用,例如 yw 可以 用来复制一个单词

设置类命令的选项

设置可使查找或替换可忽略大小写的选项

1、要查找单词 ignore 可在正常模式下输入 /ignore 可重复查找该词,可以重复按 n 键

2、然后这是 ic 选项(Ignore Case, 忽略大小写),输入 :set ic

3、现在可以通过 n 键再次查找单词 ignore,现在大小写的均可被找到。

4、然后设置 hlsearch 和 insearch 这两个选项,输入==:set hls is==

5、现在可以再次输入查找命令,变为高亮显示。

6、要禁用忽略大小写,输入 :set noic

要移出匹配项的高亮显示,输入:nohlsearch

如果只是在一次查找时忽略字母大小写,使用 \c

/ignore\c

即 在 选 项 前 加 上 n o 可 以 关 闭 选 项 : s e t   n o + x x x 即在选项前加上no可以关闭选项 :set\,no+xxx no:setno+xxx

7、第七讲
帮助信息

使用在线帮助系统

image-20211220122707040

创建启动脚本

image-20211220123037798

补全功能

image-20211220123243655

环境变量与文件查找

环境变量

变量

使用 declare 命令创建一个变量名为 tmp 的变量

declare tmp
  • 1

其实也不用declare预声明一个变量,直接即用及创建,这在创建其他指定类型的变量(如数组)时会用

读取变量的值,使用 echo 命令和 $ 符号 ({$}符号用于表示引用一个变量的值)

echo $tmp
  • 1

注意:并不是任何形式的变量名都是可用的,变量名只能是英文字母、数字或者下划线,且不能以数字作为开头

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

image-20211220130208395

image-20211220130756541

注意:为了与普通变量区分,通常我们习惯将环境变量命名为大写

永久生效

按变量的生存周期来划分,Linux 变量可分为两类

  1. 永久的:需要修改配置文件,变量永久生效
  2. 临时的:使用export命令声明即可,变量在关闭shell时失效

image-20211220131113873

1、命令的查找路径与顺序

查看 PATH 环境变量的内容:

echo $PATH
  • 1
2、添加自定义路径到"PATH"环境变量

image-20211220163201556

一定要去掉前面的./ 否则报错

在每个用户的home目录中有一个Shell每次启动时会默认执行一个配置脚本,以初始化环境,包括添加一些用户自定义环境变量等等。

image-20211220163841037

3、修改和删除已有变量

变量的修改有以下方式

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

测试修改添加到PATH的环境变量,将添加的mybin目录从环境变量里删除,为了避免操作失误导致命令找不到,我们先将PATH赋值给一个新的自定义变量mypath

mypath=$PATH
echo $mypath
mypath=${mypath%[要删除的环境变量]}
# 或使用通配符 * 表示任意多个任意字符
mypath=${mypath%*/[末尾]}
  • 1
  • 2
  • 3
  • 4
  • 5
4、变量删除

可以使用 unset 命令删除一个环境变量

unset mypath
  • 1

5、使环境变量立即生效

在shell中修改了一个配置脚本文件之后(比如zsh的配置文件home目录下.zshrc),每次都要退出终端重新打开甚至重启主机之后才能生效,很是麻烦,我们可以使用source命令来让其立即生效

source .zshrc
  • 1

source命令还有个别名为 . 上面的命令可替换为:

. ./.zshrc
  • 1

在使用 . 的时候,注意与表示当前路径的那个点区分开

注意此时后面的文件必须制定完整的绝对或相对路径名,source则不需要

搜索文件

与搜索相关的命令常用的有whereiswhichfindlocate

  • whereis 简单快速
whereis who
whereis find
  • 1
  • 2

whereis find 命令找到了三个路径,两个可执行文件路径和一个man在线帮助文件所在路径,这是直接在数据库中查询的。

whereis只能搜索二进制文件(-b),man帮助文件(-m)和源代码文件(-s)。如果想要获得更全面的搜索结果可以使用locate命令。

  • locate快而全

使用locate命令查找文件也不会遍历硬盘,它通过查==/var/lib/mlocate.db数据库来检索信息,不过这个数据库也不是实时更新的,系统会使用定时任务每天自动执行updatedb命令来更新数据库。所以有时候刚添加的文件可能找不到,需要手动执行一次uodatedb==命令。

注意这个命令也不是内置的命令,在部分环境中需要手动安装,然后执行更新。

sudo apt-get update
sudo apt-get install locate
sudo updatedb
  • 1
  • 2
  • 3

它可以用来查找指定目录下不同文件类型,如查找/etc 下所有以sh开头的文件:

locate/etc/sh
  • 1

注意,它不只是在/etc目录下查找,还会自动递归子目录进行查找

环境里使用 zsh,在 ~/.zshrc 文件里添加了 setopt nonomatch 配置,这样就不会自动处理和修复命令,因此可以不使用 \ 转义。如果其他环境中执行该命令提示 zsh: no matches found: /usr/share/*.jpg,则可以在 .zshrc 中添加上述配置,或者使用 \ 转义。

如果想只统计数目可以加上 -c 参数,-i 参数可以忽略大小写进行查找,whereis-b-m-s 同样可以使用。

  • which 小而精

which 本身是 Shell 内建的一个命令,我们通常使用 which 来确定是否安装了某个指定的程序,因为它只从 PATH 环境变量指定的路径中去搜索命令并且返回第一个搜索到的结果。也就是说,我们可以看到某个系统命令是否存在以及执行的到底是哪一个地方的命令。

  • find 精而细

find 是这几个命令中最强大的,它不但可以通过文件类型、文件名进行查找而且可以根据文件的属性(如文件的时间戳,文件的权限等)进行搜索。

这条命令表示去 /etc/ 目录下面 ,搜索名字叫做 interfaces 的文件或者目录。这是 find 命令最常见的格式,千万记住 find 的第一个参数是要搜索的地方。命令前面加上 sudo 是因为 shiyanlou 只是普通用户,对 /etc 目录下的很多文件都没有访问的权限,如果是 root 用户则不用使用。

找到在/etc/目录下的文件

sudo find /etc -name [文件名]
  • 1

注意 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
  • 1

列出用户家目录比 /etc 目录新的文件

find ~ -newer /etc
  • 1
数字雨

在Linux里轻松实现只需命令cmatrix

sudo apt-get update
sudo apt-get intall cmatrix
  • 1
  • 2

F11全屏显示

还可以改变代码颜色

cmatrix -C red
  • 1

文件打包与解压缩

概念了解

压缩包文件格式

文件后缀名说明
*.zipzip 程序打包压缩的文件
*.rarrar 程序压缩的文件
*.7z7zip 程序压缩的文件
*.tartar 程序打包,未压缩的文件
*.gzgzip 程序(GNU zip)压缩的文件
*.xzxz 程序压缩的文件
*.bz2bzip2 程序压缩的文件
*.tar.gztar 打包,gzip 程序压缩的文件
*.tar.xztar 打包,xz 程序压缩的文件
*tar.bz2tar 打包,bzip2 程序压缩的文件
*.tar.7ztar 打包,7z 程序压缩的文件

zip压缩打包程序

  • 使用zip打包文件夹,注意输入完整的参数和路径
cd /home/shiyanlou
zip -r -q -o shiyanlou.zip /home/shiyanlou/Desktop
du -h shiyanlou.zip
file shiyanlou.zip
  • 1
  • 2
  • 3
  • 4

上面命令将目录/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
  • 2

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

注意:这里只能使用绝对路径,否则不起作用

再用 du命令分别查看默认压缩级别、最低、最高压缩级别及未压缩的文件的大小

du -h -d 0 *.zip ~ | sort
  • 1
  • -h,–human-readable 人类能够读懂的形式
  • -d,–max-depth (所查看文件的深度)

默认压缩级别应该是最高的

  • 创建加密zip包

使用==-e==参数可以创建加密压缩包

zip -r -e -o shiyanlou_encryption.zip /home/shiyanlou/Desktop
  • 1

image-20211220191854926

使用unzip命令解压缩zip文件

将x.zip 文件解压到当前目录

unzip x.zip
  • 1

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

unzip -q x.zip -d ziptest
  • 1

上述指定目录不存在,将自动创建,若不想解压指向查看压缩包的内容可以使用 -l 参数

unzip -l x.zip
  • 1

image-20211220192249626

tar 打包工具

在Linux上面更常用的是tar工具 ,tar原本只是一个打包工具,只是同时还是实现了7Z、gzip、xz、bzip2等工具的支持,

tar命令的一些基本的使用方式,即不进行压缩只是进行打包(创建归档文件)和解包操作
  • 创建一个tar包
tap -P -cf x.tar [绝对路径]
  • 1
  • 解包一个文件(-x 参数) 到指定路径的已存在目录 (-C 参数)
mkdir tardir
tar -xf x.tar -C tardir
  • 1
  • 2
  • 只查看不解包文件 -t 参数:
tar -tf x.tar
  • 1
  • 保留文件属性和跟随链接(符号链接或软链接),有时候我们使用 tar 备份文件当在其他主机还原时希望保留文件的属性(-p参数)和备份链接指向的源文件而不是链接本身(-h参数)
tar -cphf etc.tar /etc
  • 1

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

  • 我们只需要在创建tar文件的基础上添加-z参数,使用gzip来压缩文件:
tar -czf x.tar.gz [绝对路径]
  • 1
  • 解压*.tar.gz文件:
tar -xzf x.tar.gz
  • 1
压缩文件格式参数
*.tar.gz-z
*.tar.xz-J
*tar.bz2-j

总结

  • zip:
  • 打包 :zip something.zip something (目录请加 -r 参数)
  • 解包:unzip something.zip
  • 指定路径:-d 参数
  • tar:
  • 打包:tar -cf something.tar something
  • 解包:tar -xf something.tar
  • 指定路径:-C 参数

文件系统操作与磁盘管理

基本操作

查看磁盘和目录容量
  • 使用df命令查看磁盘的容量
df
  • 1

image-20211220200144678

  • 使用du 命令查看目录的容量
#默认同样以块的大小展示
du
#加上 '-h'参数,以更易读的方式展示
du -h
  • 1
  • 2
  • 3
  • 4

-d 参数指定查看目录的深度

# 只查看 1级目录的信息
du -h -d 0 ~
# 查看 2 级
du -h -d 1 ~
  • 1
  • 2
  • 3
  • 4

常见参数

du -h # 同 --human-readable 以 K,M,G 为单位,提高信息的可读性。
du -a # 同 --all 显示目录中所有文件的大小。
du -s # 同 --summarize 仅显示总计,只列出最后加总的值。
  • 1
  • 2
  • 3

找到当前目录中占有空间最大的前10个文件

du -am -h | sort -nr | head -n 10
  • 1

创建虚拟磁盘

dd命令简介

image-20211220200834082

# 输出到文件
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
# 在打完了这个命令后,继续在终端打字,作为你的输入
  • 1
  • 2
  • 3
  • 4
  • 5

image-20211220202314675

dd if=/dev/stdin of=test bs=10 count=1 conv=ucase
  • 1

image-20211220202420747

使用dd命令创建虚拟镜像文件

从/dev/zero设备创建一个容量为256M的空文件

dd if=/dev/zero of=virtual.img bs=1M count=256
du -h virtual.img
  • 1
  • 2
使用mkfs命令格式化磁盘(自己创建的虚拟磁盘镜像)

image-20211220202858655

使用mount命令挂载磁盘到目录树

image-20211220202933744

sudo mount
  • 1

image-20211220203021550

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

mount [options] [source] [directory]
  • 1

一些常用操作

mount [-o [操作选项]] [-t 文件系统类型] [-w|--rw|--ro] [文件系统源][挂载点]
  • 1

Linux任务计划crontab

crontab的使用

crontab 命令常见于 Unix 和类 Unix 的操作系统之中(Linux 就属于类 Unix 操作系统),用于设置周期性被执行的指令

crontab 命令从输入设备读取指令,并将其存放于 crontab 文件中,以供之后读取和执行。通常,crontab 储存的指令被守护进程激活,crond 为其守护进程,crond 常常在后台运行,每一分钟会检查一次是否有预定的作业需要执行。

通过 crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell 脚本。时间间隔的单位可以是分钟、小时、日、月、周的任意组合。

crontab准备

crontab 在本实验环境中需要做一些特殊的准备,首先我们会启动 rsyslog,以便我们可以通过日志中的信息来了解我们的任务是否真正的被执行了(在本实验环境中需要手动启动,而在自己本地中 Ubuntu 会默认自行启动不需要手动启动)

crontab使用

添加计划任务
crontab -e
  • 1

image-20211220205807184

启动crontab

sudo cron -f &
  • 1

虽然我们添加了任务,但是如果 cron 的守护进程并没有启动,它根本都不会监测到有任务,当然也就不会帮我们执行,我们可以通过以下 2 种方式来确定我们的 cron 是否成功的在后台启动,默默的帮我们做事,若是没有就得执行上文准备中的第二步了。

ps aux | grep cron

# or

pgrep cron
  • 1
  • 2
  • 3
  • 4
  • 5

image-20211220210228127

image-20211220210254259

image-20211220210318015

挑战:备份日志

小明是一个服务器管理员,他需要每天备份论坛数据(这里我们用 alternatives.log 日志替代),备份当天的日志并删除之前的日志。而且备份之后文件名是 年-月-日 的格式。alternatives.log/var/log/ 下面

目标

  1. shiyanlou 用户添加计划任务
  2. 每天凌晨 3 点的时候定时备份 alternatives.log/home/shiyanlou/tmp/ 目录
  3. 命名格式为 年-月-日,比如今天是 2017 年 4 月 1 日,那么文件名为 2017-04-01

提示语

  • date
  • crontab
  • cp 命令
  • 用一条命令写在 crontab 里面即可,不用写脚本
sudo cron -f &
crontab -e # 添加
0 3 * * * sudo rm /home/shiyanlou/tmp/*
0 3 * * * sudo cp /var/log/alternatives.log /home/shiyanlou/tmp/$(date +%Y-%m-%d)
  • 1
  • 2
  • 3
  • 4

命令执行顺序控制与管道

顺序执行多条命令

image-20211220211448373

管道

管道是一种通信机制,通常用于进程间的通信(也可通过 socket 进行网络通信),它表现出来的形式就是将前面每一个进程的输出(stdout)直接作为下一个进程的输入(stdin)

使用:查看有哪些文件和目录,使用ls命令来查看

ls -al /etc
  • 1

此时,输出,太多内容,屏幕不能完全显示,这是可以用管道

ls -al /etc | less
  • 1

通过管道将前一个命令(ls)的输出作为下一个命令(less)的输入,然后就可以一行一行地看。

cut命令,打印每一行的某一字段

打印 /etc/passwd 文件中以 : 分隔符的第1个字段和第6个字段分别表示用户名和其他目录:

cut /etc/passwd -d ':' -f 1,6
  • 1

打印 /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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

grep命令

在文本中或 stdin 中查找匹配字符串

grep命令的一般形式为

grep [命令选项]... 用于匹配的表达式 [文件]...
  • 1

搜索/home/shiyanlou目录下所有包含"shiyanlou"的文本文件,并显示出现在文本中的行号:

grep -rnI "shiyanlou" ~
  • 1

-r 参数表示递归搜索子目录中的文件,-n 表示打印匹配项行号,-I 表示忽略二进制文件。这个操作实际没有多大意义,但可以感受到 grep 命令的强大与实用。

正则表达式的运用

# 查看环境变量中以 "yanlou" 结尾的字符串
export | grep ".*yanlou$"
  • 1
  • 2

wc命令

简单小巧的计数工具

wc 命令用于统计并输出一个文件中行、单词和字节的数目,比如输出 /etc/passwd 文件的统计信息:

wc /etc/passwd
  • 1

分别只输出行数、单词数、字节数、字符数和输入文本中最长一行的字节数:

# 行数
wc -l /etc/passwd
# 单词数
wc -w /etc/passwd
# 字节数
wc -c /etc/passwd
# 字符数
wc -m /etc/passwd
# 最长行字节数
wc -L /etc/passwd
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

再来结合管道来操作一下,下面统计 /etc 下面所有目录数:

ls -dl /etc/*/ | wc -l
  • 1

image-20211220213543438

sort排序命令

默认为字典排序:

cat /etc/passwd | sort
  • 1

反转排序:

cat /etc/passwd | sort -r
  • 1

按特定字段排序:

cat /etc/passwd | sort -t':' -k 3
  • 1

上面的-t参数用于指定字段的分隔符,这里是以":"作为分隔符;-k 字段号用于指定对哪一个字段进行排序。这里/etc/passwd文件的第三个字段为数字,默认情况下是以字典序排序的,如果要按照数字排序就要加上-n参数:

cat /etc/passwd | sort -t':' -k 3 -n
  • 1

uniq 去重命令

  • 过滤重复行

我们可以使用 history 命令查看最近执行过的命令(实际为读取 ${SHELL}_history 文件,如我们环境中的 .zsh_history 文件),不过你可能只想查看使用了哪个命令而不需要知道具体干了什么,那么你可能就会要想去掉命令后面的参数然后去掉重复的命令

history | cut -c 8- | cut -d ' ' -f 1 | uniq
  • 1

然后经过层层过滤,你会发现确是只输出了执行的命令那一列,不过去重效果好像不明显,仔细看你会发现它确实去重了,只是不那么明显,之所以不明显是因为 uniq 命令只能去连续重复的行,不是全文去重,所以要达到预期效果,我们先排序:

history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq
# 或者
history | cut -c 8- | cut -d ' ' -f 1 | sort -u
  • 1
  • 2
  • 3
  • 输出重复行
# 输出重复过的行(重复的只输出一个)及重复次数
history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -dc
# 输出所有重复的行
history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -D
  • 1
  • 2
  • 3
  • 4

数码图像

image-20211220214723436

wget https://labfile.oss.aliyuncs.com/courses/1/Linus.png
asciiview Linus.png
  • 1
  • 2

简单文本处理

tr命令

tr 命令可以用来删除一段文本信息中的某些文字。或者将其进行转换。

使用方式

tr [option]...SET1 [SET2]
  • 1

常用的选项有

选项说明
-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]',当然反过来将大写变小写也是可以的
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

image-20211220215003050

col命令

使用方式

col [option]
  • 1

常用的选项

选项说明
-xTab转换为空格
-h将空格转换为Tab(默认选项)

操作举例

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

image-20211220225743466

join命令

将两个文件中包含相同内容的那一行合并在一起

使用方式

join [option]... file1 file2
  • 1

常用的选项有

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

操作举例

cd /home/shiyanlou
# 创建两个文件
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

paste命令

paste这个命令与join 命令类似,它是在不对比数据的情况下,简单地将多个文件合并一起,以Tab隔开。

使用方式

paste [option] file...
  • 1

常用的选项有

选项说明
-d指定合并的分隔符,默认为 Tab
-s不合并到一行,每个文件为一行

操作举例

echo hello > file1
echo shiyanlou > file2
echo www.shiyanlou.com > file3
paste -d ':' file1 file2 file3
paste -s file1 file2 file3
  • 1
  • 2
  • 3
  • 4
  • 5

image-20211220230414936

轻松一下

SpaceInvaders 太空侵略者

sudo apt-get install ninvaders
/usr/games/ninvaders
  • 1
  • 2

数据流重定向

前面知识:数据流重定向操作

echo 'hello shiyanlou' > redirect
echo 'www.shiyanlou.com' >> redirect
cat redirect
  • 1
  • 2
  • 3

当然前面没有用到的 <<< 操作也是没有问题的,如你理解的一样,它们的区别在于重定向的方向不一致而已,> 表示是从左到右,< 右到左。

简单的重定向

在更多了解 Linux 的重定向之前,我们需要先知道一些基本的东西,前面我们已经提到过 Linux 默认提供了三个特殊设备,用于终端的显示和输出,分别为 stdin(标准输入,对应于你在终端的输入),stdout(标准输出,对应于终端的输出),stderr(标准错误输出,对应于终端的输出)

文件描述符设备文件说明
0/dev/stdin标准输入
1/dev/stdout标准输出
2/dev/stderr标准错误、

将 cat 的连续输出(heredoc方式)重定向到一个文件

mkdir Documents
cat > Documents/test.c <<EOF
#include <stdio.h>

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

EOF
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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

cat Documents/test.c
  • 1

将echo命令通过管道传过来的数据作为cat命令的输入,将标准输出作为命令的输出:

echo 'hi' | cat 
  • 1

image-20220318201936425

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

echo 'hello shiyanlou' > redirect
cat redirect
  • 1
  • 2

image-20211220233459150

标准错误重定向

使用tee命令同时重定向多个文件

image-20211220234222954

永久重定向

你应该可以看出我们前面的重定向操作都只是临时性的,即只对当前命令有效,那如何做到永久有效呢,比如在一个脚本中,你需要某一部分的命令的输出全部进行重定向,难道要让你在每个命令上面加上临时重定向的操作嘛?

当然不需要,我们可以使用 exec 命令实现永久重定向。exec 命令的作用是使用指定的命令替换当前的 Shell,即使用一个进程替换当前进程,或者指定新的重定向:

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

image-20211220234431373

创建输出文件描述符

在 Shell 中有 9 个文件描述符。上面我们使用了也是它默认提供的 0,1,2 号文件描述符。另外我们还可以使用 3-8 的文件描述符,只是它们默认没有打开而已。你可以使用下面命令查看当前 Shell 进程中打开的文件描述符:

cd /dev/fd/;ls -Al
  • 1

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

zsh
exec 3>somefile
# 先进入目录,再查看,否则你可能不能得到正确的结果,然后再回到上一次的目录
cd /dev/fd/;ls -Al;cd -
# 注意下面的命令>与&之间不应该有空格,如果有空格则会出错
echo "this is test" >&3
cat somefile
exit
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

image-20211220234932830

完全屏蔽命令的输出

在Linux中有一个被称为黑洞的设备文件,所有导入它的数据都将被吞噬

在类 UNIX 系统中,/dev/null,或称空设备,是一个特殊的设备文件,它通常被用于丢弃不需要的输出流,或作为用于输入流的空文件,这些操作通常由重定向完成。读取它则会立即得到一个 EOF。

我们可以利用/dev/null屏蔽命令的输出:

cat Documents/test.c 1>/dev/null 2>&1
  • 1

上面这样的操作将使你得不到任何输出结果

使用 xargs 分割参数列表

xargs 是一条 UNIX 和类 UNIX 操作系统的常用命令。它的作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题。

这个命令在有些时候十分有用,特别是当用来处理产生大量输出结果的命令如 findlocategrep 的结果,详细用法请参看 man 文档。

cut -d: -f1 < /etc/passwd | sort | xargs echo
  • 1

上面这个命令用于将 /etc/passwd 文件按 : 分割取第一个字段排序后,使用 echo 命令生成一个列表。

挑战:历史命令

image-20211221001150071

cat data1 |cut -c 8-|sort|uniq -dc|sort -rn -k1 |head -3 > /home/shiyanlou/result
  • 1

正则表达式

正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为 regex、regexp 或 RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。

许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在 Perl 中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由 UNIX 中的工具软件(例如sedgrep)普及开的。正则表达式通常缩写成“regex”,单数有 regexp、regex,复数有 regexps、regexes、regexen。

基本语法

一个正则表达式通常被称为一个模式(pattern),为用来描述或者匹配一系列符合某个句法规则的字符串。

选择

竖直分割符表示选择,例如 boy|girl 可以匹配boy或girl

数量限定

数量限定除了我们举例用的 * 还有 + 加号 ? 问号,如果在一个模式中不加数量限定符则表示出现一次且仅出现一次:

  • + 表示前面的字符必须出现至少一次(1 次或多次),例如 goo+gle 可以匹配 goooglegoooogle 等;
  • ? 表示前面的字符最多出现一次(0 次或 1 次),例如,colou?r,可以匹配 color 或者 colour;
  • * 星号代表前面的字符可以不出现,也可以出现一次或者多次(0 次、或 1 次、或多次),例如,0*42 可以匹配 42、042、0042、00042 等。
范围和优先级

() 圆括号可以用来定义模式字符串的范围和优先级,这可以简单的理解为是否将括号内的模式串作为一个整体。例如,gr(a|e)y 等价于 gray|grey,(这里体现了优先级,竖直分隔符用于选择 a 或者 e 而不是 graey),(grand)?father 匹配 fathergrandfather(这里体现了范围,? 将圆括号内容作为一个整体匹配)。

语法(部分)
字符描述
\将下一个字符标记为一个特殊字符、或一个原义字符。 例如 n 匹配字符 n\n 匹配一个换行符。序列 \\ 匹配 \\( 则匹配 (
^匹配输入字符串的开始位置。
$匹配输入字符串的结束位置。
{n}n 是一个非负整数。匹配确定的 n 次。例如 o{2} 不能匹配 Bob 中的 o,但是能匹配 food 中的两个 o
{n,}n 是一个非负整数。至少匹配 n 次。例如 o{2,} 不能匹配 Bob 中的 o,但能匹配 foooood 中的所有 oo{1,} 等价于 o+o{0,} 则等价于 o*
{n,m}m 和 n 均为非负整数,其中 n<=m最少匹配 n 次且最多匹配 m 次。例如,o{1,3} 将匹配 fooooood 中的前三个 oo{0,1} 等价于 o?。请注意在逗号和两个数之间不能有空格。
*匹配前面的子表达式零次或多次。例如,zo* 能匹配 zzo 以及 zoo* 等价于 {0,}
+匹配前面的子表达式一次或多次。例如,zo+ 能匹配 zo 以及 zoo,但不能匹配 z+ 等价于 {1,}
?匹配前面的子表达式零次或一次。例如,do(es)? 可以匹配 dodoes 中的 do? 等价于 {0,1}
?当该字符紧跟在任何一个其他限制符(*+?{n}{n,}{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 ooooo+? 将匹配单个 o,而 o+ 将匹配所有 o
.匹配除 \n 之外的任何单个字符。要匹配包括 \n 在内的任何字符,请使用类似 (.|\n) 的模式。
(pattern)匹配 pattern 并获取这一匹配的子字符串。该子字符串用于向后引用。要匹配圆括号字符,请使用 \(\)
x | y匹配 x 或 y。例如,“z | food”能匹配 zfood。“(z | f)ood”则匹配 zoodfood
[xyz]字符集合(character class)。匹配所包含的任意一个字符。例如,[abc] 可以匹配 plain 中的 a。其中特殊字符仅有反斜线 \ 保持特殊含义,用于转义字符。其它特殊字符如星号、加号、各种括号等均作为普通字符。脱字符^如果出现在首位则表示负值字符集合;如果出现在字符串中间就仅作为普通字符。连字符 - 如果出现在字符串中间表示字符范围描述;如果出现在首位则仅作为普通字符。
[^xyz]排除型(negate)字符集合。**匹配未列出的任意字符。**例如,[^abc] 可以匹配 plain 中的 plin
[a-z]字符范围。**匹配指定范围内的任意字符。**例如,[a-z] 可以匹配 az 范围内的任意小写字母字符。
[^a-z]排除型的字符范围。匹配任何不在指定范围内的任意字符。例如,[^a-z] 可以匹配任何不在 az 范围内的任意字符。
优先级

优先级为从上到下从左到右,依次降低:

运算符说明
\转义符
()(?:)(?=)[]括号和中括号
*+?{n}{n,}{n,m}限定符
^$\ 任何元字符定位点和序列
选择

grep模式匹配命令

基本操作

grep 命令用于打印输出文本中匹配的模式串,它使用正则表达式作为模式匹配的条件。grep 支持三种正则表达式引擎,分别用三个参数指定:

参数说明
-EPOSIX 扩展正则表达式,ERE
-GPOSIX 基本正则表达式,BRE
-PPerl 正则表达式,PCRE
它的常用参数
参数说明
-b将二进制文件作为文本来进行匹配
-c统计以模式匹配的数目
-i忽略大小写
-n显示匹配文本所在行的行号
-v反选,输出不匹配行的内容
-r递归匹配查找
-A nn 为正整数,表示 after 的意思,除了列出匹配行之外,还列出后面的 n 行
-B nn 为正整数,表示 before 的意思,除了列出匹配行之外,还列出前面的 n 行
--color=auto将输出中的匹配项设置为自动颜色显示

注:在大多数发行版中是默认设置了 grep 的颜色的,你可以通过参数指定或修改GREP_COLOR环境变量。

使用正则表达式
使用基本正则表达式,BRE
  • 位置

image-20211221002346168

  • 数量

image-20211221002402565

  • 选择

image-20211221002424256

特殊符号说明
[:alnum:]代表英文大小写字母及数字,亦即 0-9,A-Z,a-z
[:alpha:]代表任何英文大小写字母,亦即 A-Z,a-z
[:blank:]代表空白键与 [Tab] 按键两者
[:cntrl:]代表键盘上面的控制按键,亦即包括 CR,LF,Tab,Del…
[:digit:]代表数字而已,亦即 0-9
[:graph:]除了空白字节(空白键与 [Tab] 按键)外的其他所有按键
[:lower:]代表小写字母,亦即 a-z
[:print:]代表任何可以被列印出来的字符
[:punct:]代表标点符号(punctuation symbol),即:"'?!;:#$
[:upper:]代表大写字母,亦即 A-Z
[:space:]任何会产生空白的字符,包括空格键,[Tab],CR 等等
[:xdigit:]代表 16 进位的数字类型,因此包括: 0-9,A-F,a-f 的数字与字节

注意:之所以要使用特殊符号,是因为上面的 [a-z] 不是在所有情况下都管用,这还与主机当前的语系有关,即设置在 LANG 环境变量的值,zh_CN.UTF-8 的话 [a-z],即为所有小写字母,其它语系可能是大小写交替的如,“a A b B…z Z”,[a-z] 中就可能包含大写字母。所以在使用 [a-z] 时请确保当前语系的影响,使用 [:lower:] 则不会有这个问题。

# 排除字符
echo 'geek\ngood' | grep '[^o]'
  • 1
  • 2

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

image-20211221002514389

使用扩展正则表达式,ERE

image-20211221002608976

image-20211221002615847

sed 流编辑器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nclt6m27-1647606192382)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20211221002705499.png)]

sed 常用参数介绍

sed命令基本格式:

sed [参数]... [执行命令] [输入文件]...
# 形如:
$ sed -i 's/sad/happy/' test # 表示将test文件中的"sad"替换为"happy"
  • 1
  • 2
  • 3
参数说明
-n安静模式,只打印受影响的行,默认打印输入数据的全部内容
-e用于在脚本中添加多个执行命令一次执行,在命令行中执行多个命令通常不需要加该参数
-f filename指定执行 filename 文件中的命令
-r使用扩展正则表达式,默认为标准正则表达式
-i将直接修改输入文件内容,而不是打印到标准输出设备
sed编辑器的执行命令

sed执行命令格式

[n1][,n2]command
[n1][~step]command
  • 1
  • 2

其中一些命令可以在后面加上作用范围,形如:

sed -i 's/sad/happy/g' test # g 表示全局范围
sed -i 's/sad/happy/4' test # 4 表示指定行中的第四个匹配字符串
  • 1
  • 2

其中 n1,n2 表示输入内容的行号,它们之间为 , 逗号则表示从 n1 到 n2 行,如果为 ~ 波浪号则表示从 n1 开始以 step 为步进的所有行;command 为执行动作,下面为一些常用动作指令:

命令说明
s行内替换
c整行替换
a插入到指定行的后面
i插入到指定行的前面
p打印指定行,通常与 -n 参数配合使用
d删除指定行
sed 操作举例
打印指定行
# 打印2-5行
nl passwd | sed -n '2,5p'
# 打印奇数行
nl passwd | sed -n '1~2p'
  • 1
  • 2
  • 3
  • 4
行内替换
# 将输入文本中"shiyanlou" 全局替换为"hehe",并只打印替换的那一行,注意这里不能省略最后的"p"命令
sed -n 's/shiyanlou/hehe/gp' passwd
  • 1
  • 2

行内替换可以结合正则表达式使用。

删除某行
nl passwd | grep "shiyanlou"
# 删除第30行
sed -i '30d' passwd
  • 1
  • 2
  • 3

image-20211221003159148

awk文本处理语言

AWK 是一种优良的文本处理工具,Linux 及 Unix 环境中现有的功能最强大的数据处理引擎之一

在我们的环境中 ubuntu 上,默认提供的是 mawk,不过我们通常可以直接使用 awk 命令(awk 语言的解释器),因为系统已经为我们创建好了 awk 指向 mawk 的符号链接。

基础概念

image-20211221003458327

awk命令基本格式
awk [-F fs] [-v var=value] [-f prog-file | 'program text'] [file...]
  • 1

其中 -F 参数用于预先指定前面提到的字段分隔符(还有其他指定字段的方式),-v 用于预先为 awk 程序指定变量,-f 参数用于指定 awk 命令要执行的程序文件,或者在不加 -f 参数的情况下直接将程序语句放在这里,最后为 awk 需要处理的文本输入,且可以同时输入多个文本文件。

awk操作体验

image-20211221003611868

说明:在这个操作中我是省略了 pattern,所以 awk 会默认匹配输入文本的全部内容,然后在 {} 花括号中执行动作,即 print 打印所有匹配项,这里是全部文本内容。

image-20211221003634648

image-20211221003648596

image-20211221003657407

awk常用的内置变量
变量名说明
FILENAME当前输入文件名,若有多个文件,则只表示第一个。如果输入是来自标准输入,则为空字符串
$0当前记录的内容
$NN 表示字段号,最大值为NF变量的值
FS字段分隔符,由正则表达式表示,默认为空格
RS输入记录分隔符,默认为 \n,即一行为一个记录
NF当前记录字段数
NR已经读入的记录数
FNR当前输入文件的记录数,请注意它与 NR 的区别
OFS输出字段分隔符,默认为空格
ORS输出记录分隔符,默认为 \n

挑战:

数据提取

image-20211221004344585

grep '^[0-9]' /home/shiyanlou/data2 > /home/shiyanlou/num
grep -E '^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$' /home/shiyanlou/data2 > /home/shiyanlou/mail
  • 1
  • 2

Linux下软件安装

在不同的 linux 发行版上面在线安装方式会有一些差异包括使用的命令及它们的包管理工具,因为我们的开发环境是基于 ubuntu 的,所以这里我们涉及的在线安装方式将只适用于 ubuntu 发行版,或其它基于 ubuntu 的发行版如国内的 ubuntukylin(优麒麟),ubuntu 又是基于 debian 的发行版,它使用的是 debian 的包管理工具 dpkg,所以一些操作也适用于 debian。而在一些采用其它包管理工具的发行版如 redhat,centos,fedora 等将不适用(redhat 和 centos 使用 rpm)

APT 是 Advance Packaging Tool(高级包装工具)的缩写,是 Debian 及其派生发行版的软件包管理器,APT 可以自动下载,配置,安装二进制或者源代码格式的软件包,因此简化了 Unix 系统上管理软件的过程。APT 最早被设计成 dpkg 的前端,用来处理 deb 格式的软件包。现在经过 APT-RPM 组织修改,APT 已经可以安装在支持 RPM 的系统管理 RPM 包。这个包管理器包含以 apt- 开头的多个工具,如 apt-get apt-cache apt-cdrom 等,在 Debian 系列的发行版中使用。

当你在执行安装操作时,首先 apt-get 工具会在本地的一个数据库中搜索关于 w3m 软件的相关信息,并根据这些信息在相关的服务器上下载软件安装,这里大家可能会一个疑问:既然是在线安装软件,为啥会在本地的数据库中搜索?要解释这个问题就得提到几个名词了:

  • 软件源镜像服务器
  • 软件源

我们需要定期从服务器上下载一个软件包列表,使用 sudo apt-get update 命令来保持本地的软件包列表是最新的(有时你也需要手动执行这个操作,比如更换了软件源),而这个表里会有软件依赖信息的记录,对于软件依赖,我举个例子:我们安装 w3m 软件的时候,而这个软件需要 libgc1c2 这个软件包才能正常工作,这个时候 apt-get 在安装软件的时候会一并替我们安装了,以保证 w3m 能正常的工作。

apt-get

apt-get 是用于处理 apt包的公用程序集,我们可以用它来在线安装、卸载和升级软件包等,下面列出一些 apt-get 包含的常用的一些工具:

工具说明
install其后加上软件包名,用于安装一个软件包
update从软件源镜像服务器上下载/更新用于更新本地软件源的软件包列表
upgrade升级本地可更新的全部软件包,但存在依赖问题时将不会升级,通常会在更新之前执行一次 update
dist-upgrade解决依赖关系并升级(存在一定危险性)
remove移除已安装的软件包,包括与被移除软件包有依赖关系的软件包,但不包含软件包的配置文件
autoremove移除之前被其他软件包依赖,但现在不再被使用的软件包
purge与 remove 相同,但会完全移除软件包,包含其配置文件
clean移除下载到本地的已经安装的软件包,默认保存在 /var/cache/apt/archives/
autoclean移除已安装的软件的旧版本软件包

下面是一些apt-get常用的参数:

参数说明
-y自动回应是否安装软件包的选项,在一些自动化安装脚本中使用这个参数将十分有用
-s模拟安装
-q静默安装方式,指定多个 q 或者 -q=## 表示数字,用于设定静默级别,这在你不想要在安装软件包时屏幕输出过多时很有用
-f修复损坏的依赖关系
-d只下载不安装
--reinstall重新安装已经安装但可能存在问题的软件包
--install-suggests同时安装 APT 给出的建议安装的软件包

安装软件包

image-20211221130836102

# 更新软件源
sudo apt-get update

# 升级没有依赖问题的软件包
sudo apt-get upgrade

# 升级并解决依赖关系
sudo apt-get dist-upgrade
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

卸载软件

如果你现在觉得 w3m 这个软件不合自己的胃口或者是找到了更好的,你需要卸载它。那么简单,同样是一个命令加回车 sudo apt-get remove w3m,系统会有一个确认的操作,之后这个软件就被卸载了。

sudo apt-get remove w3m
  • 1

或者执行

# 不保留配置文件的移除
sudo apt-get purge w3m
# 或者
sudo apt-get --purge remove w3m
# 移除不再需要的被依赖的软件包
sudo apt-get autoremove
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

软件搜索

当自己刚知道了一个软件,想下载使用,需要确认软件仓库里面有没有,就需要用到搜索功能了,命令如下:

sudo apt-cache search softname1 softname2 softname3……
  • 1

apt-cache 命令则是针对本地数据进行相关操作的工具,search 顾名思义在本地的数据库中寻找有关 softname1softname2 相关软件的信息。现在我们试试搜索一下之前我们安装的软件 w3m,如图:

image-20211221131056303

使用dpkg

该部分讲解dpkg从本地磁盘安装deb软件包

dpkg介绍

dpkg 是 Debian 软件包管理器的基础,它被伊恩·默多克创建于 1993 年。dpkg 与 RPM 十分相似,同样被用于安装、卸载和供给和 .deb 软件包相关的信息。

dpkg 本身是一个底层的工具。上层的工具,像是 APT,被用于从远程获取软件包以及处理复杂的软件包关系。"dpkg"是"Debian Package"的简写。

dpkg常用参数:

参数说明
-i安装指定 deb 包
-R后面加上目录名,用于安装该目录下的所有 deb 安装包
-rremove,移除某个已安装的软件包
-I显示 deb 包文件的信息
-s显示已安装软件的信息
-S搜索已安装的软件包
-L显示已安装软件包的目录信息
使用dpkg安装deb软件包
sudo apt-get update
sudo apt-get -d install -y emacs
  • 1
  • 2

下载完成后,我们可以查看/var/cache/apt/archives/目录下的内容,如下图:

image-20211221131739427

然后我们将第一个deb拷贝到 /home/shiyanlou 目录下,并使用dpkg安装

cp /var/cache/apt/archives/emacs24_24.5+1-6ubuntu1.1_amd64.deb ~
# 安装之前参看deb包的信息
sudo dpkg -I emacs24_24.5+1-6ubuntu1.1_amd64.deb
  • 1
  • 2
  • 3

如你所见,这个包还额外依赖了一些软件包,这意味着,如果主机目前没有这些被依赖的软件包,直接使用 dpkg 安装可能会存在一些问题,因为dpkg并不能为你解决依赖关系。

# 使用dpkg安装
sudo dpkg -i emacs24_24.5+1-6ubuntu1.1_amd64.deb
  • 1
  • 2

image-20211221132003291

我们将如何解决这个错误呢?这就要用到apt-get了,使用它的-f参数了,修复依赖关系的安装

sudo apt-get update
sudo apt-get -f install -y
  • 1
  • 2

没有任何错误,这样我们就安装成功了,然后你可以运行 emacs 程序

查看已安装软件包的安装木目录

sudo dpkg -L emacs24

从二进制包安装

二进制包的安装比较简单,我们需要做的只是将从网络上下载的二进制包解压后放到合适的目录,然后将包含可执行的主程序文件的目录添加进PATH环境变量即可,如果你不知道该放到什么位置,请重新复习第四节关于 Linux 目录结构的内容。

Linux进程概念

程序(procedure):不太精确地说,程序就是执行一系列有逻辑、有顺序结构的指令,帮我们达成某个结果。就如我们去餐馆,给服务员说我要牛肉盖浇饭,她执行了做牛肉盖浇饭这么一个程序,最后我们得到了这么一盘牛肉盖浇饭。它需要去执行,不然它就像一本武功秘籍,放在那里等人翻看。

进程(process):进程是程序在一个数据集合上的一次执行过程,在早期的 UNIX、Linux 2.4 及更早的版本中,它是系统进行资源分配和调度的独立基本单位。同上一个例子,就如我们去了餐馆,给服务员说我要牛肉盖浇饭,她执行了做牛肉盖浇饭这么一个程序,而里面做饭的是一个进程,做牛肉汤汁的是一个进程,把牛肉汤汁与饭混合在一起的是一个进程,把饭端上桌的是一个进程。它就像是我们在看武功秘籍这么一个过程,然后一个篇章一个篇章地去练。

进程的分类

进程分类。可以从两个角度来分:

  • 以进程的功能与服务的对象来分;
  • 以应用程序的服务类型来分;

第一个角度来看,我们可以分为用户进程与系统进程:

  • 用户进程:通过执行用户程序、应用程序或称之为内核之外的系统程序而产生的进程,此类进程可以在用户的控制下运行或关闭。
  • 系统进程:通过执行系统内核程序而产生的进程,比如可以执行内存资源分配和进程切换等相对底层的工作;而且该进程的运行不受用户的干预,即使是 root 用户也不能干预系统进程的运行。

第二角度来看,我们可以将进程分为交互进程、批处理进程、守护进程:

  • 交互进程:由一个 shell 终端启动的进程,在执行过程中,需要与用户进行交互操作,可以运行于前台,也可以运行在后台。
  • 批处理进程:该进程是一个进程集合,负责按顺序启动其他的进程。
  • 守护进程:守护进程是一直运行的一种进程,在 Linux 系统启动时启动,在系统关闭时终止。它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。例如 httpd 进程,一直处于运行状态,等待用户的访问。还有经常用的 cron(在 centOS 系列为 crond)进程,这个进程为 crontab 的守护进程,可以周期性的执行用户设定的某些任务。
进程的衍生

关于父进程与子进程便会提及这两个系统调用 fork()exec()

fork() 是一个系统调用(system call),它的主要作用就是为当前的进程创建一个新的进程,这个新的进程就是它的子进程,这个子进程除了父进程的返回值和 PID 以外其他的都一模一样,如进程的执行代码段,内存信息,文件描述,寄存器状态等等

exec() 也是系统调用,作用是切换子进程中的执行程序也就是替换其从父进程复制过来的代码段与数据段

进程组与Sessions

每一个进程都会是一个进程组的成员,而且这个进程组是唯一存在的,他们是依靠 PGID(process group ID)来区别的,而每当一个进程被创建的时候,它便会成为其父进程所在组中的一员。

一般情况,进程组的 PGID 等同于进程组的第一个成员的 PID,并且这样的进程称为该进程组的领导者,也就是领导进程,进程一般通过使用 getpgrp() 系统调用来寻找其所在组的 PGID,领导进程可以先终结,此时进程组依然存在,并持有相同的 PGID,直到进程组中最后一个进程终结。

与进程组类似,每当一个进程被创建的时候,它便会成为其父进程所在 Session 中的一员,每一个进程组都会在一个 Session 中,并且这个 Session 是唯一存在的,

Session 主要是针对一个 tty 建立,Session 中的每个进程都称为一个工作(job)。每个会话可以连接一个终端(control terminal)。当控制终端有输入输出时,都传递给该会话的前台进程组。Session 意义在于将多个 jobs 囊括在一个终端,并取其中的一个 job 作为前台,来直接接收该终端的输入输出以及终端信号。 其他 jobs 在后台运行。

前台(foreground)就是在终端中运行,能与你有交互的

后台(background)就是在终端中运行,但是你并不能与其任何的交互,也不会显示其执行的过程

工作管理

bash(Bourne-Again shell)支持工作控制(job control),而 sh(Bourne shell)并不支持。

并且每个终端或者说 bash 只能管理当前终端中的 job,不能管理其他终端中的 job。比如我当前存在两个 bash 分别为 bash1、bash2,bash1 只能管理其自己里面的 job 并不能管理 bash2 里面的 job

我们都知道当一个进程在前台运作时我们可以用 ctrl + c 来终止它,但是若是在后台的话就不行了。

我们可以通过 & 这个符号,让我们的命令在后台中运行:

ls &
  • 1

进程的管理

进程的查看

不管在测试的时候、在实际的生产环境中,还是自己的使用过程中,难免会遇到一些进程异常的情况,所以 Linux 为我们提供了一些工具来查看进程的状态信息。我们可以通过 top 实时的查看进程的状态,以及系统的一些信息(如 CPU、内存信息等),我们还可以通过 ps 来静态查看当前的进程信息,同时我们还可以使用 pstree 来查看当前活跃进程的树形结构。

不管在测试的时候、在实际的生产环境中,还是自己的使用过程中,难免会遇到一些进程异常的情况,所以 Linux 为我们提供了一些工具来查看进程的状态信息。我们可以通过 top 实时的查看进程的状态,以及系统的一些信息(如 CPU、内存信息等),我们还可以通过 ps 来静态查看当前的进程信息,同时我们还可以使用 pstree 来查看当前活跃进程的树形结构。
  • 1

top工具的使用

top工具是我们常用的一个查看工具,能实时的查看我们系统的一些关键信息的变化

top
  • 1

top 是一个在前台执行的程序,所以执行后便进入到这样的一个交互界面,正是因为交互界面我们才可以实时的获取到系统与进程的信息。在交互界面中我们可以通过一些指令来操作和筛选。在此之前我们先来了解显示了哪些信息。

内容解释
top表示当前程序的名称
11:05:18表示当前的系统的时间
up 8 days,17:12表示该机器已经启动了多长时间
1 user表示当前系统中只有一个用户
load average: 0.29,0.20,0.25分别对应 1、5、15 分钟内 cpu 的平均负载

这是单个 CPU 单核的情况,而实际生活中我们需要将得到的这个值除以我们的核数来看。我们可以通过以下的命令来查看 CPU 的个数与核心数:

#查看物理 CPU 的个数
cat /proc/cpuinfo | grep "physical id" | sort | uniq |wc -l

#每个 cpu 的核心数
cat /proc/cpuinfo | grep "physical id" | grep "0" | wc -l
  • 1
  • 2
  • 3
  • 4
  • 5

top的第二行数据

内容解释
Tasks: 26 total进程总数
1 running1 个正在运行的进程数
25 sleeping25 个睡眠的进程数
0 stopped没有停止的进程数
0 zombie没有僵尸进程数

top的第三行数据

内容解释
Cpu(s): 1.0%us用户空间进程占用 CPU 百分比
1.0% sy内核空间运行占用 CPU 百分比
0.0%ni用户进程空间内改变过优先级的进程占用 CPU 百分比
97.9%id空闲 CPU 百分比
0.0%wa等待输入输出的 CPU 时间百分比
0.1%hi硬中断(Hardware IRQ)占用 CPU 的百分比
0.0%si软中断(Software IRQ)占用 CPU 的百分比
0.0%st(Steal time) 是 hypervisor 等虚拟服务中,虚拟 CPU 等待实际 CPU 的时间的百分比

来看 top 的第四行数据,这一行基本上是内存的一个使用情况的统计了:

内容解释
8176740 total物理内存总量
8032104 used使用的物理内存总量
144636 free空闲内存总量
313088 buffers用作内核缓存的内存量

来看 top 的第五行数据,这一行基本上是交换区的一个使用情况的统计了:

内容解释
total交换区总量
used使用的交换区总量
free空闲交换区总量
cached缓冲的交换区总量,内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖

再下面就是进程的一个情况了

列名解释
PID进程 id
USER该进程的所属用户
PR该进程执行的优先级 priority 值
NI该进程的 nice 值
VIRT该进程任务所使用的虚拟内存的总数
RES该进程所使用的物理内存数,也称之为驻留内存数
SHR该进程共享内存的大小
S该进程进程的状态: S=sleep R=running Z=zombie
%CPU该进程 CPU 的利用率
%MEM该进程内存的利用率
TIME+该进程活跃的总时间
COMMAND该进程运行的名字

ps工具的使用

ps aux
  • 1
内容解释
F进程的标志(process flags),当 flags 值为 1 则表示此子程序只是 fork 但没有执行 exec,为 4 表示此程序使用超级管理员 root 权限
USER进程的拥有用户
PID进程的 ID
PPID其父进程的 PID
SIDsession 的 ID
TPGID前台进程组的 ID
%CPU进程占用的 CPU 百分比
%MEM占用内存的百分比
NI进程的 NICE 值
VSZ进程使用虚拟内存大小
RSS驻留内存中页的大小
TTY终端 ID
S or STAT进程状态
WCHAN正在等待的进程资源
START启动进程的时间
TIME进程消耗 CPU 的时间
COMMAND命令的名称和参数

TPGID栏写着-1 的都是没有控制终端的进程,也就是守护进程

STAT表示进程的状态,而进程的状态有很多,如下表所示

状态解释
RRunning.运行中
SInterruptible Sleep.等待调用
DUninterruptible Sleep.不可中断睡眠
TStoped.暂停或者跟踪状态
XDead.即将被撤销
ZZombie.僵尸进程
WPaging.内存交换
N优先级低的进程
<优先级高的进程
s进程的领导者
L锁定状态
l多线程状态
+前台进程

其中的 D 是不能被中断睡眠的状态,处在这种状态的进程不接受外来的任何 signal,所以无法使用 kill 命令杀掉处于 D 状态的进程,无论是 killkill -9 还是 kill -15,一般处于这种状态可能是进程 I/O 的时候出问题了。

使用 -l 参数可以显示自己这次登录的baah相关的进程信息

ps -l
  • 1

罗列出所有的进程信息

ps aux
  • 1

若要查找其中的某个进程的话,还可以配合grep和正则表达式一起使用

ps aux | grep zsh
  • 1

查看时,连同部分的进程呈树状显示出来

ps axjf
  • 1

也可自定义我们所需要的参数显示

ps -afxo user,ppid,pid,pgid,command
  • 1

pstree工具的使用

通过 pstree 可以很直接的看到相同的进程数量,最主要的还是我们可以看到所有进程之间的相关性。

pstree
  • 1
参数选择解释
-A程序树之间以 ASCII 字符连接
-p同时列出每个 process 的 PID
-u同时列出每个 process 的所属账户名称

kill命令的掌握

当一个进程结束的时候或者要异常结束的时候,会向其父进程返回一个或者接收一个 SIGHUP 信号而做出的结束进程或者其他的操作,这个 SIGHUP 信号不仅可以由系统发送,我们可以使用 kill 来发送这个信号来操作进程的结束或者重启等等。

# 首先我们使用图形界面打开了 gedit、gvim,用 ps 可以查看到
ps aux

# 使用 9 这个信号强制结束 gedit 进程
kill -9 1608

# 我们再查找这个进程的时候就找不到了
ps aux | grep gedit
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

进程的执行顺序

image-20211221143825837

# 这个实验在环境中无法做,因为权限不够,可以自己在本地尝试

# 打开一个程序放在后台,或者用图形界面打开
nice -n -5 vim &

# 用 ps 查看其优先级
ps -afxo user,ppid,pid,stat,pri,ni,time,command | grep vim
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

我们还可以用 renice 来修改已经存在的进程的优先级,同样因为权限的原因在实验环境中无法尝试。

renice -5 pid
  • 1

Linux日志系统

内容:

日志数据可以是有价值的信息宝库,也可以是毫无价值的数据泥潭。它可以记录下系统产生的所有行为,并按照某种规范表达出来。我们可以使用日志系统所记录的信息为系统进行排错,优化系统的性能,或者根据这些信息调整系统的行为。收集你想要的数据,分析出有价值的信息,可以提高系统、产品的安全性,还可以帮助开发完善代码,优化产品。日志会成为在事故发生后查明“发生了什么”的一个很好的“取证”信息来源。日志可以为审计进行审计跟踪。

常见的日志

日志是一个系统管理员,一个运维人员,甚至是开发人员不可或缺的东西,系统用久了偶尔也会出现一些错误,我们需要日志来给系统排错,在一些网络应用服务不能正常工作的时候,我们需要用日志来做问题定位,日志还是过往时间的记录本,我们可以通过它知道我们是否被不明用户登录过等等。

ll /var/log
  • 1

image-20211221144048877

根据图中所显示的日志,我们可以根据服务对象粗略的将日志分为两类

  • 系统日志
  • 应用日志

系统日志主要是存放系统内置程序或系统内核之类的日志信息如 alternatives.logbtmp 等等,应用日志主要是我们装的第三方应用所产生的日志如 tomcat7apache2 等等。

日志名称记录信息
alternatives.log系统的一些更新替代信息记录
apport.log应用程序崩溃信息记录
apt/history.log使用 apt-get 安装卸载软件的信息记录
apt/term.log使用 apt-get 时的具体操作,如 package 的下载、打开等
auth.log登录认证的信息记录
boot.log系统启动时的程序服务的日志信息
btmp错误的信息记录
Consolekit/history控制台的信息记录
dist-upgradedist-upgrade 这种更新方式的信息记录
dmesg启动时,显示屏幕上内核缓冲信息,与硬件有关的信息
dpkg.logdpkg 命令管理包的日志。
faillog用户登录失败详细信息记录
fontconfig.log与字体配置有关的信息记录
kern.log内核产生的信息记录,在自己修改内核时有很大帮助
lastlog用户的最近信息记录
wtmp登录信息的记录。wtmp 可以找出谁正在进入系统,谁使用命令显示这个文件或信息等
syslog系统信息记录

配置的日志

image-20211221144408334

sudo apt-get update
sudo apt-get install -y rsyslog
sudo service rsyslog start
ps aux | grep syslog
  • 1
  • 2
  • 3
  • 4

image-20211221144426388

vim /etc/rsyslog.conf

vim /etc/rsyslog.d/50-default.conf
  • 1
  • 2
  • 3

image-20211221144702465

通过这个简单的流程图我们可以知道 rsyslog 主要是由 Input、Output、Parser 这样三个模块构成的,并且了解到数据的简单走向,首先通过 Input module 来收集消息,然后将得到的消息传给 Parser module,通过分析模块的层层处理,将真正需要的消息传给 Output module,然后便输出至日志文件中。

第一个模块便是 Input,该模块的主要功能就是从各种各样的来源收集 messages,通过这些接口实现:

接口名作用
im3195RFC3195 Input Module
imfileText File Input Module
imgssapiGSSAPI Syslog Input Module
imjournalSystemd Journal Input Module
imklogKernel Log Input Module
imkmsg/dev/kmsg Log Input Module
impstatsGenerate Periodic Statistics of Internal Counters
imptcpPlain TCP Syslog
imrelpRELP Input Module
imsolarisSolaris Input Module
imtcpTCP Syslog Input Module
imudpUDP Syslog Input Module
imuxsockUnix Socket Input

了解了 rsyslog 环境的配置文件之后,我们看向 /etc/rsyslog.d/50-default.conf 这个配置文件,这个文件中主要是配置的 Filter Conditions,也就是我们在流程图中所看见的 Parser & Filter Engine,它的名字叫 Selectors 是过滤 syslog 的传统方法,他主要由两部分组成,facilitypriority,其配置格式如下:

facility.priority     log_location
  • 1

其中一个 priority 可以指定多个 facility,多个 facility 之间使用逗号 , 分割开

rsyslog 通过 Facility 的概念来定义日志消息的来源,以便对日志进行分类,Facility 的种类有:

类别解释
kern内核消息
user用户信息
mail邮件系统消息
daemon系统服务消息
auth认证系统
authpriv权限系统
syslog日志系统自身消息
cron计划安排
news新闻信息
local0~7由自定义程序使用

而另外一部分 priority 也称之为 serverity level,除了日志的来源以外,对统一源产生日志消息还需要进行优先级的划分,而优先级的类别有以下几种:

类别解释
emergency系统已经无法使用了
alert必须立即处理的问题
critical很严重了
error错误
warning警告信息
notice系统正常,但是比较重要
informational正常
debugdebug 的调试信息
panic很严重但是已淘汰不常用
none没有优先级,不记录任何日志消息

image-20211221144854993

image-20211221144906509

转储的日志

在本地的机器中每天都有成百上千条日志被写入文件中,更别说是我们的服务器,每天都会有数十兆甚至更多的日志信息被写入文件中,如果是这样的话,每天看着我们的日志文件不断的膨胀,那岂不是要占用许多的空间,所以有个叫 logrotate 的东西诞生了。

logrotate 程序是一个日志文件管理工具。用来把旧的日志文件删除,并创建新的日志文件。我们可以根据日志文件的大小,也可以根据其天数来切割日志、管理日志,这个过程又叫做“转储”。

大多数 Linux 发行版使用 logrotate 或 newsyslog 对日志进行管理。logrotate 程序不但可以压缩日志文件,减少存储空间,还可以将日志发送到指定 E-mail,方便管理员及时查看日志。

显而易见,logrotate 是基于 CRON 来运行的,其脚本是 /etc/cron.daily/logrotate;同时我们可以在 /etc/logrotate 中找到其配置文件

cat /etc/logrotate.conf
  • 1

image-20211221145129053

这其中的具体意思是什么呢?

# see "man logrotate" for details  //可以查看帮助文档
# rotate log files weekly
weekly                             //设置每周转储一次(daily、weekly、monthly当然可以使用这些参数每天、星期,月 )
# keep 4 weeks worth of backlogs
rotate 4                           //最多转储4次
# create new (empty) log files after rotating old ones
create                             //当转储后文件不存在时创建它
# uncomment this if you want your log files compressed
compress                          //通过gzip压缩方式转储(nocompress可以不压缩)
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d           //其他日志文件的转储方式配置文件,包含在该目录下
# no packages own wtmp -- we'll rotate them here
/var/log/wtmp {                    //设置/var/log/wtmp日志文件的转储参数
    monthly                        //每月转储
    create 0664 root utmp          //转储后文件不存在时创建它,文件所有者为root,所属组为utmp,对应的权限为0664
    rotate 1                       //最多转储一次
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

当然在 /etc/logrotate.d/ 中有各项应用的 logrotate 配置,还有更多的配置参数,大家可以使用 man 查看,如按文件大小转储,按当前时间格式命名等等参数配置。

此笔记摘录与 蓝桥云

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/216651
推荐阅读
相关标签
  

闽ICP备14008679号