Shell正则表达式与文本处理器
一、grep
1. 正则表达式
是一种匹配字符串的方法,通过一些特殊符号,快速实现查找,删除,替换某特定字符串。
选项:
-a 不要忽略二进制数据。
-A 显示该行之后的内容。
-b 显示该行之前的内容。
-c 计算符合范本样式的列数。
-C 除了显示符合范本样式的那一列之外,并显示该列之前后的内容。
-d 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。
-e 指定字符串作为查找文件内容的范本样式。
-E 能使用扩展正则表达式。
-f 指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式。
-F 固定字符串的列表。
-G 普通的表示法来使用。
-h 不标示该列所属的文件名称。
-H 标示该列的文件名称。
-i 忽略字符大小写的差别。
-l 列出文件名称。
-L 列出内容不符合的文件名称。
-n 标示出该列的编号。
-q 不显示任何信息。
-R/-r 此参数的效果和指定“-d recurse”参数相同。
-s 不显示错误信息。
-v 反转查找。
-w 只显示全字符合的列。
-x 只显示全列符合的列。
-y 此参数效果跟“-i”相同。
-o 只输出文件中匹配到的部分。
2. 基础正则表达式
创建该文件,以该文件为例进行编辑。
[root@localhost ~]# vim txt
he was short and fat.
he was weating a blue polo shirt with black pants.
The home of Football on BBC Sport online.
the tongue is boneless but it breaks bones.12!
google is the best tools for search keyword.
PI=3.14
a wood cross!
Actions speak louder than words#woood #
#woooooooood #
AxyzxyzxyzxyzC
I bet this place is really spooky late at night!
Misfortunes never come alone/single.
I shouldn't have lett so tast.
(1)查看包含the的行
[root@localhost ~]# grep -ni 'the' txt 查找包含the的行
备注:
- -n 显示行号
- -i 不区分大小写
- -v 不包含指定字符
(2)利用[ ] 查找
[root@localhost ~]# grep -n 'sh[io]rt' txt
查找shirt和short,其中[ ]无论有几个字符,都匹配一个字符。即[io]匹配i或者o。
[root@localhost ~]# grep -n '[^w]oo' txt 查找oo前面非w的内容
[root@localhost ~]# grep -n '[a-z]oo' txt 查找oo前面是a-z的内容
[root@localhost ~]# grep -n '[0-9]' txt 查找0-9相关的内容
备注:
^ 在字母前,表示取反。
^ 在[ ] 前,表示以括号中的字符开头。
(3)查找行首行尾
[root@localhost ~]# grep -n '^the' txt 查找以the为行首的内容
[root@localhost ~]# grep -n '^[a-z]' txt 查询以小写字母开头的行
[root@localhost ~]# grep -n '^[A-Z]' txt 查询以大写字母开头的行
[root@localhost ~]# grep -n '^[^a-zA-Z]' txt 查询非字母开头的行[root@localhost ~]# grep -n '\.$' txt 查询以 . 结尾的行
[root@localhost ~]# grep -n '^$' txt 查询空行
[root@localhost ~]# grep -n -v '^$' txt 查询非空行
备注:
^ 行首;$ 行尾
^在[ ] 内表示反向选择;在[ ]前表示定位行首。
(4)查找任意字符和重复字符
[root@localhost ~]# grep -n 'w..d' txt 查询以d开头,w结尾的内容
[root@localhost ~]# grep -n 'ooo*' txt 查询至少包含两个字母00的内容
[root@localhost ~]# grep -n 'woo*d' txt 查询包含w字母开头,d结尾中间至少一个字母o
[root@localhost ~]# grep -n 'w.*d' txt w开头,d结尾,中间字符可有可无
[root@localhost ~]# grep -n '[0-9][0-9]*' txt 查询包含数字的行
备注:
'w..d' 一个点只能代表一个字符
ooo*:前两个o是条件,表示包含两个o;然后是o*,表示后面有零个或多个重复o。
(5)查询连续字符内容
[root@localhost ~]# grep -n 'o\{2\}' txt 查询包含两个o的字符
[root@localhost ~]# grep -n 'wo\{2,5\}d'txt w开头,d结尾中间有2--5个o
[root@localhost ~]# grep -n 'wo\{2,\}d' txt w开头,d结尾中间有2个以上o
二、sed 文本处理器
sed 的工作流程主要包括读取、执行和显示三个过程。
- 读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。
- 执行:默认情况下,所有的 sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则 sed 命令将会在所有的行上依次执行。
- 显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。
1. sed常用选项
-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e :直接在命令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
-i :直接修改读取的文件内容,而不是输出到终端。
2.sed常用操作
a :新增行, a 的后面可以是字串,而这些字串会在新的一行出现(目前的下一行)
c :取代行, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行
d :删除行,因为是删除,所以 d 后面通常不接任何参数,直接删除地址表示的行;
i :插入行, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
s :替换,可以直接进行替换的工作
y:字符转换
3. 输出符合条件的文本
[root@localhost ~]# sed -n 'p' txt 输出所有内容
[root@localhost ~]# sed -n '3p' txt 输出第三行
[root@localhost ~]# sed -n '3,5p' txt 输出3~5行
[root@localhost ~]# sed -n 'p;n' txt 输出所有奇数行
[root@localhost ~]# sed -n 'n;p' txt 输出所有偶数行
[root@localhost ~]# sed -n '1,5{p;n}' txt 输出第1~5行之间的奇数行
[root@localhost ~]# sed -n '10,${n;p}' txt 输出第10行至文件尾之间的偶数行
[root@localhost ~]# sed -n '/the/p' txt 输出包含the的行
[root@localhost ~]# sed -n ' 4,/the/p' txt 输出从第4行开始至第一个包含the的行
[root@localhost ~]# sed -n '/the/=' txt 输出包含the的行所在的行号
注释:
=用来输出行号[root@localhost ~]# sed -n '/^PI/p' txt 输出以PI开头的行
[root@localhost ~]# sed -n '/\<wood\>/p' test.txt
或
[root@localhost ~]# sed -n '/wood/p' txt 输出包含单词wood的行
4. 删除符合条件的文本
[root@localhost ~]# nl txt | sed '3d' 显示行号
或
[root@localhost ~]# sed '3d' txt 不显示行号
[root@localhost ~]# nl txt |sed '3,5d' 删除3~5行
[root@localhost ~]# nl txt |sed '/cross/d' 删除包含cross的行
[root@localhost ~]# nl txt |sed '/cross/! d' 删除不包含cross的行
[root@localhost ~]# sed '/^[a-z]/d' txt 删除以小写字母开头的行
[root@localhost ~]# sed '/\.$/d' txt 删除以点结尾的行
[root@localhost ~]# sed '/^$/d' txt 删除空行
5.替换符合条件的文本
[root@localhost ~]# sed 's/the/THE/' txt 将每行的第一个the换成THE
[root@localhost ~]# sed 's/l/L/2' txt 将每行中的第2个l换成L
[root@localhost ~]# sed 's/the/THE/g' test.txt 将文中所有的the换成THE
[root@localhost ~]# sed 's/o//g' txt 将文中所有的o删除
[root@localhost ~]# sed 's/^/#/' txt 在每行的行首插入#
[root@localhost ~]# sed 's/$/#/' txt 在每行行尾添加#
[root@localhost ~]# sed '/the/s/^/#/' txt 在包含the的每行的行首插入#
[root@localhost ~]# sed 's/$/EOF/' txt 在每行的行尾插入字符串EOF
[root@localhost ~]# sed '3,5s/the/THE/g' txt 将第3~5行中的所有the替换成THE
[root@localhost ~]# sed '/the/s/o/O/g' txt 将包含the的所有行中的o都替换成O
6. 迁移符合条件的文本
H:复制到剪切板
g:将剪切板中的内容覆盖到指定行
G:将剪切板中的内容追加到指定行
w:保存文件
r:读取指定文件
a:追加指定内容
[root@localhost ~]# sed '/the/{H;d};$G' txt 将包含the的行迁移至文件的末尾
[root@localhost ~]# sed '1,5{H;d};17G' txt 将第1~5行的内容转移至第17行后
[root@localhost ~]# sed '/the/w out.txt' txt 将包含the的行另存为文件out.txt
[root@localhost ~]# sed '/the/r /etc/hostname' txt 将文件/etc/hostname的内容添加到包含the的每一行后
[root@localhost ~]# sed '3a#chkconfig:35 82 20' txt 在第3行后插入一个新行,内容为#chkconfig:35 82 20
[root@localhost ~]# sed '/the/aNew' txt (6)在包含the的每行后插入一个新行,内容为New
[root@localhost ~]# sed '3aNew1\nNew2' txt 在第3行后插入多行内容注释:\n为换行,添加两行为New1和New2
三、awk 文本处理器
awk 是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理。
1. awk 常见用法
$0 表示整个当前行
$1 每行第一个字段
NF 字段数量变量
NR 每行的记录号,多文件记录递增
FNR 与NR类似,不过多文件记录不递增,每个文件都从1开始
2. 按行输出文本
awk -F":" '{print}' /etc/passwd //输出所有
awk -F":" '{print $0}' /etc/passwd //输出所有
awk -F: 'NR==3,NR==6{print}' /etc/passwd //显示第3行到第6行
awk -F: 'NR>=3&&NR<=6{print}' /etc/passwd //显示第3行到第6行
awk -F: 'NR==3||NR==6{print}' /etc/passwd //显示第3行和第6行
awk '(NR%2)==1{print}' /etc/passwd //显示奇数行
awk '(NR%2)==0{print}' /etc/passwd //显示偶数行
awk '/^root/{print}' /etc/passwd //显示以root开头的行
awk '/nologin$/{print}' /etc/passwd //显示以nologin结尾的行
awk 'BEGIN {x=0};/\/bin\/bash$/{x++};END {print x}' /etc/passwd //统计以/bin/bash结尾的行数
awk 'BEGIN{RS=""};END{print NR}' /etc/ssh/sshd_config //统计以空行分隔的文本段落数
awk '{print NR,$0}' /etc/passwd //输出每行的行号
awk -F: '{print NR,NF,$NF,"\t",$0}' /etc/passwd //依次打印行号,字段数,最后字段值,制表符,每行内容
awk -F: 'NR==5{print}' /etc/passwd //显示第5行
route -n|awk 'NR!=1{print}' //不显示第一行
awk -F: '{print NF}' /etc/passwd //显示每行有多少字段
awk -F: '{print $NF}' /etc/passwd //将每行第NF个字段的值打印出来awk -F: 'NF==4 {print }' /etc/passwd //显示只有4个字段的行
awk -F: 'NF>2{print $0}' /etc/passwd //显示每行字段数量大于2的行
3. 按字段输出文本
awk -F":" '{print $3}' /etc/passwd //显示第三列
awk -F":" '{print $1 $3}' /etc/passwd //$1与$3相连输出,无空格,
awk -F":" '{print $1,$3}' /etc/passwd //多了一个逗号,输出第1和第3个字段,有空格
awk -F: '$2=="!!" {print}' /etc/shadow //统计密码为空的shadow记录
awk 'BEGIN {FS=":"}; $2=="!!" {print}' /etc/shadow 显示密码为空的用户的shadow信息
awk -F ":" '$7~"/bash" {print $1}' /etc/passwd 显示第七个字段为/bash的行的第一个字段
awk -F: 'NR==5{print}' /etc/passwd //显示第5行
awk -F":" '{print $1 " " $3}' /etc/passwd //$1与$3之间手动添加空格分隔
4. 通过管道、双引号调用shell命令
awk -F: '/bash$/{print | "wc -l"}' /etc/passwd ##统计bash用户的个数
awk 'BEGIN {while ("w" | getline) n++ ; {print n-2}}' ##统计在线用户的数量
awk 'BEGIN {"hostname" | getline;print $0}' ##输出当前主机名
四、sort
sort 是一个以行为单位对文件内容进行排序的工具,也可以根据不同的数据类型来排序。
选项:
-f:忽略大小写;
-b:忽略每行前面的空格;
-M:按照月份进行排序;
-n:按照数字进行排序;
-r:反向排序;
-u:等同于 uniq,表示相同的数据仅显示一行;
-t:指定分隔符,默认使用[Tab]键分隔;
-o <输出文件>:将排序后的结果转存至指定文件;
-k:指定排序区域。
1. 示例
[root@localhost ~]# sort /etc/passwd 将/etc/passwd 文件中的账号进行排序。
[root@localhost ~]# sort -t ':' -rk 3 /etc/passwd 将/etc/passwd 文件中第三
列进行反向排序。[root@localhost ~]# sort -t ':' -k 3 /etc/passwd -o user.txt 将/etc/passwd
文件中第三列进行排序,并将输出内容保存至 user.txt 文件中。
[root@localhost ~]# cat user.txt
备注:
-r:反向排序;
-t:指定分隔符,默认使用[Tab]键分隔;
-k:指定排序区域。
五.tr
tr 命令常用来对来自标准输入的字符进行替换、压缩和删除。可以将一组字符替换之后变成另一组字符,经常用来编写优美的单行命令,作用很强大。
选项:
-c:取代所有不属于第一字符集的字符;
-d:删除所有属于第一字符集的字符;
-s:把连续重复的字符以单独一个字符表示;
-t:先删除第一字符集较第二字符集多出的字符
[root@localhost ~]# echo "KGC" | tr 'A-Z' 'a-z' 将输入字符由大写转换为小写。
[root@localhost ~]# echo "thissss is a text linnnnnnne." | tr -s 'sn' 压缩输入中重
复的字符。
[root@localhost ~]# echo 'hello world' | tr -d 'od' 删除字符串中某些字符
备注:
-s:把连续重复的字符以单独一个字符表示
-d:删除所有属于第一字符集的字符
相关文章:
Shell正则表达式与文本处理器
一、grep 1. 正则表达式 是一种匹配字符串的方法,通过一些特殊符号,快速实现查找,删除,替换某特定字符串。 选项: -a 不要忽略二进制数据。 -A 显示该行之后的内容。 -b 显示该行之前的内容。 -c 计算符合范本样…...
双指针法 ( 三数之和 )
题目 :给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复…...
感染恶意代码之后怎么办?
隔离设备 立即将感染设备与网络隔离,断开与互联网和其他设备的连接。这可以防止恶意代码进一步传播到其他设备,并减少对网络安全的威胁。 确认感染 确认设备是否真的感染了恶意代码。这可能需要使用安全软件进行全面扫描,以检测和识别任何已…...
【计算机网络】P3 计算机网络协议、接口、服务的概念、区别以及计算机网络提供的三种服务方式
目录 协议什么是协议协议是水平存活的协议的组成 接口服务服务是什么服务原语 协议与服务的区别计算机网络提供的服务的三种方式面向连接服务与无连接服务可靠服务与不可靠服务有应答服务与无应答服务 协议 什么是协议 协议,就是规则的集合。 在计算机网络中&…...
多角度剖析事务和事件的区别
事务和事件这两个概念在不同的领域有着不同的含义,尤其是在计算机科学、数据库管理和软件工程中。下面从多个角度来剖析事务和事件的区别: 计算机科学与数据库管理中的事务 事务(Transaction): 定义:在数据库管理中,…...
模糊小波神经网络(MATLAB 2018)
模糊系统是一种基于知识或规则的控制系统,从属于智能控制,通过简化系统的复杂性,利用控制法来描述系统变量之间的关系,采用语言式的模糊变量来描述系统,不必对被控对象建立完整的数学模型。相比较传统控制策略…...
HTML布局
标准流: 标准流就是元素在页面中的默认排列方式,也就是元素在页面中的默认位置。 1.1 块元素----独占一行----从上到下排列 1.2 行内元素----不独占一行----从左到右排列,遇到边界换行 1.3 行内块元素----不独占一行…...
数据结构:双链表
数据结构:双链表 题目描述参考代码 题目描述 输入样例 10 R 7 D 1 L 3 IL 2 10 D 3 IL 2 7 L 8 R 9 IL 4 7 IR 2 2输出样例 8 7 7 3 2 9参考代码 #include <iostream>using namespace std;const int N 100010;int m; int idx, e[N], l[N], r[N];void init…...
Python3 元组、列表、字典、集合小结
前言 本文主要对Python中的元组、列表、字典、集合进行小结,主要内容包括知识点回顾、异同点、使用场景。 文章目录 前言一、知识点回顾1、列表(List)2、 元组(Tuple)3、 字典(Dictionary)4.、…...
2024会声会影破解免费序列号,激活全新体验!
会声会影2024序列号注册码是一款专业的视频编辑软件,它以其强大的功能和易用性受到了广大用户的喜爱。在这篇文章中,我将详细介绍会声会影2024序列号注册码的功能和特色,帮助大家更好地了解这款产品。 会声会影全版本绿色安装包获取链接&…...
机器学习18个核心算法模型
1. 线性回归(Linear Regression) 用于建立自变量(特征)和因变量(目标)之间的线性关系。 核心公式: 简单线性回归的公式为: , 其中 是预测值, 是截距, 是斜…...
平滑值(pinghua)
平滑值 题目描述 一个数组的“平滑值”定义为:相邻两数差的绝对值的最大值。 具体的,数组a的平滑值定义为 f ( a ) m a x i 1 n − 1 ∣ a i 1 − a i ∣ f(a)max_{i1}^{n-1}|a_{i1}-a_i| f(a)maxi1n−1∣ai1−ai∣ 现在小红拿到了一个数组…...
使用matplotlib绘制折线条形复合图
使用matplotlib绘制折线条形复合图 介绍效果代码 介绍 在数据可视化中,复合图形是一种非常有用的工具,可以同时显示多种数据类型的关系。在本篇博客中,我们将探讨如何使用 matplotlib 库来绘制包含折线图和条形图的复合图。 效果 代码 imp…...
云计算中网络虚拟化的核心组件——NFV、NFVO、VIM与VNF
NFV NFV(Network Functions Virtualization,网络功能虚拟化),是一种将传统电信网络中的网络节点设备功能从专用硬件中解耦并转换为软件实体的技术。通过运用虚拟化技术,NFV允许网络功能如路由器、防火墙、负载均衡器、…...
# SpringBoot 如何让指定的Bean先加载
SpringBoot 如何让指定的Bean先加载 文章目录 SpringBoot 如何让指定的Bean先加载ApplicationContextInitializer使用启动入口出注册配置文件中配置spring.factories中配置 BeanDefinitionRegistryPostProcessor使用 使用DependsOn注解实现SmartInitializingSingleton接口使用P…...
家用洗地机哪个品牌好?洗地机怎么选?这几款全网好评如潮
如今,人们家里越来越多的智能清洁家电,小到吸尘器、电动拖把,大到扫地机器人、洗地机,作为一个用过所有这些清洁工具的家庭主妇,我觉得最好用的还是洗地机。它的清洁效果比扫地机器人更好,功能也比吸尘器更…...
iOS与前端:深入解析两者之间的区别与联系
iOS与前端:深入解析两者之间的区别与联系 在数字科技高速发展的今天,iOS与前端技术作为两大热门领域,各自在移动应用与网页开发中扮演着不可或缺的角色。然而,这两者之间究竟存在哪些差异与联系呢?本文将从四个方面、…...
SpringBoot 基于jedis实现Codis高可用访问
codis与redis的关系 codis与redis之间关系就是codis是基于多个redis实例做了一层路由层来进行数据的路由,每个redis实例承担一定的数据分片。 codis作为开源产品,可以很直观的展示出codis运维成本低,扩容平滑最核心的优势. 其中࿰…...
力扣108. 将有序数组转换为二叉搜索树
108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode) 找割点,一步一步将原数组分开。妙极了!!!!! /*** Definition for a binary tree node.* public class TreeNode {* int val;…...
人工智能机器学习系统技术要求
一 术语和定义 1.1机器学习系统 machinelearningsystem 能运行或用于开发机器学习模型、算法和相关应用的软件系统。 1.2机器学习框架 machinelearningframework 利用预先构建和优化好的组件集合定义模型,实现对机器学习算法封装、数据调用处理和计算资源使用的软件库。 1…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...
