1 nginx配置结构和流量逻辑过程
1.1 nginx配置结构
- 全局配置段:控制软件运行
- events配置段:配置Nginx的事件驱动模型和连接处理机制(接收连接用户)
- http配置段:配置http服务的全局参数(处理连接)
-
- Server配置段:定义虚拟主机,处理不同域名或端口请求(具体的网站配置)
-
- location配置段:根据请求的URL路径匹配并处理请求(具体的访问url请求)
- .......
1.2 流量逻辑过程(简)
客户端(浏览器)输入域名访问服务器某资源,首先是基于tcp协议建立连接,然后根据server_name和listen80选中server段,紧接着在location段内进行资源匹配,一般来讲若请求的资源能找到对应的文件,则立即返回该静态文件;若找不到尝试访问目录形式的该资源,如存在访问该目录下默认的index首页,若前两步都找不到返回404
2 搭建nginx实现npm和node相关的实验演示
2.1 相关概念
1 node.js是一个基于Chrom V8引擎的javascript运行环境;让javascript运行在服务器。传统javascript运行在浏览器,node.js出现使得开发人员可以使用javascript在服务端编写代码。Node.js 可以用于构建高性能的 Web 服务器,处理大量的并发请求。
2 npm:全称Node Package Manager,是node.js的包管理工具,主要功能是管理Node.js项目中的各种依赖包。
2.2 Nodejs实验
# 1 安装nodejs和npm包
[wch@Ubuntu-Server-24]$ sudo apt update
[wch@Ubuntu-Server-24]$ sudo apt install nodejs npm
# 2 创建新的项目目录
[wch@Ubuntu-Server-24]$ sudo mkdir -p /data/codes/my-node-server
00:36:23-[当前目录:~]
[wch@Ubuntu-Server-24]$ cd /data/codes/my-node-server
# 3 创建一个js文件
[wch@Ubuntu-Server-24]$ sudo vim server.js
00:39:22-[当前目录:/data/codes/my-node-server]
[wch@Ubuntu-Server-24]$ cat server.js
const http = require('http');// 创建一个 HTTP 服务器
const server = http.createServer((req, res) => {// 设置响应头res.writeHead(200, { 'Content-Type': 'text/plain' });// 发送响应内容res.end('Hello, world!\n');
});// 监听 3000 端口
server.listen(3000, '0.0.0.0', () => {console.log('Server running at http://0.0.0.0:3000/');
});
# 4 运行该js代码
[wch@Ubuntu-Server-24]$ node server.js
Server running at http://0.0.0.0:3000/
# 5 浏览器或使用curl命令访问4提示网址
[wch@Ubuntu-Desktop-24]$ curl 10.0.0.16:3000
Hello, world!
# 6 结束该服务
ctrl+c
2.3 npm实验
# 1 项目初始化
[wch@Ubuntu-Server-24]$ sudo mkdir /data/codes/npm-project
[sudo] password for wch:
00:23:05-[当前目录:~]
[wch@Ubuntu-Server-24]$ cd /data/codes/npm-project
00:23:11-[当前目录:/data/codes/npm-project]
[wch@Ubuntu-Server-24]$ sudo npm init # 引导创建一个名位package.json的文件,该文件记录项目的元数据和各种依赖项信息,npm init属于交互式创建,加上-y选项属于非交互式
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.See `npm help init` for definitive documentation on these fields
and exactly what they do.Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.Press ^C at any time to quit.
package name: (npm-project)
version: (1.0.0)
description: 一个简单的npm小项目示例 # 简单项目描述
entry point: (index.js)
test command:
git repository:
keywords:
author: wch # 项目作者,其余项可暂时回车跳过
license: (ISC)
About to write to /data/codes/npm-project/package.json:{"name": "npm-project","version": "1.0.0","description": "一个简单的npm小项目示例","main": "index.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"author": "wch","license": "ISC"
}Is this OK? (yes)# 2 定制镜像源;默认镜像源安装软件包缓慢,可替换默认镜像源或者安装软件包时临时指定镜像源
[wch@Ubuntu-Server-24]$ sudo npm config set registry https://registry.npmmirror.com
00:25:09-[当前目录:/data/codes/npm-project]
[wch@Ubuntu-Server-24]$ cat .npmrc # 修改镜像源后会在项目目录下生成名为.npmrc的隐藏文件
registry=https://registry.npmmirror.com/# 3 安装项目依赖
[wch@Ubuntu-Server-24]$ sudo npm install express # express是一个流行的node.js web应用框架,若没有修改镜像源可临时指定:npm install express --registry=https://registry.npmmirror.com
[wch@Ubuntu-Server-24]$ ll
total 48
drwxr-xr-x 3 root root 4096 Sep 26 00:25 ./
drwxr-xr-x 4 root root 4096 Sep 26 00:23 ../
-rw-rw-rw- 1 root root 41 Sep 26 00:25 .npmrc
drwxr-xr-x 68 root root 4096 Sep 26 00:25 node_modules/ # express框架安装在该目录下
-rw-r--r-- 1 root root 28220 Sep 26 00:25 package-lock.json
-rw-r--r-- 1 root root 292 Sep 26 00:25 package.json # 安装软件包的同时会在该文件中添加相关的依赖项 # 4 项目创建,创建一个入口文件index.js
[wch@Ubuntu-Server-24]$ sudo vim index.js
const express = require('express');
const app = express();
const port = 3000;// 定义简单的路由
app.get('/', (req, res) => {res.send('站点首页!!!\n');
});app.get('/login', (req, res) => {res.send('站点登录页面!!!\n');
});app.get('/register', (req, res) => {res.send('站点注册页面!!!\n');
});// 启动服务器
app.listen(port, () => {console.log(`Server is running on port ${port}`);
});# 5 项目启动运行
[wch@Ubuntu-Server-24]$ sudo vim package.json # 在package.json文件下配置启动脚本
{"name": "npm-project","version": "1.0.0","description": "一个简单的npm小项目示例","main": "index.js","scripts": {"start": "node index.js" # 修改此行},"author": "wch","license": "ISC","dependencies": {"express": "^5.1.0"}
}
00:33:30-[当前目录:/data/codes/npm-project]
[wch@Ubuntu-Server-24]$ npm start # 运行该项目
> npm-project@1.0.0 start
> node index.jsServer is running on port 3000# 6 访问效果测试
[wch@Ubuntu-Desktop-24]$ curl 10.0.0.16:3000
站点首页!!!
16:17:37-[当前目录:~]
[wch@Ubuntu-Desktop-24]$ curl 10.0.0.16:3000/login
站点登录页面!!!
16:17:43-[当前目录:~]
[wch@Ubuntu-Desktop-24]$ curl 10.0.0.16:3000/register
站点注册页面!!!
3 文件系统相关知识点及软硬链接
3.1 系统相关目录
- /boot:存放启动linux时的一些核心文件
- /etc:存放所有系统管理所需要的配置文件
- /lib: 存放库文件,系统最基本的动态连接共享库,应用程序都会用到这些共享库
- /sys: linux2.6内核后的新增目录,存放新出现的文件系统sysfs
- /bin: 二进制的缩写,存放最常使用的命令
- /sbin:superuser binary的缩写,存放系统管理员使用的系统管理程序命令
- /usr/bin: 系统用户使用的应用程序
- /usr/sbin: 超级用户使用的比较高级的管理程序和系统守护程序
- proc: Processes(进程) 的缩写,,/proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息
- /srv:该目录存放一些服务启动之后需要提取的数据
- /usr: usr 是 unix shared resources(共享资源),用户的很多应用程序和文件都放在这个目录下,类似于 windows 下的 program files 目录
- /usr/src: 内核源代码默认的放置目录
- /var:var 是 variable(变量) 的缩写,存放着在不断扩充着的东西,主要用于那些经常被修改的场景
- /run:是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run
- /usr/share:应用程序软件的帮助信息文件所在目录
- /dev:dev 是 Device(设备) 的缩写, 该目录下存放的是 Linux 的外部设备
- /media:linux 系统会自动识别一些设备,例如U盘、光驱等等,当识别后,Linux 会把识别的设备挂载到这个目录下
- /mnt:系统提供该目录是为了让用户临时挂载别的文件系统的,简单来说是给光驱使用的
- /lost+found:这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。
- /opt:opt 是 optional(可选) 的缩写,这是给主机额外安装软件所摆放的目录。
- /selinux:这个目录是 Redhat/CentOS 所特有的安全机制目录,类似于 windows 的防火墙目录。
- /tmp:tmp 是 temporary(临时) 的缩写这个目录是用来存放一些临时文件的
3.2 文件类型
- 普通文件:文本、数据、程序代码类文件,可通过cat、more、less查看
- 目录文件:用于存储其他文件的路径名和相关信息,通过mkdir、rmdir、cd命令操作
- 链接文件:主要分软链接(符号链接)文件和硬链接文件,软链接文件相当于windows下创建的快捷方式
- 特殊文件:例如设备文件:块设备文件(按块读写,例如硬盘、光驱)、字符设备文件(按字符读写,例如键盘、鼠标)
- 可执行文件:程序代码文件,x表示
- 其他文件:如管道文件(进程间通信)、套接字文件(进程间网络通信)
3.3 dos2unix⭐️
# dos2unix
- dos2unix是一个在Linux系统中广泛使用的命令行工具,主要用于将Windows风格的文本文件格式转换为Unix/Linux风格的文本文件格式,从而解决在不同操作系统之间传输文本文件时可能出现的格式不兼容问题。
- dos2unix命令能够将文件中的CRLF(Windows下文本行结束标识)转换为LF(LINUX系统中文本行结束标识)
- dos2unix命令还可以移除Windows系统文本文件中行末多余的空格和制表符# hexdump
- hexdump是一个在 Unix 和类 Unix 系统(如 Linux)中常用的命令,用于以十六进制和 ASCII 码
的形式显示文件的内容。它属于系统工具级别的命令。
- hexdump命令主要用于系统管理、调试、数据分析以及对二进制文件的查看和处理等工作。例如,系统管理员可能会用它来检查系统日志文件的原始内容,开发人员可能会用它来分析程序生成的二进制数据文件,以查找可能存在的错误或异常
# 1 新建两个文件,一个windows,一个linux
[wch@Ubuntu-Server-24]$ file windows.txt
windows.txt: ASCII text, with CRLF line terminators
22:51:13-[当前目录:~]
[wch@Ubuntu-Server-24]$ vim linux.txt
22:51:39-[当前目录:~]
[wch@Ubuntu-Server-24]$ file linux.txt
linux.txt: ASCII text
# 2 查看两个文件细节
[wch@Ubuntu-Server-24]$ hexdump -C windows.txt # -C选项是以规范十六进制和ASCII字符混合显示文件内容,不加该选项默认是以十六进制显示
00000000 77 69 6e 64 6f 77 73 20 66 69 6c 65 0d 0a 74 65 |windows file..te|
00000010 73 74 |st|
00000012
22:53:29-[当前目录:~]
[wch@Ubuntu-Server-24]$ hexdump -C linux.txt
00000000 6c 69 6e 75 78 20 66 69 6c 65 0a 74 65 73 74 0a |linux file.test.|
00000010
# 3 使用dos2unix命令转换
[wch@Ubuntu-Server-24]$ dos2unix windows.txt
dos2unix: converting file windows.txt to Unix format...
22:58:53-[当前目录:~]
[wch@Ubuntu-Server-24]$ hexdump -C windows.txt
00000000 77 69 6e 64 6f 77 73 20 66 69 6c 65 0a 74 65 73 |windows file.tes|
00000010 74 |t|
00000011
22:59:40-[当前目录:~]
[wch@Ubuntu-Server-24]$ hexdump -C linux.txt
00000000 6c 69 6e 75 78 20 66 69 6c 65 0a 74 65 73 74 0a |linux file.test.|
00000010
3.4 常用通配符⭐️
[wch@Ubuntu-Server-24]$ ls ./w* # w开头的所有文件,*表示所有
./windows.txt
[wch@Ubuntu-Server-24]$ ls /etc/nginx/[b-n]* # [x-z]表示范围
/etc/nginx/fastcgi.conf /etc/nginx/koi-utf /etc/nginx/mime.types
/etc/nginx/fastcgi_params /etc/nginx/koi-win /etc/nginx/nginx.conf
[wch@Ubuntu-Server-24]$ ls /etc/nginx/[^f-z]* # ^表示非
vhost.conf
[wch@Ubuntu-Server-24]$ ls /etc/nginx/c?nf* # ?表示任意1个字符
vhost.conf
[wch@Ubuntu-Server-24]$ touch {1..3}.txt # 批量创建指定范围的文件
23:13:32-[当前目录:~]
[wch@Ubuntu-Server-24]$ mkdir -p dir{a..c} # 批量创建指定范围的目录
3.5 链接文件⭐️
# 链接文件主要分为两种类型:硬链接(hard link)和符号链接(symbolic link),也被称为软链接(soft link)或symlink
- 硬链接:不创建新文件,通过文件系统的inode(索引节点)连接来产生新文件名的方式,多个文件名指向一个文件inode
- 软链接:创建了一个独立的文件,它包含了另一个文件的路径名,相当于新建了一个inode
[wch@Ubuntu-Server-24]$ ln -s 2.txt soft_file # ln -s表示创建软链接
23:29:12-[当前目录:~]
[wch@Ubuntu-Server-24]$ readlink soft_file # 查看软链接指向的文件
2.txt
[wch@Ubuntu-Server-24]$ ln 1.txt hard_file # 不加参数默认创建硬链接
[wch@Ubuntu-Server-24]$ ls -i 1.txt hard_file # 查看硬链接文件和指向的文件的inode
1310739 1.txt 1310739 hard_file
3.6 IO-信息传递⭐️
- 1 重定向>、>>、<、<<,>表示覆盖重定向,>>表示追加重定向- 2 管道符:| 左命令结果传递右命令执行;管道命令tee:可在终端和文件分别输出内容- 3 后台执行&:将命令从前台转后台,从而不占用前台页面# 标准的输入输出符号:0(in)、1(out)、2(err);常见2>&1:表示把 stderr 合并到 stdout 所在的同一个文件/终端
- 4 符号实践
[wch@Ubuntu-Server-24]$ cat 2.txt 1>> 3.txt # 把正确输出重定向到3.txt,可以不加1
00:01:14-[当前目录:~]
[wch@Ubuntu-Server-24]$ cat 3.txt
adadfafsadfa
00:01:16-[当前目录:~]
[wch@Ubuntu-Server-24]$ dfadfadfa 2>> 3.txt # 把错误输出重定向3.txt
00:01:28-[当前目录:~]
[wch@Ubuntu-Server-24]$ cat 3.txt
adadfafsadfa
-bash: dfadfadfa: command not found- 5 ()和{}:()创建子shell进程执行命令,在独立进程中运行,不影响父shell的环境(变量、目录、信号等;{}在当前shell进程中执行命令,命令修改父shell的环境(如变量赋值、目录切换)- 6 read:用于从终端或者文件中读取输入的内建命令
[wch@Ubuntu-Server-24]$ read -p "请输入用户名:" user # -p参数表示交互式提示用户输入相关信息 -n:限定输入的字符个数
请输入用户名:wch
[wch@Ubuntu-Server-24]$ echo $user
wch
4 用户管理相关命令⭐️
4.1 groupadd
[wch@Ubuntu-Server-24]$ sudo groupadd group # 创建用户组
[wch@Ubuntu-Server-24]$ sudo groupadd group1 -g 11111 # 创建指定id用户组
[wch@Ubuntu-Server-24]$ sudo groupadd -r group2 # 创建系统用户组,gid小于1000是系统用户组,旧版linux小于500
[wch@Ubuntu-Server-24]$ getent group group group1 group2 # 查看所创建的用户组
group:x:1002:
group1:x:11111:
group2:x:990:
4.2 id⭐️
[wch@Ubuntu-Server-24]$ id # 查看当前登录用的id信息
uid=1000(wch) gid=1000(wch) groups=1000(wch),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),101(lxd)
10:37:55-[当前目录:~]
[wch@Ubuntu-Server-24]$ id root # 查看指定用户id信息
uid=0(root) gid=0(root) groups=0(root)
10:38:02-[当前目录:~]
[wch@Ubuntu-Server-24]$ id -nu wch # -n表示显示用户名或组名,但必须结合-u、-g、-G参数使用,-u表示仅显示uid
wch
10:38:10-[当前目录:~]
[wch@Ubuntu-Server-24]$ id -ng wch # -g仅显示GID
wch
10:38:19-[当前目录:~]
[wch@Ubuntu-Server-24]$ id -nG wch # -G表示显示主组和附加组id,即所有组id
wch adm cdrom sudo dip plugdev lxd
4.3 useradd
[wch@Ubuntu-Server-24]$ sudo useradd user2 # 创建用户
10:49:56-[当前目录:~]
[wch@Ubuntu-Server-24]$ sudo useradd -g group2 -G group1 user3 # 创建指定用户组用户,-g指定主组,-G指定附加组,不仅可以指定组名,组id也可以
[wch@Ubuntu-Server-24]$ sudo useradd -m user5 # 创建用户时提供家目录,默认不创建家目录
11:06:03-[当前目录:~]
[wch@Ubuntu-Server-24]$ ls /home
user1 user5 wch
4.4 passwd|chpasswd
root@Ubuntu-Server-24:~# passwd user5 # 不加用户名默认修改当前用户密码# chpasswd批量修改密码
4.5 userdel
[wch@Ubuntu-Server-24]$ sudo userdel user5 # 删除用户,默认不删家目录
[wch@Ubuntu-Server-24]$ ls /home
user1 user5 wch
[wch@Ubuntu-Server-24]$ sudo userdel -r user1 # -r:删除家目录和邮件目录
[wch@Ubuntu-Server-24]$ ls /home
user5 wch
# -f强制删除
5 文件权限
5.1 文件操作权限
- 读:4
- 写:2
- 执行:1
# 默认创建文件的权限:644,目录的权限755
5.2 文件用户属性
- 所有者(owner):u
- 所属组(Group):g
- 其他人(Other):o
5.3 chown
[wch@Ubuntu-Server-24]$ sudo ls -l /home/user5
total 4
-rw-rw-r-- 1 user5 user5 5 Sep 28 11:39 chrown_test.txt
[wch@Ubuntu-Server-24]$ sudo chown wch /home/user5/chrown_test.txt # 修改文件的所属用户,也可替换为用户id
11:41:25-[当前目录:~]
[wch@Ubuntu-Server-24]$ sudo ls -l /home/user5/chrown_test.txt
-rw-rw-r-- 1 wch user5 5 Sep 28 11:39 /home/user5/chrown_test.txt[wch@Ubuntu-Server-24]$ sudo chown wch: /home/user5/chrown_test.txt # 同时修改文件的用户和用户组,格式也可更换为wch:wch
11:44:18-[当前目录:~]
[wch@Ubuntu-Server-24]$ sudo ls -l /home/user5/chrown_test.txt
-rw-rw-r-- 1 wch wch 5 Sep 28 11:39 /home/user5/chrown_test.txt
5.4 chmod
[wch@Ubuntu-Server-24]$ ls -l chmod_test.sh
-rw-rw-r-- 1 wch wch 19 Sep 28 11:49 chmod_test.sh
11:49:34-[当前目录:~]
[wch@Ubuntu-Server-24]$ sudo chmod o+x ./chmod_test.sh # 使用+、-符号增加其他用户对该文件的执行权限
11:50:07-[当前目录:~]
[wch@Ubuntu-Server-24]$ ls -l chmod_test.sh
-rw-rw-r-x 1 wch wch 19 Sep 28 11:49 chmod_test.sh
[wch@Ubuntu-Server-24]$ sudo chmod g=rwx ./chmod_test.sh # 指定文件的组用户权限
11:51:44-[当前目录:~]
[wch@Ubuntu-Server-24]$ ls -l chmod_test.sh
-rw-rwxr-x 1 wch wch 19 Sep 28 11:49 chmod_test.sh
[wch@Ubuntu-Server-24]$ sudo chmod 775 ./chmod_test.sh # 使用权限数字指定用户对该文件的操作权限
11:54:13-[当前目录:~]
[wch@Ubuntu-Server-24]$ ls -l chmod_test.sh
-rwxrwxr-x 1 wch wch 19 Sep 28 11:49 chmod_test.sh
# 修改目录权限使用-R参数去递归操作
5.5 默认权限修改umask
# umask默认值是022,表示创建的目录默认755,文件644
[wch@Ubuntu-Server-24]$ umask
0002
11:59:23-[当前目录:~]
[wch@Ubuntu-Server-24]$ umask 022
11:59:40-[当前目录:~]
[wch@Ubuntu-Server-24]$ umask
0022
[wch@Ubuntu-Server-24]$ umask -S # -S符号化显示权限
u=rwx,g=rx,o=rx
6 文本三剑客
6.1 grep
6.1.1 命令解读
# grep 负责从数据源中检索对应的字符串,行过滤
命令格式grep options 'keys' filename常见选项: -i: 不区分大小写 -n: 显示行号 -r: 逐层遍历目录查找 -v: 查找不包含指定内容的行,反向选择 -E:使用扩展正则匹配 ^key:以关键字开头 key$:以关键字结尾 ^$:匹配空行
一般选项: -w: 按单词搜索 -o: 打印匹配关键字 -c: 统计匹配到的次数 -A: 显示匹配行及后面多少行 -B: 显示匹配行及前面多少行 -C: 显示匹配行前后多少行 -l:只列出匹配的文件名 -L:列出不匹配的文件名 -e: 使用正则匹配 --color=auto :可以将找到的关键词部分加上颜色的显示
6.1.2 实践⭐️
[wch@Ubuntu-Server-24]$ grep -i root passwd.txt # 忽略大小写匹配含root的行
root:x:0:0:root:/root:/bin/bash
[wch@Ubuntu-Server-24]$ grep -w sshd ./passwd.txt # 精准匹配sshd关键词
sshd:x:104:65534::/run*---------test------*/sshd:/usr/sbin/nologin
18:47:13-[当前目录:~]
[wch@Ubuntu-Server-24]$ grep -wo sshd ./passwd.txt # -o表示打印匹配到的关键词
sshd
sshd
18:47:19-[当前目录:~]
[wch@Ubuntu-Server-24]$ grep -n root passwd.txt # 打印匹配到的关键词行号
1:root:x:0:0:root:/root:/bin/bash
18:47:28-[当前目录:~]
[wch@Ubuntu-Server-24]$ grep -ni root passwd.txt # 忽略关键词大小写匹配到后打印行号
1:root:x:0:0:root:/root:/bin/bash
18:47:35-[当前目录:~]
[wch@Ubuntu-Server-24]$ grep -nic root passwd.txt # 忽略大小写匹配统计关键字root的行数
1
18:47:46-[当前目录:~]
[wch@Ubuntu-Server-24]$ grep -i ^root passwd.txt # 匹配root开头的行
root:x:0:0:root:/root:/bin/bash
18:47:57-[当前目录:~]
[wch@Ubuntu-Server-24]$ grep bash$ passwd.txt # 匹配bash结尾的行
root:x:0:0:root:/root:/bin/bash
wch:x:1000:1000:wch:/h*---------test------*ome/wch:/bin/bash
[wch@Ubuntu-Server-24]$ grep ^# ./passwd.txt # 匹配#开头的行
# news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
# uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
# proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
# www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
# backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
[wch@Ubuntu-Server-24]$ grep -v ^# ./passwd.txt # 反向匹配#开头的行
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
[wch@Ubuntu-Server-24]$ grep -A 5 mail passwd.txt # 匹配含关键字行以及后五行
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
# news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
# uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
# proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
# www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
# backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
18:50:57-[当前目录:~]
[wch@Ubuntu-Server-24]$ grep -B 5 mail passwd.txt # # 匹配含关键字行以及前五行
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
18:51:11-[当前目录:~]
[wch@Ubuntu-Server-24]$ grep -C 5 mail passwd.txt # # 匹配含关键字行以及前后五行
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
# news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
# uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
# proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
# www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
# backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
6.2 sed
6.2.1 命令解读
# sed(Stream EDitor) 属于一种数据流式的行文件编辑工具。因为它编辑文件的时候,在内存中开辟一块额外的模式空间(pattern space),然后以行为单位读取文件内容到该空间中,接着sed命令处理该空间中的内容,默认在当前终端界面打印内容,然后清空模式空间内容,再来读取第二行内容,依次循环下去
- 基本格式 sed [参数] '<匹配条件> [动作]' [文件名]
- 注意:匹配条件和动作两侧有'动作可以有多个,彼此间使用;隔开,比如 '2p;4p'
- 参数解读参数为空 表示sed的操作效果,实际上不对文件进行编辑,缓存区所有信息都显示 -n 不输出模式空间内容到屏幕,即不自动打印所有内容 -e 基于命令实现对文件的多点编辑操作 -f 从指定文件中读取编辑文件的”匹配条件+动作” -r 支持使用扩展正则表达式 -i.bak 复制文件原内容到备份文件,然后对原文件编辑 -i 表示对文件进行编辑
注意: mac版本的bash中使用 -i参数,必须在后面单独加个东西: -i '' -i -r 支持 -ri 支持 -ir 不支持 -ni 危险选项,会清空文件
6.2.2 实践
# 1 打印信息
[wch@Ubuntu-Server-24]$ cat sed.txt
nihao sed1 sed2 sed3
nihao sed4 sed5 sed6
nihao sed7 sed8 sed9
[wch@Ubuntu-Server-24]$ sed '2p' sed.txt # sed文件第二行输出两遍
nihao sed1 sed2 sed3
nihao sed4 sed5 sed6
nihao sed4 sed5 sed6 # 该行是实际操作内容,其他行是缓存区自动输出
nihao sed7 sed8 sed9
[wch@Ubuntu-Server-24]$ sed -n '2p' sed.txt # -n参数表示不输出缓存区默认的其他信息
nihao sed4 sed5 sed6
[wch@Ubuntu-Server-24]$ sed -n '1p;3p' sed.txt # 指定要打印的行
nihao sed1 sed2 sed3
nihao sed7 sed8 sed9
[wch@Ubuntu-Server-24]$ sed -n '1,3p' sed.txt # 打印1-3行
nihao sed1 sed2 sed3
nihao sed4 sed5 sed6
nihao sed7 sed8 sed9
# 2 匹配内容打印
[wch@Ubuntu-Server-24]$ sed -n '1~2p' sed.txt # 打印奇数行,1表示起始行号,2表示步长
nihao sed1 sed2 sed3
nihao sed7 sed8 sed9
19:27:45-[当前目录:~]
[wch@Ubuntu-Server-24]$ sed -n '0~2p' sed.txt # 打印偶数行,0表示起始行号,2表示步长
nihao sed4 sed5 sed6
[wch@Ubuntu-Server-24]$ sed -n '/sed4/p' sed.txt # 打印匹配关键字含sed4的行
nihao sed4 sed5 sed6
[wch@Ubuntu-Server-24]$ sed -n '/sed4/=' sed.txt # 查看关键字所在行号
2# 3 编辑动作
[wch@Ubuntu-Server-24]$ sed -n -e '1p' -e '3p' sed.txt # -e实现文件的多次编辑
nihao sed1 sed2 sed3
nihao sed7 sed8 sed9[wch@Ubuntu-Server-24]$ echo -e "1p\n3p" > sed_script # 把指令“动作”放到文件中
19:33:40-[当前目录:~]
[wch@Ubuntu-Server-24]$ sed -n -f sed_script sed.txt # -f表示从文件中读取条件+动作
nihao sed1 sed2 sed3
nihao sed7 sed8 sed9
# 4 取反显示
[wch@Ubuntu-Server-24]$ sed -n '2!p' sed.txt
nihao sed1 sed2 sed3
nihao sed7 sed8 sed9
# 5 内容的多行匹配1
[wch@Ubuntu-Server-24]$ sed -n '/send/,/server/p' /etc/nginx/nginx.conf # 匹配两个关键字之前的行sendfile on;tcp_nopush on;types_hash_max_size 2048;# server_tokens off;
# 6 内容的多行匹配2
[wch@Ubuntu-Server-24]$ sed -n '/send/,20p' /etc/nginx/nginx.conf # 查看匹配到的关键字所在行到指定行之间的信息sendfile on;tcp_nopush on;types_hash_max_size 2048;
# 替换操作
- 命令格式:sed -i [替换格式] [文件名]源数据 | sed -i [替换格式]- 注意:替换命令的写法's###' ---> 's#原内容##' ---> 's#原内容#替换后内容#'隔离符号 / 可以更换成 @、#、!等符号
# 1 替换每行首个匹配内容格式:sed -i 's#原内容#替换后内容#' 文件名
[wch@Ubuntu-Server-24]$ sed -i 's#sed#SED#' sed.txt # 替换每行第一个sed为SED
20:01:00-[当前目录:~]
[wch@Ubuntu-Server-24]$ cat sed.txt
nihao SED1 sed2 sed3
nihao SED4 sed5 sed6
nihao SED7 sed8 sed9
# 2 替换全部匹配内容
格式:sed -i 's#原内容#替换后内容#g' 文件名
[wch@Ubuntu-Server-24]$ sed -i 's#sed#SED#g' sed.txt # 全部替换
20:05:35-[当前目录:~]
[wch@Ubuntu-Server-24]$ cat sed.txt
nihao SED1 SED2 SED3
nihao SED4 SED5 SED6
nihao SED7 SED8 SED9
# 3 替换全部匹配内容2
[wch@Ubuntu-Server-24]$ sed 'y/SED/sed/' sed.txt # 不加-i参数
nihao sed1 sed2 sed3
nihao sed4 sed5 sed6
nihao sed7 sed8 sed9
# 4 指定行号替换首个匹配内容
[wch@Ubuntu-Server-24]$ sed -i '2s#SED#sed#' sed.txt
# 5 指定行号列号匹配内容
[wch@Ubuntu-Server-24]$ sed -i '3s#SED#sed#2' sed.txt # 3是行号,2是列号
# 6 首行指定列号替换匹配内容
[wch@Ubuntu-Server-24]$ sed -i 's#SED#sed#2' sed.txt
# 7 替换指定行
[wch@Ubuntu-Server-24]$ sed -i '3c\tihuan-1' sed.txt
21:27:51-[当前目录:~]
[wch@Ubuntu-Server-24]$ cat sed.txt
add------
add****************
tihuan-1
nihao SED7 sed8 sed9
# 8 替换指定范围行
[wch@Ubuntu-Server-24]$ sed -i '1,3c\tihuan-2' sed.txt # 替换1-3行
21:30:05-[当前目录:~]
[wch@Ubuntu-Server-24]$ cat sed.txt
tihuan-2
nihao SED7 sed8 sed9
# 增加操作
- 格式:sed -i '行号a\增加的内容' 文件名
- 注意: 如果增加多行,可以在行号位置写个范围值,彼此间使用逗号隔开,例如 sed -i '1,3a\增加内容' 文件名
# 1 指定行号增加内容(追加)
[wch@Ubuntu-Server-24]$ sed -i '2a\add****************' sed.txt
21:05:34-[当前目录:~]
[wch@Ubuntu-Server-24]$ cat sed.txt
nihao SED1 sed2 SED3
nihao sed4 SED5 sed6
add****************
nihao SED7 sed8 sed9
# 2 指定范围增加内容(追加)
[wch@Ubuntu-Server-24]$ sed -i '1,3a\add------' sed.txt # 1-3行增加内容
21:09:26-[当前目录:~]
[wch@Ubuntu-Server-24]$ cat sed.txt
nihao SED1 sed2 SED3
add------
nihao sed4 SED5 sed6
add------
add****************
add------
nihao SED7 sed8 sed9
# 3 指定行号增加内容(插入)
[wch@Ubuntu-Server-24]$ sed -i '1i\insert-1' sed.txt
21:14:04-[当前目录:~]
[wch@Ubuntu-Server-24]$ cat sed.txt
insert-1
nihao SED1 sed2 SED3
add------
nihao sed4 SED5 sed6
# 4 指定范围增加内容(插入)
[wch@Ubuntu-Server-24]$ sed -i '1,3i\insert-2' sed.txt
21:15:23-[当前目录:~]
[wch@Ubuntu-Server-24]$ cat sed.txt
insert-2
insert-1
insert-2
nihao SED1 sed2 SED3
insert-2
add------
# 5 对原内容进行扩充替换
[wch@Ubuntu-Server-24]$ head -n 1 ./passwd.txt | sed -n 's/root/&user/1p' # 使用&符号实现对首次匹配的关键字位置进行扩充
rootuser:x:0:0:root:/root:/bin/bash
[wch@Ubuntu-Server-24]$ head -n 1 ./passwd.txt | sed -n 's/root/&user/gp' # 对所有匹配的关键字位置进行扩充
rootuser:x:0:0:rootuser:/rootuser:/bin/bash
# 删除操作
- 格式:sed -i '行号d' 文件名
- 注意: 如果删除多行,可以在行号位置多写几个行号,彼此间使用逗号隔开,例如 sed -i '1,3d' 文件名
# 1 删除指定行
[wch@Ubuntu-Server-24]$ sed -i '4d' sed.txt
# 2 删除范围行
[wch@Ubuntu-Server-24]$ sed -i '1,6d' sed.txt
6.3 awk
6.3.1 awk简介
- 概念:awk全称 Aho Weinberger Kernighan报告生成器,awk的三个字母是来自于三个作者的首字母。它
是一个功能非常强大的文档编辑工具,它不仅能以行为单位还能以列为单位处理文件,并且还具有格式化文本
输出功能
- 原理:awk 认为文件中的每一行是一条记录,记录与记录的分隔符为换行符,每一列是一个字段 字段与字段的
分隔符默认是一个或多个空格或tab制表符;awk的工作方式是逐行读取文本数据,将每一行数据视为一条记录(record)每条记录以字段分隔符分
成若干字段,然后输出各个字段的值.然后以查找匹配某个特定模式的文本行,并对这些文本执行制定动作
6.3.2 语法
- 格式: awk [参数] '[动作]' [文件名] awk [参数] –f 动作文件 var=value [文件名] awk [参数] 'BEGIN段 [动作] END段' [文件名]- 注意:动作的格式 '匹配条件{打印动作}'
- 常见参数: -F 指定列的分隔符,默认一行数据的列分隔符是空格 -f file 指定读取程序的文件名 -v var=value 自定义变量
- awk程序运行优先级是: 1 BEGIN: 在开始处理数据流之前执行,可选项 2 动作: 如何处理数据流,必选项 3 END: 处理完数据流后执行,可选项
- 常见动作 print 显示内容 $0 显示当前行所有内容 $n 显示当前行的第n列内容,如果存在多个$n,它们之间使用逗号(,)隔开- 注意:如果打印的内容是变量,则无需在变量两侧加上双引号,其他的都应该加双引号
6.3.3 实践
6.3.3.1 信息查看
- 字段提取:提取一个文本中的一列数据并打印输出,它提供了相关的内置变量。 $0 表示整行文本 $1 表示文本行中的第一个数据字段 $2 表示文本行中的第二个数据字段 $N 表示文本行中的第N个数据字段 $NF 表示文本行中的最后一个数据字段 NR 代表行的行号,在动作外部表示特定行- 注意: 如果打印多列信息,需要使用逗号隔开,否则是内容合并
# 1 打印列内容
[wch@Ubuntu-Server-24]$ awk '{print $1}' awk.txt # 打印第一列
nihao
nihao
nihao
22:03:44-[当前目录:~]
[wch@Ubuntu-Server-24]$ awk '{print $NR}' awk.txt # 打印最后一列,所有列用$0表示
nihao
awk4
awk8
# 2 打印多列
[wch@Ubuntu-Server-24]$ awk '{print $1,$3}' awk.txt # 列之间逗号可省略或替换,省略后打印无间隔
nihao awk2
nihao awk5
nihao awk8
# 3 行号信息输出
[wch@Ubuntu-Server-24]$ awk '{print NR,$0}' awk.txt
1 nihao awk1 awk2 awk3
2 nihao awk4 awk5 awk6
3 nihao awk7 awk8 awk9
# 4 定制化查看
[wch@Ubuntu-Server-24]$ head -n1 passwd.txt | awk -F ':' '{print $0}' # -F:定制分割符
root:x:0:0:root:/root:/bin/bash
[wch@Ubuntu-Server-24]$ head -n1 passwd.txt | awk -F ':' '{print $1,$7}'
root /bin/bash
[wch@Ubuntu-Server-24]$ head -n1 passwd.txt | awk -v FS=':' '{print $1FS$7}' # -v设定分割符环境变量
root:/bin/bash
6.3.3.2 变量
# 常见的内置变量FILENAME 当前输入文件的文件名,该变量是只读的FIELDWIDTHS 以空格分隔的数字列表,用空格定义每个数据字段的精确宽度 NR 指定显示行的行号 FNR 多文件时候,分别计数 NF 表示字段数量 OFS 输出格式的列分隔符,缺省是空格 FS 输入文件的列分隔符,缺省是连续的空格和Tab RS 输入记录分隔符,指定输入时的换行符,原换行符($)仍有效 ORS 输出记录分隔符,输出时用指定符号代替换行符 ARGC|ARGV[n] 获取命令的参数个数|参数内容
# 自定义变量
自定义变量的定制方法:-v var=value它可以在 命令行、BEGIN、{}、END 等位置进行使用
# 1 查看当前所在目录
[wch@Ubuntu-Server-24]$ echo $PWD | awk -F / '{print $NF}'
wch
# 2 查看文件所在目录
[wch@Ubuntu-Server-24]$ echo /etc/sysconfig/network-scripts/ifcfg-eth0 | awk -F / '{print $(NF-1)}'
network-scripts
6.3.3.3 数组
- 定义数组:array[index表达式]index表达式: 可使用任意字符串;字符串要使用双引号括起来 如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为空串 若要判断数组中是否存在某元素,要使用index in array格式进行遍历
- 遍历数组中的元素,要使用for循环for(var in array){for-body}- 注意:var会遍历array的每个索引,var不能用关键字index
# 1 数组的定义和调用
[wch@Ubuntu-Server-24]$ awk 'BEGIN{array["yuwen"]=78;array["shuxue"]=89;array["lishi"]=99;print array["yuwen"],array["shuxue"],array["lishi"]}'
78 89 99
# 2 数组的遍历
[wch@Ubuntu-Server-24]$ awk 'BEGIN{array["yuwen"]=78;array["shuxue"]=89;array["lishi"]=99;for(i in array) {print array[i]}}'
78
89
99
# 3 内容自动遍历
[wch@Ubuntu-Server-24]$ head -n1 ./passwd.txt | awk -F: '{for(i=1;i<NF;i++){array[i]=$i};for(j in array){print array[j]}}'
root
x
0
0
root
/root
7 vim
7.1 vim简介
# 三种模式
- 普通模式/默认模式/正常模式- 光标移动:使用h、j、k、l键分别向左、下、上、右移动光标(或使用方向键)。- 删除字符:按x删除光标所在位置的字符,按dd删除整行。- 复制粘贴:使用yy复制当前行,p粘贴到光标所在位置
- 插入模式/编辑模式- 按 i 在当前光标位置插入- 按 a 在当前光标位置的下一个字符处插入- 按 o 在当前光标所在行的下一行插入新行- I 在当前光标所在行的行首输入- A 在当前光标所在行的行尾输入- O 在当前光标所在行的上方打开一个新行- 底行模式/命令模式- ESC退出到命令模式- 保存文件:输入:w保存当前文件,:wq或:x保存并退出Vim - 查找替换:输入:/或?搜索词进行查找,:s/原词/新词/g进行全局替换。 - 设置选项:输入:set nu显示行号,:set nonu取消显示行号
7.2 定位内容编辑
- + # 打开文件后让光标处于尾行
- +N # 打开文件后让光标处于第N行的行首,+默认尾行
- +/PATTERN # 让光标处于第一个被PATTERN匹配到的行行首
- -d file1 file2 # 同时打开多个文件,相当于 vimdiff- Ctrl-w 是窗口切换的前缀键。 按下 Ctrl-w 后,再按下 w 会在当前可见的所有窗口之间循环切换。 或者 Ctrl-w + h【左】 | l【右】 | j【下】 | k【上】
7.3 实践
7.3.1 边界命令
[wch@Ubuntu-Server-24]$ seq 10 > test_vim.txt
15:57:38-[当前目录:~]
[wch@Ubuntu-Server-24]$ cat test_vim.txt
1
2
3
4
5
6
7
8
9
10
:history# cmd history1 q2 set nu3 wq4 2d # 删除第二行5 2,4d # 删除第2到第4行6 2;+3y #复制第2到第5行,总共4行7 2;+4w temp.txt # 将第2到第6行,总共5行内容写入新文件9 5r /etc/issue # 将/etc/issue 文件读取到第5行的下一行10 t2 # 将光标所在行复制到第2行的下一行11 2;+3t10 # #将第2到第5行,总共4行内容复制到第10行之后12 .d # #删除光标所在行14 $y
7.3.2 内容替换
# 1 当前行替换
:s/原内容/替换后内容/g
:s/root/ROOT/ #替换当前行第一个root
:s/root/ROOT/g #替换当前行所有root
# 2 全文替换
:%s/原内容/替换后内容/g
:%s/root/ROOT/g #全文替换
:%s/root/test/ig #不区分大小写全文替换
# 3 范围替换
:/关键字/,$s/原内容/替换后内容/g
:/lp/,$s/sbin/SBIN/g # 从lp 关键字所在行,到文件末尾
:,$s/sbin/SBIN/g # 从当前行到文件末尾进行替换
:3,6s/sbin/SBIN/g # 3-6 行进行内容替换
7.3.3 块可视化
# 1 在文件指定行的行首插入# -> 本次操作文本10-20行
1、先将光标移动到指定的第一行的行首
2、输入ctrl+v 进入可视化模式
3、向下移动光标,选中希望操作的每一行的第一个字符
4、输入大写字母 I 切换至插入模式
5、输入 #
6、按 ESC 键【两次】
结果如下:1 root:x:0:0:root:/root:/bin/bash2 daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin3 bin:x:2:2:bin:/bin:/usr/sbin/nologin4 sys:x:3:3:sys:/dev:/usr/sbin/nologin5 sync:x:4:65534:sync:/bin:/bin/sync6 games:x:5:60:games:/usr/games:/usr/sbin/nologin7 man:x:6:12:man:/var/cache/man:/usr/sbin/nologin8 lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin9 mail:x:8:8:mail:/var/mail:/usr/sbin/nologin10 # news:x:9:9:news:/var/spool/news:/usr/sbin/nologin11 # uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin12 # proxy:x:13:13:proxy:/bin:/usr/sbin/nologin13 # www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin14 # backup:x:34:34:backup:/var/backups:/usr/sbin/nologin15 # list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin16 # irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin17 # _apt:x:42:65534::/nonexistent:/usr/sbin/nologin18 # nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin19 # systemd-network:x:998:998:systemd Network Management:/:/usr/sbin/nologin20 # systemd-timesync:x:997:997:systemd Time Synchronization:/:/usr/sbin/nologin21 dhcpcd:x:100:65534:DHCP Client Daemon,,,:/usr/lib/dhcpcd:/bin/false22 messagebus:x:101:102::/nonexistent:/usr/sbin/nologin23 systemd-resolve:x:992:992:systemd Resolver:/:/usr/sbin/nologin
# 2 在指定的块位置插入相同的内容 --> 操作22行到末行
1、光标定位到要操作的地方
2、CTRL+v 进入“可视块”模式,选取这一列操作多少行
3、SHIFT+i(I)
4、输入要插入的内容
5、按 ESC 键【两次】
结果如下:22 messagebus:x:101:102::*---------test------*/nonexistent:/usr/sbin/nologin23 systemd-resolve:x:992:*---------test------*992:systemd Resolver:/:/usr/sbin/nologin24 pollinate:x:102:1::/va*---------test------*r/cache/pollinate:/bin/false25 polkitd:x:991:991:User*---------test------* for polkitd:/:/usr/sbin/nologin26 usbmux:x:103:46:usbmux*---------test------* daemon,,,:/var/lib/usbmux:/usr/sbin/nologin27 sshd:x:104:65534::/run*---------test------*/sshd:/usr/sbin/nologin28 wch:x:1000:1000:wch:/h*---------test------*ome/wch:/bin/bash29 user2:x:1002:11112::/h*---------test------*ome/user2:/bin/sh30 user3:x:1003:990::/hom*---------test------*e/user3:/bin/sh31 user4:x:1004:1004::/ho*---------test------*me/user4:/bin/sh32 user5:x:1005:1005::/ho*---------test------*me/user5:/bin/sh
8 其他
8.1 cut
[wch@Ubuntu-Server-24]$ head -n 5 passwd.txt | cut -d: -f 1,6,7 # 以:为分割符,截取1,6,7列
root:/root:/bin/bash
daemon:/usr/sbin:/usr/sbin/nologin
bin:/bin:/usr/sbin/nologin
sys:/dev:/usr/sbin/nologin
sync:/bin:/bin/sync
[wch@Ubuntu-Server-24]$ head -n 5 passwd.txt | cut -d: -f 1,6,7 --output-delimiter="****" # 定制化输出的分割符
root****/root****/bin/bash
daemon****/usr/sbin****/usr/sbin/nologin
bin****/bin****/usr/sbin/nologin
sys****/dev****/usr/sbin/nologin
sync****/bin****/bin/sync
8.2 tr
# tr命令实现 字符转换、替换、删除
[wch@Ubuntu-Server-24]$ ifconfig ens33 | head -n2 | tail -n1 | tr -s " " | cut -d " " -f3
10.0.0.16 # tr -s选项是把重复的字符压缩为单个字符,正常截取到ip需要-f10,压缩后f3
[wch@Ubuntu-Server-24]$ head -n5 passwd.txt | tr '[0-9]' '@' # 把文本中的0-9数字替换为@
root:x:@:@:root:/root:/bin/bash
daemon:x:@:@:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:@:@:bin:/bin:/usr/sbin/nologin
sys:x:@:@:sys:/dev:/usr/sbin/nologin
sync:x:@:@@@@@:sync:/bin:/bin/sync
9 正则表达式
9.1 字符过滤
# 1 .过滤单个字符
[wch@Ubuntu-Server-24]$ grep 'st..e' keepalived.conf state MASTER
# 2 范围单字符过滤[]
[wch@Ubuntu-Server-24]$ grep 'i[a-z]t' keepalived.conf interface ens33 virtual_router_id 50 advert_int 1 virtual_ipaddress {
# 3 反向过滤^
[wch@Ubuntu-Server-24]$ grep "[^a-z_ }{0-5]" keepalived.conf
! Configuration File for keepalived router_id kpmaster
vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 50 nopreempt priority 100 advert_int 1 virtual_ipaddress { 192.168.8.100 }
# 4 过滤特定的字符范围
[wch@Ubuntu-Server-24]$ egrep 'state|priority' keepalived.conf state MASTER priority 100
9.2 锚定匹配
# 锚定匹配:主要是在字符匹配的前提下,增加了字符位置的匹配
- 常见符号 ^ 行首锚定, 用于模式的最左侧 $ 行尾锚定,用于模式的最右侧 ^PATTERN$ 用于模式匹配整行 ^$ 空行 ^[[:space:]]*$ 空白行 \< 或 \b 词首锚定,用于单词模式的左侧 \> 或 \b 词尾锚定,用于单词模式的右侧 \<PATTERN\> 匹配整个单词
- 注意:单词是由字母,数字,下划线组成
# 1 行首行尾位置匹配
[wch@Ubuntu-Server-24]$ grep '^wor' nginx_test.conf
worker_processes 1;
23:16:00-[当前目录:~]
[wch@Ubuntu-Server-24]$ grep 'st;$' nginx_test.conf server_name localhost;
# 2 关键词匹配
[wch@Ubuntu-Server-24]$ grep '^w.*;$' nginx_test.conf
worker_processes 1;
# 3 空行匹配
[wch@Ubuntu-Server-24]$ grep '^$' nginx_test.conf
23:18:48-[当前目录:~]
[wch@Ubuntu-Server-24]$ grep '^[[:space:]]*$' nginx_test.conf
# 4 单词匹配
[wch@Ubuntu-Server-24]$ grep '\bloca' nginx_test.conf # 单词首部 server_name localhost; location / {[wch@Ubuntu-Server-24]$ grep '\<loca' nginx_test.conf # 单词首部 server_name localhost; location / {[wch@Ubuntu-Server-24]$ grep '\<index\>' nginx_test.conf # 单词内容匹配 index index.html index.htm;
9.3 限定符号
# 限定符号,通过正则表达式匹配到内容后,前面内容重复的次数,常见的号如下
- 常见符号* 匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配 .* 任意长度的任意字符 ? 匹配其前面的字符出现0次或1次,即:可有可无 + 匹配其前面的字符出现最少1次,即:肯定有且 >=1 次 {m} 匹配前面的字符m次 {m,n} 匹配前面的字符至少m次,至多n次 {,n} 匹配前面的字符至多n次,<=n {n,} 匹配前面的字符至少n次
# 1 以a开头 中间是有b且至少出现一次 长度不限的字符串
[wch@Ubuntu-Server-24]$ egrep "^ab+" file.txt
abbcd
abbbce
abbbbbc
abcf
# 2 以a开头 中间是有b且至少出现两次最多出现四次 长度不限的字符串
[wch@Ubuntu-Server-24]$ egrep "^ab{2,4}" file.txt
abbcd
abbbce
abbbbbc