C++学习之shell高级和正则表达式

目录

1.正则表达式

2.C中使用正则

3.复习

4.sort命令

5.uniq命令

6.wc命令

7.grep命令

8.find命令

9.xargs命令

10.sed命令

11.awk命令

12.crontab


1.正则表达式

1 管道
    使用| 将多个命令拼接在一起
    原理,就是将前一个命令的标准输出作为后一个命令的标准输入来重定向 ,标准错误输出是不会重定向


    需求,编写一个简单的管道命令,读取标准输入,将标准输入的数据转为大写,然后输出

    more 命令
        将标准输入的内容进行缓慢向下查看,要人工操作向下
        只支持向下走,不支持往回走

    less 命令
        比more更加完善,支持往回滚,也支持类似vim的操作,查找 hjkl

2.C中使用正则

2 tee 命令
    将标准输出重新输出,同时存一份到文件
    常用的场景
        开一个服务,服务一直在刷log,需要实时看到log,但是又想将log存成一个文件

3.复习


3 文件重定向
    cmd > file              把标准输出重定向到新文件中
    cmd >> file             追加

    cmd > file 2>&1         标准出错也重定向到1所指向的file里

        2>&1 
            文件描述符2 也重定向到文件描述符1的位置
            标准错误输出也重定向到标准输出的位置

    cmd >> file 2>&1
    cmd < file
        将file的内容重定向到cmd命令的标准输入
    cmd < file1 > file2     输入输出都定向到文件里
    cmd < &fd               把文件描述符fd作为标准输入

    cmd > &fd               把文件描述符fd作为标准输出

    cmd < &-                关闭标准输入

4.sort命令

4 函数
    function 函数名()        #小括号里边也不需要填参数列表
    {
        local var=value   #局部变量

        return 1          #return 只能返回整数,不能返回其他类型 ,返回值是作为退出状态来使用
    }

    function关键字可以省略   ,小括号也可以省略 ,但是两个必须要保留一个,不然解析器不知道是要定义一个函数


    调用函数的方法,就跟普通命令一样

        函数名 arg1 arg2  ...

        函数的执行状态看return语句,如果没有return语句,就以函数里边最后一条执行的指令的返回状态作为整个函数的退出状态


    函数支持递归
        遍历目录,包括子目录,如果是文件就输出xxx是文件,如果是目录就输出xxx是目录


    函数的传参
        也是使用 $1 $2 ... 来获取函数内的参数
    #!/bin/bash

    function visit
    {
        local dir="$1"
        for f in `ls $1`
        do
            if [ -f "$dir/$f" ]
            then
                echo "$dir/$f is a file"
            elif [ -d "$dir/$f" ]
            then
                echo "$dir/$f is a dir"
                visit "$dir/$f"
            else
                echo "$dir/$f is not recognized" 
            fi
        done
    }

    visit .


    脚本的调试
        -n   遍历一下脚本,检查语法错误
        -v   一遍执行脚本一遍将解析到的脚本输出来
        -x   执行脚本的同时打印每一句命令,把变量的值都打印出来  (常用)

        打开调试的方法
            1. bash -x  脚本.sh
            2. 脚本开头 使用 #!/bin/bash -x
            3. 脚本中显式的使用 set -x 打开   使用 set +x 关闭调试

5.uniq命令

