卡尔曼家族从零解剖-(06) 一维卡尔曼滤波编程(c++)实践、透彻理解公式结果

news2024/11/19 23:17:23

讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解的 卡尔曼家族从零解剖 链接 :卡尔曼家族从零解剖-(00)目录最新无死角讲解:https://blog.csdn.net/weixin_43013761/article/details/133846882
 
文末正下方中心提供了本人 联系方式, 点击本人照片即可显示 W X → 官方认证 {\color{blue}{文末正下方中心}提供了本人 \color{red} 联系方式,\color{blue}点击本人照片即可显示WX→官方认证} 文末正下方中心提供了本人联系方式,点击本人照片即可显示WX官方认证
 

一、前言

通过五个章节的分析,目前对于一维卡尔曼滤波有了一定层次的理解,这里先给出上篇博客推导出来的结论(卡尔曼五大公式):
①: x ˇ k = f x ^ k − 1                ②: σ X k − = f 2 σ X k − 1 + + σ Q k − 1 (01) \color{red} ①:\tag{01}\check x_{k}= f\hat x_{k-1}~~~~~~~~~~~~~~~②:\sigma^{-}_{X_{k}}=f^2\sigma_{X_{k-1}}^{+}+\sigma_{Q_{k-1}} xˇk=fx^k1               σXk=f2σXk1++σQk1(01) ③: k k = h σ X k − h 2 σ X k − + σ R k (02) \color{red} \tag{02}③:k_k=\frac{h \sigma_{X_k}^{-} }{h^{2} \sigma_{X_k}^{-} +\sigma_{R_k}} kk=h2σXk+σRkhσXk(02) ④: x ^ k = k k ( y k − h x ˇ ) + x ˇ                   ⑤: σ X k + = ( 1 − h k k ) σ X k − (03) \color{red} \tag{03} ④:\hat x_{k}=k_k(y_k-h\check x)+\check x~~~~~~~~~~~~~~~~~~⑤:\sigma^+_{X_{k}}=(1-hk_k) \sigma_{X_k}^{-} x^k=kk(ykhxˇ)+xˇ                  σXk+=(1hkk)σXk(03)
上面的五个式子很明显是递推的若假设已知 x ^ 0 \hat x_0 x^0 σ X 0 + \sigma_{X_{0}}^+ σX0+、以及各个时刻观测 y k y_k yk,则可推导出出 x ^ k \hat x_k x^k σ X k + \sigma_{X_{k}}^+ σXk+,如下:
【 x ^ 0 , σ X 0 + , y 1 】 → 【 x ^ 1 , σ X 1 + , y 2 】 → ⋯ → 【 x ^ k , σ X k + 】 (04) \color{Green} \tag{04}【\hat x_0,\sigma_{X_{0}}^+,y_1】→【\hat x_1,\sigma_{X_{1}}^+,y_2】→\cdots→【\hat x_k,\sigma_{X_{k}}^+】 x^0,σX0+,y1x^1,σX1+,y2x^k,σXk+(04)该篇本博客主要是进行编程实践,为了公式与源码更好的对应起来,对上述公式公式进行改写,因为编程中通常需要进行模块下,所以代码中会实现一个函数,该函数只完成一次递推,故上5式符号简写为:
①: x m i n u s = f x p l u s                ②: σ m i n u s = f 2 σ p l u s + q (05) \color{red} ①:\tag{05} x_ {minus}= f x_{plus}~~~~~~~~~~~~~~~②:\sigma_{minus}=f^2\sigma_{plus}+q xminus=fxplus               σminus=f2σplus+q(05) ③: k = h σ m i n u s h 2 σ m i n u s + r (06) \color{red} \tag{06}③:k=\frac{h \sigma_{minus} }{h^{2} \sigma_{minus} +r} k=h2σminus+rhσminus(06) ④: x p l u s = k ( y − h x m i n u s ) + x m i n u s                   ⑤: σ p l u s = ( 1 − h k ) σ m i n u s (07) \color{red} \tag{07} ④: x_{plus}=k(y-h x_{minus})+x_{minus}~~~~~~~~~~~~~~~~~~⑤:\sigma_{plus}=(1-hk) \sigma_{minus} xplus=k(yhxminus)+xminus                  σplus=(1hk)σminus(07)上式中的 r = σ R k r=\sigma_{R_k} r=σRk(预测过程标准差,主要影响收敛速度), q = σ R k q=\sigma_{R_k} q=σRk(观测过程标准差,理解为传感器精度,可以通过实验获得),这两个值都是固定值,迭代过程中通常不会改变。由于是编程,(05) 式中的 x m i n u s x_ {minus} xminus 最终会被 (07) 式中的 x p l u s x_{plus} xplus 覆盖,同理 σ p l u s \sigma_{plus} σplus 也会被覆盖。每次计算出来的 x p l u s x_{plus} xplus σ p l u s \sigma_{plus} σplus 又会作为下一次的 x m i n u s x_{minus} xminus σ m i n u s \sigma_{minus} σminus 进行输入。

