【重难点】【Linux 01】Linux 的体系结构、Linux 的目录结构、Linux 查找命令、grep、sed、AWK

【重难点】【Linux 01】Linux 的体系结构、Linux 的目录结构、Linux 查找命令、grep、sed、AWK

一、Linux 的体系结构

1.简介

Linux 系统一般有四个部分:内核(KERNEL)、命令解释层(SHELL)、用户应用(USERS APPLICATIONS)、文件系统(FILES SYSTEMS)

在这里插入图片描述

用户态和内核态

Kernel 本质上来看是一种软件,实现了进程管理器、内存管理器、设备驱动、网络管理组件以及文件系统,负责对接、管理计算机硬件平台,并通过系统调用为用户应用暴露计算机硬件资源以提供运行环境

以系统调用为边界,LInux 操作系统的体系结构被划分为用户态和内核态(包括系统调用)

操作系统的用户态和内核态对应了 CPU 指令集中的非特权指令和特权指令的执行状态,CPU 划分了不同的执行级别来执行相应特权的指令。比如说 Intel x86 CPU 具有四种不同的执行级别(RING0、RING1、RING2、RING3),Linux 操作系统只使用其中的 RING0 和 RING3 分别表示内核态和用户态,处于 RING3 状态的用户态代码不能直接访问处于 RING0 级别的内核态代码的内存地址空间(包括代码和数据)

划分用户态和内核态的目的有两个:

  1. 禁止用户程序和底层硬件平台直接交互
  2. 禁止用户程序直接访问任意内存地址空间

我们知道,有些 CPU 特权指令的操作实际是比较危险的,比如:写入系统配置文件、终止其它用户的进程或重启系统。所以,在操作系统的设计中,为了保障操作系统的稳定性,尤其是在多用户环境中的可靠性,操作系统根据 CPU 的指令类型来抽象并实现了用户态和内核态两种代码运行模式,两种运行模式之间的切换也称为模式切换。用户态的代码被限制了可以执行的操作以及可以访问的资源范围,而内核态的代码则可以执行任何操作,并且没有资源使用上的限制

举个例子解释模式切换的过程,用户运行一个程序,该程序创建的进程一开始运行在用户态,如果程序要执行诸如文件操作、网络数据发送操作等内核态操作的话,就必须通过系统调用中的 Write、Send 等功能单元完成,底层是通过调用内核代码完成的。此时,运行该进程的处理器会从 RING3 切换到 RING0 级别,然后进入内核地址空间中完成内核代码的执行。执行完成后。处理器再从 RING0 切换回 RING3,进程也回到用户态

在这里插入图片描述

用户态的应用程序可以通过三种方式访问内核态的资源:

  1. 系统调用
  2. 库函数
  3. Shell 脚本

2.内核(KERNEL)

内核是系统的心脏,是运行程序和管理硬件资源的核心程序。操作系统向用户提供一个操作界面,它从用户那里接受命令,并且把命令送给内核去执行。由于内核提供的都是操作系统最基本的功能,如果内核发生问题,整个计算机系统就可能会崩溃

Linux 内核的源码主要是用 C 语言编写,只有部分与驱动相关的用汇编语言编写。Linux 内核采用模块化的结构,实现了进程管理器、内存管理器、设备驱动、网络管理组件以及文件系统,负责对接、管理计算机硬件平台,并通过系统调用为用户应用暴露计算机硬件资源以提供运行环境。Linux 内核的源代码通常安装在 /usr/src 目录,可供用户查看和修改

当 LInux 安装完毕之后,一个通用的内核就被安装到计算机中。这个通用内核能满足绝大部分用户的需求,但也正因为内核的这种普遍适用性,具体到某一台计算机的时候,很多可能并不需要的内核程序也将被安装并运行。Linux 允许用户根据主机机器的实际用途配置 Linux 内核,从而有效地简化 Linux 内核、提高系统启动速度、并释放更多的内存资源

3.命令解释层(SHELL)

从表面上来看,Shell 是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令,并且把它送入内核去执行

从本质上来看,Shell 是一个命令解释器,它解释由用户输入的命令,并且把它们送到内核。不仅如此,Shell 还有自己的编程语言用于对命令的编辑,它允许用户编写由 Shell 命令组成的程序

4.文件系统(FILES SYSTEMS)

文件系统时操作系统中负责管理持久数据的子系统,说简单点,就是负责把用户的文件存到磁盘硬件中,即使计算机断电了,磁盘里的数据也不会丢失,因此可以持久化地保存文件

文件系统的基本数据单位是文件,它的目的是对磁盘上的文件进行组织管理,组织地方式不同,就会形成不同的文件系统,Linux 最经典的一句话是:一切皆文件,不只是普通的文件和目录,就连块设备、管道、Socket 等也都是统一交给文件系统管理的