5 正则表达式
练习:               
    1 以S开头的字符串      
        ^S

    2 以数字结尾的字符串
        [0123456789]   匹配任意数字
        [0-9]
        \d
        $               匹配字符串结尾

        [0-9]$

    3 匹配空字符串(没有任何字符)
        ^$
    4 字符串只包含三个数字
        ^\d\d\d$
        ^\d{3}$
            {n} 花括号括起来一个数字,表示前面的单元重复n次

    5 字符串只有3到5个字母
        控制最少重复次数和最大的重复次数

        {m,n} m表示前面单元最小重复次数,n表示最大重复次数

        [a-zA-Z]   表示大小写字母  如果中括号中有多个区间,区间之间不要留空格或其他分隔符

        ^[a-zA-Z]{3,5}$


    6 匹配不是a-z的任意字符
        [^a-z]    中括号中第一个字符如果是^,表示区间取反
        ^[^a-z]$

    7 字符串有0到1个数字或者字母或者下划线
        {0,1} 表示重复0-1次
        ?     也可以表示0-1次重复

        ^[0-9a-zA-Z_]?$
        ^\w?$


    8 字符串有1个或多个空白符号(\t\n\r等)
        \s  表示空白字符 包括 \t\n\r ....
        {1,}   表示重复1-n  跟+号一样

        ^\s+$


    9 字符串有0个或者若干个任意字符(除了\n)
        .  代表任意字符,除了\n
        ^.{,}$   花括号中两个参数置空表示重复次数任意 0-n
        ^.*$     *表示前面的单元重复0-n次

        ? 0-1
        + 1-n
        * 0-n


    10 匹配0或任意多组ABC,比如ABC,ABCABCABC
        使用小括号来讲多个单元重新组合成为一个单元

        ^(ABC)*$


    11 字符串要么是ABC,要么是123
        | 表示选择,选择两边的正则匹配一个

        ^ABC$|^123$
        ^(ABC|123)$     小括号也可以将选择范围控制在括号内


    12 字符串只有一个点号  
        做转义 还是使用\

        ^\.$

    13 匹配十进制3位整数             
        100 - 999
        ^[1-9][0-9]{2}$


        匹配十进制 0-999 的数字
            分段
                一位数
                    [0-9]
                两位数
                    10-99
                    [1-9][0-9]
                三位数
                    [1-9][0-9]{2}


            ^([0-9]|[1-9][0-9]{1,2})$

    14 匹配0-255的整数

        匹配 ip 

            分段
                一位数
                    [0-9]
                两位数
                    10-99
                    [1-9][0-9]

                三位数
                    100-199
                        1[0-9]{2}

                    200-249
                        2[0-4][0-9]

                    250-255
                        25[0-5]

    15 匹配端口号
        0-65535

    16 email
        [\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?


    基础的正则
        +?* 是普通字符
    扩展的正则
        +?* 是特殊字符

    perl的正则
        最常用

        perl正则在扩展正则之上添加了一些特殊符号
            \d \w \s ....

6.wc命令

6 sort
    命令从标准输入中读取数据然后按照字符串内容进行排序
    -f 忽略字符大小写
    -n 比较数值大小
    -t 指定分割符,默认是空格或者tab
    -k 指定分割后进行比较字段
    -u 重复的行只显示一次
    -r 反向排序
    -R 打乱顺序
        同样的两行洗不乱


        将/etc/passwd 根据用户id来排序
        sort -t: -k3 -n < /etc/passwd

7.grep命令

7 uniq
    去除重复的行,前提是重复的行连续
    -c 显示每行重复的次数
    -d 仅显示重复过的行
    -u 仅显示不曾重复的行
        sort < test.txt | uniq

8.find命令

9 grep
    global regular expression print
    -c 只输出匹配行的计数
    -i 不区分大小写
    -H 文件名显示
    -r 递归遍历目录
    -n 显示行号
    -s 不显示不存在或无匹配文本的错误信息
    -v 显示不包含匹配文本的所有行,这个参数经常用于过滤不想显示的行
    -E 使用扩展的正则表达
    -P 使用perl的正则表达式
    -F 匹配固定的字符串,而非正则表达式


    egrep  = grep -E
    fgrep  = grep -F
    rgrep  = grep -r

    grep 默认使用的是基础的正则

9.xargs命令

10 find

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

    option 选项如下:
        -name 按照文件名查找文件。
            find . -name "1.txt"
        -perm 按照文件权限来查找文件。
            find . -perm 660
        -user 按照文件属主来查找文件。
        -group 按照文件所属的组来查找文件。
        -mtime -n +n 按照文件的更改时间来查找文件,-n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在
            n天以前。find命令还有-atime和-ctime 选项,但它们都和-m time选项。
        -atime 访问时间
        -ctime 创建时间
        -nogroup 查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。
        -nouser 查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
        -newer file1 ! file2 查找更改时间比文件file1新但比文件file2旧的文件。
        -type 查找某一类型的文件,诸如:
            b - 块设备文件。
            d - 目录。
            c - 字符设备文件。
            p - 管道文件。
            l - 符号链接文件。
            f - 普通文件。
            s - socket文件

        -exec
            find . -name "*.txt" -exec gzip {} \;

            查找当前目录下的txt文件并且打包成为gzip
            每找到一个文件,就会执行exec后面的命令
                gzip ./a/2.txt
                gzip ./a/6.txt

                最后是一个\;  反斜杠不能省,作为当前exec后面命令的结束符

        -ok 
            跟-exec用法一样,但是每找到一个文件要执行后面的命令前会给用户确认

10.sed命令

11 xargs
    
    将标准输入的参数整齐的拼凑在一行里边

    单独使用该命令没什么用,要配合其他命令来使用


    docker ps -aq | xargs docker rm -f

    find . -name "*.txt" | xargs -I{} mv {}  xxx/
        -I{} 指定一个替换字符串作为参数替换
    

11.awk命令

12 sed
    文本1 ->  sed + 脚本 -> 文本2 

    ed 编辑器   ->  sed   -> vim 

    sed option 'script' file1 file2 ...             sed 参数  ‘脚本(/pattern/action)’ 待处理文件
    sed option -f scriptfile file1 file2 ...        sed 参数 –f ‘脚本文件’ 待处理文件


        p,  print           打印
        a,  append          追加
        i,  insert          插入
        d,  delete          删除
        s,  substitution    替换

12.crontab


13 awk

    awk option 'script' file1 file2 ...
    awk option -f scriptfile file1 file2 ...

    最常见用法就是过滤哪一列
    xxxx | awk '{print $2}'


    脚本格式
    {actions}                       
        每一行文本都无条件的执行脚本
    /pattern/{actions}
        匹配了模式之后再执行后面的动作
    condition{actions}
        BEGIN
            在遍历文本的第一行之前会执行某个动作
        END
            在遍历完文本之后再去执行某个动作


    ProductA 30
    ProductB 76
    ProductC 55

    在输出表格之前输出表头  产品名字  库存
    输出完表格之后  输出    库存总量 : xxxx

    在遍历之前输出表头
    BEGIN{
        printf "%s\t%s\n","产品","库存";
        sum=0;
    }
    在遍历每一行的过程中输出每一行的内容,将库存加到sum变量
    {
        printf "%s\t%s\n",$1,$2;
        sum+=$2;
    }
    遍历完之后输出sum变量
    END{
        printf "库存总量:%d\n",sum
    }

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

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

相关文章

【Vue】 实现TodoList案例(待办事项)

目录 组件化编码流程&#xff08;通用&#xff09; 1.实现静态组件&#xff1a;抽取组件&#xff0c;使用组件实现静态页面效果 2.展示动态数据&#xff1a; 1. 常规 HTML 属性 3.交互——从绑定事件监听开始 什么时候要用 event&#xff1a; 什么时候不需要用 event&am…

【Bootstrap V4系列】学习入门教程之 组件-卡片(Card)

Bootstrap V4系列 学习入门教程之 组件-卡片&#xff08;Card&#xff09; 卡片&#xff08;Card&#xff09;一、Example二、Content types 内容类型2.1 Body 主体2.2 Titles, text, and links 标题、文本和链接2.3 Images 图片2.4 List groups 列表组2.5 Kitchen sink 洗涤槽…

java学习之数据结构:四、树(代码补充)

这部分主要是用代码实现有序二叉树、树遍历、删除节点 目录 1.构建有序二叉树 1.1原理 1.2插入实现 2.广度优先遍历--队列实现 3.深度优先遍历--递归实现 3.1先序遍历 3.2中序遍历 3.3后序遍历 4.删除 4.1删除叶子节点 4.2删除有一棵子树的节点 4.3删除有两棵子树的节…

架构进阶:什么是数据架构,如何理解数据架构?(华为)

数据架构是企业架构的重要组成部分,DAMA、IBM 及国内大厂对其定义各有侧重。它包含数据资产目录、数据标准、数据模型和数据分布四个组件。数据资产目录可梳理企业数据资产,数据标准统一数据含义和规则,数据模型反映业务对象关联关系,数据分布呈现数据流动情况。数据架构是…

Unity SpriteEditor(精灵图片编辑器)

&#x1f3c6; 个人愚见&#xff0c;没事写写笔记 &#x1f3c6;《博客内容》&#xff1a;Unity3D开发内容 &#x1f3c6;&#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f50e;SpriteEditor&#xff1a; 精灵图片编辑器 &#x1f4cc;用于编辑2D游戏开发中使用的Sp…

【网络原理】从零开始深入理解HTTP的报文格式(一)

本篇博客给大家带来的是网络HTTP协议的知识点, 重点介绍HTTP的报文格式. &#x1f40e;文章专栏: JavaEE初阶 &#x1f680;若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅&#x1f68…

ElasticSearch深入解析(九):Object、Nested、Flattened类型

文章目录 一、Object 类型&#xff1a;默认的嵌套对象处理方式核心原理典型场景关键限制 二、Nested 类型&#xff1a;解决嵌套数组的关联查询核心原理典型场景使用示例注意事项 三、Join 类型&#xff1a;跨文档的父子关联核心原理典型场景使用示例注意事项 四、Flattened 类型…

36、C#中的⽅法声明参数关键字params,ref,out的意义及⽤法

在C#中&#xff0c;params、ref 和 out 是方法声明中用于修饰参数的关键字&#xff0c;它们各自有不同的用途和语义。以下是它们的详细说明和用法&#xff1a; 1、 params 关键字 意义 params 允许方法接受可变数量的参数&#xff0c;这些参数会被编译为一个数组。适用于参数…

【大模型实战篇】华为信创环境采用vllm部署QwQ-32B模型

1. 背景 本文分享在华为昇腾机器上部署QwQ-32B模型的实践。 首先华为自己是提供了一套在信创机器&#xff08;NPU&#xff09;上部署模型的方案【1】&#xff0c;但是部署之后&#xff0c;测试发现会有输出截断的现象。QwQ-32B本身是支持128k的最大上下文长度&#xff0c;定位…

前端面经-VUE3篇(二)--vue3基础知识(二)计算属性(computed)、监听属性(Watch)

一、计算属性(computed) 计算属性&#xff08;Computed Properties&#xff09;是 Vue 中一种特殊的响应式数据&#xff0c;它能基于已有的响应式数据动态计算出新的数据。 计算属性有以下特性&#xff1a; 自动缓存&#xff1a;只有当它依赖的响应式数据发生变化时&#xff…

[预备知识] 5. 优化理论(一)

优化理论 梯度下降&#xff08;Gradient Descent&#xff09; 数学原理与可视化 梯度下降是优化领域的基石算法&#xff0c;其核心思想是沿负梯度方向迭代更新参数。数学表达式为&#xff1a; θ t 1 θ t − α ∇ θ J ( θ t ) \theta_{t1} \theta_t - \alpha \nabla…

大模型微调Fine-tuning:从概念到实践的全面解析

目录 引言 一、什么是大模型微调&#xff1f; 1.1 预训练与微调的区别 1.2 微调的技术演进 二、为什么需要微调&#xff1f; 2.1 解决大模型的固有局限 2.2 微调的优势 三、主流微调方法 3.1 全参数微调 3.2 参数高效微调&#xff08;PEFT&#xff09; 四、微调实践指…

Docker 使用下 (二)

Docker 使用下 &#xff08;二&#xff09; 文章目录 Docker 使用下 &#xff08;二&#xff09;前言一、初识Docker1.1 、Docker概述1.2 、Docker的历史1.3 、Docker解决了什么问题1.4 、Docker 的优点1.5 、Docker的架构图 二、镜像三、容器四、数据卷4.1、数据卷的概念4.2 、…

洛谷P12238 [蓝桥杯 2023 国 Java A] 单词分类

[Problem Discription] \color{blue}{\texttt{[Problem Discription]}} [Problem Discription] Copy from luogu. [Analysis] \color{blue}{\texttt{[Analysis]}} [Analysis] 既然都是字符串前缀的问题了&#xff0c;那当然首先就应该想到 Trie \text{Trie} Trie 树。 我们可…

pta作业中有启发性的程序题

1 【知识点】&#xff1a;多态 函数接口定义&#xff1a; 以Student为基类&#xff0c;构建GroupA, GroupB和GroupC三个类 裁判测试程序样例&#xff1a; #include<iostream> #include <string> using namespace std;/* 请在这里填写答案 */int main() {const …

Scrapy框架之CrawlSpider爬虫 实战 详解

CrawlSpider 是 Scrapy 框架中一个非常实用的爬虫基类&#xff0c;它继承自 Spider 类&#xff0c;主要用于实现基于规则的网页爬取。相较于普通的 Spider 类&#xff0c;CrawlSpider 可以根据预定义的规则自动跟进页面中的链接&#xff0c;从而实现更高效、更灵活的爬取。 Scr…

Glide 如何加载远程 Base64 图片

最近有个需求&#xff0c;后端给出的图片地址并不是正常的 URL&#xff0c;而且需要一个接口去请求&#xff0c;但是返回的是 base64 数据流。这里不关心为啥要这么多&#xff0c;原因有很多&#xff0c;可能是系统的问题&#xff0c;也可能是能力问题。当然作为我们 Android 程…

004-nlohmann/json 快速认识-C++开源库108杰

了解 nlohmann/json 的特点&#xff1b;理解编程中 “数据战场”划分的概念&#xff1b;迅速上手多种方式构建一个JSON对象&#xff1b; 1 特点与安装 nlohmann/json 是一个在 github 长期霸占 “JSON” 热搜版第1的CJSON处理库。它的最大优点是与 C 标准库的容器数据&#xf…

#基础Machine Learning 算法(上)

机器学习算法的分类 机器学习算法大致可以分为三类&#xff1a; 监督学习算法 (Supervised Algorithms&#xff09;:在监督学习训练过程中&#xff0c;可以由训练数据集学到或建立一个模式&#xff08;函数 / learning model&#xff09;&#xff0c;并依此模式推测新的实例。…

正弦波、方波、三角波和锯齿波信号发生器——Multisim电路仿真

目录 Multisim使用教程说明链接 一、正弦波信号发生电路 1.1正弦波发生电路 电路组成 工作原理 振荡频率 1.2 正弦波发生电路仿真分析 工程文件链接 二、方波信号发生电路 2.1 方波发生电路可调频率 工作原理 详细过程 2.2 方波发生电路可调频率/可调占空比 调节占空比 方波产生…