二、C++一维示例

这是一个c++的示例程序,其主要演示如何使用一维卡尔曼滤波对一个线性方程进行预测,该线性方程建模十分简单,即为 a x 2 ax^2 ax2 的形式,容易看出这是一个二次函数,对应代码如下:

	float observe = a * std::pow(x, 2) + normal(mt);  // 生成 ax*x + b 加上一个高斯噪声的观测值

这里生成的是观测数据,另外一个重要的地方就是关于卡尔曼滤波初始化过程:

    // 创建一个卡尔曼滤波,分别设置参数 f, h, q, r; 这些数值迭代过程中是不会改变的
    KalmanFilter1D kalman_filter(1.0, 1.0, 1, 10);
    // 设置初始状态的均值与方差,后续迭代过程中会改变
    float x_plus = 100, sigma_plus = 0.0;  

有兴趣的朋友可以调整一个参数,看下输出数据的变化,代码会把数据进行保存,通过 file_path 参数可以修改该保存路径,曲线图查看工具本人使用的是 plotjuggler,有兴趣的朋友可以自行百度以下使用方式,下面是整体代码(含注释):

/*
 * @Author: WenhaiZhu 944284742@qq.com
 * @Date: 2023-11-13 14:22:04
 * @LastEditors: WenhaiZhu 944284742@qq.com
 * @LastEditTime: 2023-11-14 06:28:20
 * @FilePath: /slam_in_autonomous_driving/src/kalman_filter/kalman_filter1_zwh.cc
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */

#include <gflags/gflags.h>
#include <glog/logging.h>
#include <pangolin/pangolin.h>
#include <fstream>
#include <iostream>
#include <random>

class KalmanFilter1D {
   public:
    KalmanFilter1D(float f, float h, float q, float r) : f_(f), h_(h), q_(q), r_(r) {}
    ~KalmanFilter1D() {}

    void operator()(float x_plus, float sigma_plus, float observe) {
        float x_minus = f_ * x_plus + q_;                                // 求先验均值
        float sigma_minus = std::pow(f_, 2) * sigma_plus + q_;           // 求先验方差
        k_ = (h_ * sigma_minus) / (std::pow(h_, 2) * sigma_minus + r_);  // 求卡尔曼增益系数
        x_plus_ = x_minus + k_ * (observe - h_ * x_minus);               // 对先验均值更新,得到后验均值
        sigma_plus_ = (1 - h_ * k_) * sigma_minus;                       // 对先验更新,获得后验方标准差
    }

    float GetXMinus() { return x_plus_; }
    float GetSigmaMinus() { return sigma_plus_; }
    float Get_k() {}

   private:
    float f_;
    float h_;
    float q_;
    float r_;

    float k_ = 0;
    float x_plus_ = 0;
    float sigma_plus_ = 0;
};