Linux 文件系统会为每个文件分配两个数据结构:索引节点(index node)和目录项(directory entry),它们主要用来记录文件的辕信息和目录层次结构

  • 索引节点
    也就是 inode,用来记录文件的元信息,比如 inode 编号、文件大小、访问权限、创建时间、修改时间、数据在磁盘中的位置等等。索引节点是文件的唯一标识,它们之间一一对应,也同样会被存储在硬盘中,所以索引节点同样占用磁盘空间
  • 目录项
    也就是 dentry,用来记录文件的名字、索引节点指针以及其它目录项的层级关联关系。多个目录项关联起来,就会形成目录结构,但与索引节点不同的是,目录项是由内核维护的一个数据结构,不存放于磁盘,而是缓存在内存。目录项和目录虽然名字很接近,但它们不是一个东西,目录是一个文件,持久化存储在磁盘里,而目录项是内核地一个数据结构,缓存在内存。如果查询目录需要频繁地从磁盘读取,效率会很低,所以内核会把已经读过的目录用目录项这个数据结构缓存在内存,下次再次读到相同的目录时,只需从内存读就可以,大大提高了文件系统的效率。此外,目录项这个数据结构不只表示目录,也可以表示文件

二、Linux 的目录结构

Linux 的目录结构层次鲜明,就像一棵树
在这里插入图片描述

说明

  • /bin:存放二进制可执行文件,常用命令一般都在这里
  • /etc:存放系统管理和配置文件
  • /home:存放所有用户文件的根目录,是用户主目录的基点,比如用户 user 的主目录就是 /home/user,可以用 ~user 表示
  • /usr:用于存放系统应用程序
  • /opt:额外安装的可选应用程序包所放置的位置。一般情况下,我们可以把 tomecat 等都安装到这里
  • /proc:虚拟文件系统目录,是系统内存的映射。可直接访问这个目录来获取系统信息
  • /root:超级用户(系统管理员)的主目录
  • /sbin:存放二进制可执行文件,只有 root 才能访问。这里存放的是系统管理员使用的系统级别的管理命令和程序。如 ifconfig 等
  • /dev:用于存放设备文件
  • /mnt:系统管理员安装临时文件系统的安装点,系统提供这个目录是让用户临时挂载其它的文件系统
  • /boot:存放用于系统引导时使用的各种文件
  • /lib:存放着和系统运行相关的库文件
  • /tmp:用于存放各种临时文件,是公用的临时文件存储点
  • /var:用于存放运行时需要改变数据的文件,也是某些大文件的溢出区,比如各种服务的日志文件(系统启动日志等)
  • /lost+found:这个目录平时是空的,系统非正常关机而留下 “无家可归” 的文件(Windows 下叫 .chk)就在这里

三、Linux 查找命令

在 Linux 要查找某个文件,当不知道放在哪里了,可以使用下面的一些命令来搜索:

  • find:实际搜寻硬盘查询文件名称
  • locate:配合数据库查看文件位置
  • whereis:查看文件的位置
  • which:查看可执行文件的位置

1.find

find 命令用于在文件树中查找文件,并作出相应的处理

命令格式

find pathname -options [-print -exec -ok …]

命令参数

pathname:find 命令所查找的目录路径。例如用 . 来表示当前目录,用 / 来表示系统根目录
options:命令选项
-pring:find 命令将匹配的文件输出到标准输出
-exec:find 命令将匹配的文件执行该参数所给出的 shell 命令
-ok:和 -exec 的作用相同,只不过以一种更为安全的模式来执行该参数所给出的 shell 命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行

options 命令选项

-name 按文件名查找文件
-perm 按文件权限查找文件
-user 按文件所属的用户查找文件
-group 按文件所属的组查找文件
-type 查找某一类型的文件

实例

find ./ -name ‘*.log’

在当前目录查找以 .log 结尾的文件

find /opt -perm 777

查找 /opt 目录下权限为 777 的文件

2.locate

locate命令其实是 “find -name” 的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库(/var/lib/locatedb),这个数据库中含有本地所有文件信息。Linux 系统自动创建这个数据库,并且每天自动更新一次,所以使用locate 命令查不到最新变动过的文件。为了避免这种情况,可以在使用 locate 之前,先使用 updatedb 命令,手动更新数据库

命令参数

-l num(要显示的行数)
-f 将特定的档案系统排除在外
-r 使用正则运算式作为寻找条件

实例

locate pwd

查找文件名中包含 pwd 的所有文件

locate /etc/sh

搜索 etc 目录下所有以 sh 开头的文件

locate -r ‘^/var.*reason$’

查找 /var 目录下,以 reason 结尾的文件。其中 . 表示一个字符;* 表示任务多个;.* 表示任意多个字符

3.whereis

whereis 命令只能用于程序名的搜索,而且只搜索二进制文件(参数 -b)、man 说明文件(参数 -m)和源代码文件(参数 -s)。如果省略参数,则返回所有信息。whereis 和 locate 都是基于系统内建的数据库进行搜索,因此效率很高,而 find 则是遍历硬盘查找文件

命令参数

-b 定位可执行文件
-m 定位帮助文件
-s 定位源代码文件
-u 搜索默认路径下除可执行文件、源代码文件、帮助文件以外的其他文件

实例

whereis locate

查找 locate 程序相关的文件

whereis -s locate

查找 locate 的源码文件

whereis -m locate

查找 locate 的帮助文件

4.which