int main(int argc, char* argv[]) {
    // 预备工作,可以忽略
    google::InitGoogleLogging(argv[0]);
    FLAGS_stderrthreshold = google::INFO;
    FLAGS_colorlogtostderr = true;
    google::ParseCommandLineFlags(&argc, &argv, true);

    // 创建一个卡尔曼滤波,分别设置参数 f, h, q, r; 这些数值迭代过程中是不会改变的
    KalmanFilter1D kalman_filter(1.0, 1.0, 1, 10);
    // 设置初始状态的均值与方差,后续迭代过程中会改变
    float x_plus = 100, sigma_plus = 0.0;  

    // 创建文件,用于保存数据,方便可视化
    std::string file_path = "./samples_zwh.csv";
    std::ofstream fd(file_path);
    if (!fd.is_open()) {
        LOG(ERROR) << "Unable to open file: " << file_path;
    }
    fd << "t,"
       << "x_plus,"
       << "observe," << std::endl;

    std::mt19937 mt(0);                            // 随机种子
    std::normal_distribution<> normal(0.0, 20.0);  // 用于随机生成符合高斯分布的数据
    float a = 0.1, b = 0.2;                        // 真实模型为 ax*x + b
    float x = 0.0, dt = 0.1;                       // x标识x轴数值,后面会刷新,dt标识采样间隔

    for (int i = 0; i < 1000; ++i) {
        float observe = a * std::pow(x, 2) + normal(mt);  // 生成 ax*x + b 加上一个高斯噪声的观测值

        kalman_filter(x_plus, sigma_plus, observe);  // 进行卡尔曼滤波,observe 等于观测方程中的 y

        x_plus = kalman_filter.GetXMinus();          // 获取滤波之后的均值
        sigma_plus = kalman_filter.GetSigmaMinus();  // 获取滤波之后的标准差

        x += dt;                                                         // 采样更新
        fd << x << "," << x_plus << "," << observe << "," << std::endl;  // 保存数据用于可视化
    }
    fd.close();
    return 0;
}

下面曲线是本人通过 plotjuggler 绘画结果,红色为 observe(y),绿色为为 x_plus,可以很明显看出 x_plus 的抖动小了很多,这就是滤波的效果。下图中,并没有把真值刻画出来,因为实际在应用的时候,也是没有办法知道真值的,如果是兴趣的朋友,可以简单修改一下源码把代码中 a * std::pow(x, 2) 结果保存下来即可。
在这里插入图片描述

三、透彻理解公式

1.先验分析

本博客的最开始,已经把公式给出,在前面文章中虽然大致给出了推导过程,但是并没有深入的探讨过这个公式,先来说一下 (05) 式,如下:
①: x m i n u s = f x p l u s                ②: σ m i n u s = f 2 σ p l u s + q (08) \color{Green} ①:\tag{08} x_ {minus}= f x_{plus}~~~~~~~~~~~~~~~②:\sigma_{minus}=f^2\sigma_{plus}+q xminus=fxplus               σminus=f2σplus+q(08)上式中的 q q q 表示符合噪声高斯噪声 N ( 0 , q ) N(0,q) N(0,q) 的标准差,可以看出,每次迭代,预测状态 x m i n u s x_ {minus} xminus 对应的标准差 σ m i n u s \sigma_{minus} σminus 都会在原来的基础( σ p l u s \sigma_{plus} σplus)上叠加一个 q q q,假如没后续没有观测方程对齐进行修正,可想而知, σ m i n u s \sigma_{minus} σminus 会约来越打,即 x m i n u s x_{minus} xminus 的可信度越来越低,其是没有办法当作一个可信的结果输出的。

另外,为了方便讲解,对 状态方程 x p l u s = f ( x m i n u s ) x_{plus} = f(x_ {minus}) xplus=f(xminus) 进行了简化,直接变成了 x p l u s = f ∗ x m i n u s x_{plus} = f*x_ {minus} xplus=fxminus 形式,其实这里的 f ( x ) f(x) f(x) 是一个广义的概念,并不局限于 x x x 一个参数, 回忆一下前面的博客 卡尔曼家族从零解剖-(03)贝叶斯滤波→公式推导与示例 中 (5) 式 : x k = f ( x k − 1 , v k − 1 ) + q k x_{k}=f(x_{k-1},v_{k-1})+q_k xk=f(xk1,vk1)+qk,可以知道其接收两个参数,其实不止,只要保证 f ( x ) f(x) f(x) 是线性的,完全可以接收更多的参数。如书写成 x k = f ( x k − 1 , v k − 1 , u k − 1 , t k − 1 , ) + q k x_{k}=f(x_{k-1},v_{k-1},u_{k-1},t_{k-1},)+q_k xk=f(xk1,vk1,uk1,tk1,)+qk 等。值得 注意 : \color{red} 注意: 注意: 只有 x x x 才是由卡尔曼递推的,其他的只能类似于 y y y 通过观测或者测量或者。且 f ( x k − 1 , v k − 1 , u k − 1 , t k − 1 , ) + q k f(x_{k-1},v_{k-1},u_{k-1},t_{k-1},)+q_k f(xk1,vk1,uk1,tk1,)+qk 的结果只能为状态 x x x 而不是 v v v u u u 等。