which 是在 PATH 中搜寻某个系统命令的位置,并返回第一个搜索结果。使用 which 命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令

命令参数

-n 指定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名

实例

which ls

查看 ls 命令是否存在,执行哪个

which cd

查看 cd,会显示不存在,因为 cd 是内建命令,而 which 查找显示是 PATH 中的命令

四、grep、sed、AWK

grep、sed、AWK 是 Linux 操作文本的三大利器,也是必须掌握的 Linux 命令之一。三者的功能都是处理文本,但侧重点各不相同,其中 AWK 功能最强大,也最复杂。grep 更适合单纯的查找或匹配文本,sed 更适合编辑匹配到的文本,AWK 更适合格式化文本,对本进行较复杂格式的处理

1.grep

grep(Global Regular Expression Print,全局正则表达式搜索),是一个最初用于 Unix 操作系统的命令行工具,在给出文件列表或标准输入后,grep 会对匹配一个或多个正则表达式的文本进行搜索,并只输出匹配(或者不匹配) 的行或文本

它的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容

grep 可用于 shell 脚本,因为 grep 通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回 0,如果搜索不成功,则返回 1,如果搜索的文件不存在,则返回 2.我们利用这些返回值就可进行一些自动化的文本处理工作

命令格式

grep [option] pattern file|dir

命令参数

-A n --after-context 显示匹配字符后 n 行
-B n --before-context 显示匹配字符前 n 行
-C n --context 显示匹配字符前后 n 行
-c --count 计算符合样式的列数
-i 忽略大小写
-l 只列出文件内容符合指定的样式的文件名称
-f 从文件中读取关键词
-n 显示匹配内容的所在文件中行数
-R 递归查找文件夹

grep 的规则表达式

^		锚定行的开始,如:'^grep' 匹配所有以 grep 开头的行
$		锚定行的结束,如:'grep$' 匹配所有以 grep 结尾的行
.		匹配一个非换行符的字符,如:'gr.p' 匹配 gr 后接一个任意字符,然后是 p
*		匹配零个或多个先前字符,如:'*grep' 匹配所有一个或多个空格后紧跟 grep 的行
.*		一起使用代表任意字符
[]		匹配一个指定范围内的字符,如:'[Gg]rep' 匹配 Grep 和 grep
[^]		匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep' 匹配不包含 A-RT-Z 的一个字母开头,紧跟 rep 的行
\(..\)	标记匹配字符,如 '\(love\)',love 被标记为 1
\<		锚定单词的开始,如:'\<grep' 匹配包含以 grep 开头的单词的行
\>		锚定单词的结束,如:'grep\>' 匹配包含以 grep 结尾的单词的行
x\{m\}	重复字符 x m 次,如:'o\{5\}' 匹配包含 5 个 o 的行
x\{m,\}	重复字符 x 至少 m 次,如:'o\{5,\}' 匹配至少有 5 个 o 的行
x\{m,n\}重复字符 x 至少 m 次,如:'o\{5,10\}' 匹配 5~10 个 o 的行
\w		匹配文字和数字字符,也就是 [A-Za-z0-9],如:'G\w*p' 匹配以 G 后跟多个文字或数字字符,然后是 p
\b		单词锁定夫,如:'\bgrep\b' 只匹配grep

实例

ps -ef | grep svn

查找指定进程

ps -ef | grep svn -c

查找指定进程个数

cat test1.txt | grep -f key.log

从文件夹中读取关键字

grep -lR ‘^grep’ /tmp

从文件夹中递归查找以 grep 开头的行,并只列出文件

grep ‘^[^x]’ test.txt

查找非 x 开关的行内容

grep -E ‘ed|at’ test.txt

显示包含 ed 或者 at 字符的内容行

grep -E ‘ed|at’ test.txt

2.sed

sed 意为流编辑器(stream editor),使用简单紧凑的编程语言来解析和转换文本。它一次只处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,称为 “模式空间”(pattern space),接着用 sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下一行,执行下一个循环

3.AWK

AWK 的名称得自于它的创始人 Alfred Aho、Peter Weinberger 和 Brian Kernighan 的Family Name 的首字母,AWK 是一种优良的文本处理工具,是 Linux 及 Unix 环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言的最大功能取决于一个人所拥有的只是。AWK 提供了极其强大的功能:可以进行正则表达式的匹配、样式装入、流控制、数学运算符、进程控制语句,甚至内置了变量和函数。它具备了一个完整的语言所应具有的几乎所有精美特性。实际上 AWK 的确拥有自己的语言:AWK 程序设计语言,三位创建者已将它正式定义为 “样式扫描和处理语言”。它允许创建简短的程序,这些程序读取输入文件,为数据排序、处理数据,对输入执行计算以及生成报表,还有无数其它的功能。最初创造 AWK 时,其目的是用于文本处理,并且这种语言的基础是:只要在输入数据中有模式匹配,就执行一系列指令。该实用工具扫描文件中的每一行,查找与命令行中所给定内容相匹配的模式。如果发现匹配内容,则进行下一个编程步骤。如果找不到匹配内容,则继续处理下一行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

313YPHU3

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值