2.卡尔曼增益

卡尔曼增益就是上面的 (06),英文通常称为 Kalman Gain,如下:
③: k = h σ m i n u s h 2 σ m i n u s + r (09) \color{Green} \tag{09}③:k=\frac{h \sigma_{minus} }{h^{2} \sigma_{minus} +r} k=h2σminus+rhσminus(09) 其就是一个比值,由于 h h h 是一个常数,所以下面的讨论忽略他,单独来分析 σ m i n u s \sigma_{minus} σminus r r r,前者是预测出来的标准差,值越小则表示预测的状态 x m i n u s x_{minus} xminus 可信度越高,这里假设他无穷小,也就是说预测出来的结果无线接近真实值,根据上式,其结果 k k k 就无限趋近于 0。再反过来,如果 x m i n u s x_{minus} xminus 无限趋向于无穷大,易知结果 k k k 趋向于 1(前面提到不考虑 h h h)。

那么总结起来, k k k 越大,表示预测结果 x m i n u s x_{minus} xminus 越不可信, k k k 越小表示预测结果 x m i n u s x_{minus} xminus 越可信。下面就是看如何把这个 k k k 用起来。

3.状态更新

其实观测方程也是一个广义的概念,其并不局限于一个观测值 y y y,也就是说在 k k k 时刻状态 x k x_k xk 下,你可以观测到 y k 1 、 y k 2 、 y k 3 、 ⋯ 、 y k j y_{k1}、y_{k2}、y_{k3}、\cdots、y_{kj} yk1yk2yk3ykj。这里举一个例子,算法估算出温度是 35 35 35(先验),但是你可以用 j j j 个体温计进行测量,获得 j j j 个观测值,也就是说观测方程可以书写成 ( y k 1 , y k 1 , ⋯   , y k j ) = f ( x k ) (y_{k1},y_{k1},\cdots, y_{kj})=f(x_k) (yk1,yk1,,ykj)=f(xk),使用逆函数变换一下就成了 x k = f − 1 ( k 1 , y k 1 , ⋯   , y k j ) x_k=f^{-1}(_{k1},y_{k1},\cdots, y_{kj}) xk=f1(k1,yk1,,ykj),这里看起来可能更加合理一点,后续讲解矩阵形式的卡尔曼滤波,或许会为大家示例一下,这里就暂且略过了,回到 (07) 式: ④: x p l u s = k ( y − h x m i n u s ) + x m i n u s                   ⑤: σ p l u s = ( 1 − h k ) σ m i n u s (07) \color{Green} \tag{07} ④: x_{plus}=k(y-h x_{minus})+x_{minus}~~~~~~~~~~~~~~~~~~⑤:\sigma_{plus}=(1-hk) \sigma_{minus} xplus=k(yhxminus)+xminus                  σplus=(1hk)σminus(07)
根据前面的结论, k k k 越大,表示预测结果 x m i n u s x_{minus} xminus 越不可信, k k k 越小表示预测 结果 x m i n u s x_{minus} xminus 越可信。来看看是不是这么一回事,

首先看 ④, y − h x m i n u s y-hx_{minus} yhxminus 表示观测误差,如果观测误差比较大,那么说明观测结果不可信,应该相信预测结果,即前面因子 k k k 应该越小越好。与前面【卡尔曼增益】的逻辑吻合。

再来看⑤,如果 σ m i n u s \sigma_{minus} σminus 较大,说明预测结果不可信,那么因子 1 − h k 1-hk 1hk 的结果越小越好,即 k k k 越大越好。与前面【卡尔曼增益】的逻辑吻合。

四、总结

到目前为止,对于卡尔曼滤波的了解应该是比较深入了,虽然仅仅局限于一维。且前面还有太多的疑惑没有具体分析,如:

①标准高斯分布分布负无穷到正无穷的积分为什么是1?
② 高斯分布经过线性变换为什么还是高斯分布?
③ 两个高斯分布函数的乘积为什么依旧是高斯分布?
④ 多维(多元)卡尔曼滤波应该如何推导与编程?

如果再加上后面还要分析扩展卡尔曼滤波(EKF)、误差状态卡尔曼滤波 (ESKF)、粒子滤波、迭代卡尔曼滤波等。任务量,确实比较庞大,不过没有关系,踏踏实实走好每一步,总会到终点的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1210380.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux高级篇基础理论(详细文档)二

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️不能因为人生的道路坎坷,就使自己的身躯变得弯曲;不能因为生活的历程漫长,就使求索的 脚步迟缓。 ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xff1a;云计算技…

NOIR脑机接口机器人——让脑机接口通过少样本学习实现做家务的能力

一、概述 大脑与机器人接口&#xff08;BRI&#xff09;是人类艺术、科学和工程的集大成之作&#xff0c;其影响已经贯穿于无数科幻作品和创意艺术之中&#xff0c;如《黑客帝国》和《西部世界》等。然而&#xff0c;要真正实现BRI并创造出能够与人类完美协同运作的机器人系统…

对一个Series序列执行多种聚合操作Series.aggregate()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 对序列同时做多种聚合计算 聚合计算&#xff1a;求最大、均值等 Series.aggregate() [太阳]选择题 关于以下代码的说法中正确的是? import pandas as pd a pd.Series([1,2,3]) print("【…

CNCC 2023收官,Milvus Cloud与行业大咖共话向量数据库系统

近期,CNCC 2023 在沈阳圆满结束,紧凑、前沿的 129 场技术论坛让人印象深刻。据悉,这 129 场技术论坛涵盖人工智能、安全、计算+、软件工程、教育、网络、芯片、云计算等 30 余个方向。Zilliz 受邀参与【智能时代的大数据系统】技术论坛。 智能时代的到来,无疑给社会经济和日…

.pcd文件格式

更详细的格式介绍可以查看我的这篇博客 『Open3D』安装与点云格式通识_open3d安装_NNNNNathan的博客-CSDN博客文章浏览阅读1.9k次。介绍了open3d的安装和当前适用与存储点云信息的文件格式&#xff0c;并详细介绍了pcd与ply两种格式。_open3d安装https://blog.csdn.net/qq_413…

Spring中的BeanFactory和ApplicationContext的区别

我用一个例子去测试BeanFactory和ApplicationContext的区别 首先建立一个bean public class User { //声明无参构造&#xff0c;打印一句话&#xff0c;监测对象创建时机public User(){System.out.println("User对象初始化");} } 然后再建立测试类 ublic class User…

Apache Airflow (七) :DAG调度周期设置

&#x1f3e1; 个人主页&#xff1a;IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 &#x1f6a9; 私聊博主&#xff1a;加入大数据技术讨论群聊&#xff0c;获取更多大数据资料。 &#x1f514; 博主个人B栈地址&#xff1a;豹哥教你大数据的个人空间-豹…

轻松找回您的珍贵回忆的最好的 6 种照片数据恢复软件!

照片是珍惜过去珍贵时刻的唯一方式。它们让记忆永存&#xff0c;帮助我们重温生命中最美好的时刻。但是&#xff0c;当这些时刻丢失时会发生什么&#xff1f;您是否曾经因系统崩溃而意外删除或丢失照片&#xff1f;丢失照片可能令人心碎&#xff0c;但仍有希望&#xff0c;因为…

【计算思维】少儿编程蓝桥杯青少组计算思维题考试真题及解析

少儿编程 蓝桥杯青少组计算思维题考试真题及解析 单选题 1.多多观察一个立体图形&#xff0c;从不同的角度看到的形状如下图所示&#xff1a; 这个立体图形可能是 A. B. C. D. 2.将下图旋转后&#xff0c;可以得到的图片是 A、 B、 C、 D、 3.小鱼按照下面的规律排列&a…

C语言--指针与数组--遍历数组的n种方式【详细】

一.一维数组名的含义 arr一般表示数组的其实地址&#xff08;除了两种例外&#xff09; 1.在定义数组的同一个函数中(不是形参),求sizeof(arr),求整个数组的字节数 2.在定义数组的同一个函数中(不是形参),&arr1,加整个数组的大小 (经常考试) 3.除上面以外,arr都表示数组的…

Leetcode刷题详解——太平洋大西洋水流问题

1. 题目链接&#xff1a;417. 太平洋大西洋水流问题 2. 题目描述&#xff1a; 有一个 m n 的矩形岛屿&#xff0c;与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界&#xff0c;而 “大西洋” 处于大陆的右边界和下边界。 这个岛被分割成一个由若干方形单元格…

exsi的安装和配置

直接虚拟真实机 vcent server 管理大量的exsi SXI原生架构模式的虚拟化技术&#xff0c;是不需要宿主操作系统的&#xff0c;它自己本身就是操作系统。因此&#xff0c;装ESXI的时候就等同于装操作系统&#xff0c;直接拿iso映像(光盘)装ESXI就可以了。 VMware vCente…

Vscode编辑器保存时一直提示正在保存“index.vue”: 正在从“‘Vetur‘, ‘ESLint‘”获取代码操作

问题描述&#xff1a; Vscode在使用了Vetur, ESLint两个扩展配置了vue文件语法检查&#xff0c;保存时自动fix&#xff0c;经常会出现卡死&#xff0c;通知内容如下&#xff1a; 正在保存“index.vue”: 正在从“Vetur, ESLint”获取代码操作&#xff1b; 解决办法&#xff1a…

μC/OS-II---互斥信号量管理1(os_mutex.c)

目录 背景&#xff1a;优先级反转问题互斥信号量管理互斥信号量创建互斥信号量删除互斥信号量获取/等待 背景&#xff1a;优先级反转问题 在高优先级任务等待低优先级任务释放资源时&#xff0c;第三个中等优先级任务抢占了低优先级任务。阻塞时间是无法预测的&#xff0c;可能…

基于springboot实现学生选课平台管理系统项目【项目源码】计算机毕业设计

基于springboot实现学生选课平台管理系统演示 系统开发平台 在该地方废物回收机构管理系统中&#xff0c;Eclipse能给用户提供更多的方便&#xff0c;其特点一是方便学习&#xff0c;方便快捷&#xff1b;二是有非常大的信息储存量&#xff0c;主要功能是用在对数据库中查询和…

μC/OS-II---互斥信号量管理2(os_mutex.c)

目录 背景&#xff1a;优先级反转问题互斥信号量管理互斥信号量发出&#xff08;释放&#xff09;互斥信号量获取/无等待互斥信号量状态查询 背景&#xff1a;优先级反转问题 在高优先级任务等待低优先级任务释放资源时&#xff0c;第三个中等优先级任务抢占了低优先级任务。阻…

【JY】ANSYS Workbench在减隔震应用分析中的单元积分技术笔记

写在前文 尽管减隔震技术与有限元结合取得了众多成果&#xff0c;但仍面临诸多挑战&#xff0c;如材料非线性、模型不确定性等等。减隔震设计除了常规的宏观结构设计采用SAP2000、Etabs、Midas、SSG、Paco-SAP 或 YJK\PKPM等。 【JY】各类有限元软件计算功能赏析与探讨 我们需要…

解析数据洁净之道:BI中数据清理对见解的深远影响

本文由葡萄城技术团队发布。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 前言 随着数字化和信息化进程的不断发展&#xff0c;数据已经成为企业的一项不可或缺的重要资源。然而&#xff0c;这…

Linux常用命令——bzgrep命令

在线Linux命令查询工具 bzgrep 使用正则表达式搜索.bz2压缩包中文件 补充说明 bzgrep命令使用正则表达式搜索“.bz2”压缩包中文件&#xff0c;将匹配的行显示到标注输出。 语法 bzgrep(参数)参数 搜索模式&#xff1a;指定要搜索的模式&#xff1b;.bz2文件&#xff1a…

Linux系统简介与开源精神

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; Linux系统理论 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言&#x1f324;️Linux系统背景☁️UNIX发展史☁️Linux发展史☁️Linux系统企业应用现…