• Linux ----------------------- 文本处理工具


    (一)绪论

            awk、grep、sed和cut 是Linux 操作文本的四大利器,合称文本四大金刚,也是必须掌握的Linux 命令之一。这四个工具的功能各有侧重:

    awk:功能最强大,用于处理和格式化文本,可以进行复杂的文本处理和数据提取,通常用于处理结构化数据,例如 CSV 文件。

    grep:主要用于在文本中查找和匹配特定字符串或模式,是一个文本搜索工具。

    sed:用于编辑匹配到的文本,可以进行替换、删除、插入等操作,是一个文本编辑工具。

    cut:用于从文本中提取指定的字段或列,通常用于文本列的分割。

            接下来我们详细分析这四个命令

    (二)awk

           awk是一种强大的文本分析工具,主要用于在linux/unix 下对文本和数据进行处理。
    对数据进行分析、统计并生成报表,比如网站的访问量,访问的IP 量等等。
            awk是一种编程语言,awk可以定义变量、运算符,使用流程控制语句进行深度加工
    与分析。awk其名称得自于它的创始人.Alfred Aho 、Peter Weinberger 和 Brian Kernighan
    姓氏的首个字母。
            awk的处理文本和数据的方式把文件逐行读入,以空格为默认分隔符将每行切片。
    切片的部分再进行各种分析处理。。

    语法

    awk [选项参数] 'script' var=value file(s)
    或
    awk [选项参数] -f scriptfile var=value file(s)
    

    即 awk 选项参数  ‘命令部分' 文件名,注意:引用shell变量需要双引号引起。

    选项参数说明:

    • --F  : 指定文件拆分分隔符,如果不写默认是空格
    • -v    : 赋值一个用户定义变量,将外部变量传递给awk
    • -f     :赋值一个用户定义变量,将外部变量传递给awk

    AWK内置变量

    变量名含义
    $n指整条变量,当前记录的第n个字段。比如n为1 表示第一个字段
    $NF表示最后一列的信息,跟变量NF是有区别的,变量NF统计的是每行 列的总数
    $0这个变量包含执行过程中当前行的文本内容
    ARGC命令行参数的个数
    ARGIND命令行中当前文件的位置
    ARGV包含命令行参数的数组
    CONVFMT

    数字转换格式(默认值为%.6g)

    ENVIRON环境变量关联数组
    ERRNO最后一个系统错误的描述
    FIELDWIDTHS字段宽度列表(用空格键分割)
    FILENAME当前输入文件的名
    NR表示记录数,在执行过程中对应当前的行号
    FNR同NR;但相对于当前文件
    FS字段分隔符(默认是任何空格)
    IGNORECASE如果真,进行忽略大小写的匹配
    NF表示字段数,在执行过程中对应当前的字段数。print $NF 打印一行中最后一个字段
    OFMT数字的输出格式(默认值为%.6g)
    OFS输出字段分隔符(默认是一个空格)
    ORS输出记录分隔符(默认是一个换行符)
    RS记录分隔符(默认是一个换行符)
    RSTART由 match函数所匹配的字符串的第一个位置
    SUBSEP数字下标分割符(默认是34)

    实例:

    格式化输出 'print'和'printf’

    print函数  类似echo,它是换行输出

    printf函数 类似echo-n,它不换行输出,可以使用%s,%d进行占位。其中%s表示字符类型,%d数值类型。-表示左对齐,默认右对齐。

    BEGIN……END使用

    BEGIN:表示在程序开始前执行。

    END:表示所有文件处理完后执行。

    用法:'BEGIN‘{开始处理前};{处理中};END{处理结束后}’

    定义变量 -v

    流程控制语句

    条件语句——IF 语句

    IF 条件语句语法格式如下:

    if (condition)
        action

    也可以使用花括号来执行一组操作:

    if (condition)
    {
        action-1
        action-1
        .
        .
        action-n
    }

     

    条件语句——IF - ELSE 语句

    IF - ELSE 条件语句语法格式如下:

    if (condition)
        action-1
    else
        action-2

    在条件语句 condition 为 true 时执行 action-1,否则执行 action-2。

     
    

    条件语句——IF - ELSE - IF

    IF - ELSE 条件语句语法格式如下:

    if (condition)
        action-1
    else if (condition1)
        action-2
    ……

    else if (conditionn) action-n

    else  action-m

     

    循环——For

    For 循环的语法如下:

    for (initialisation; condition; increment/decrement)
        action

            for 语句首先执行初始化动作( initialisation ),然后再检查条件( condition )。如果条件为真,则执行动作( action ),然后执行递增( increment )或者递减( decrement )操作。只要条件为 true 循环就会一直执行。每次循环结束都会进条件检查,若条件为 false 则结束循环。

    下面的例子使用 For 循环输出数字 1 至 5:

    $ awk 'BEGIN { for (i = 1; i <= 5; ++i) print i }'

     

    循环——While

    While 循环的语法如下:

    while (condition)
        action

            While 循环首先检查条件 condition 是否为 true ,若条件为 true 则执行动作 action。此过程一直重复直到条件 condition 为 flase 才停止。

    下面是使用 While 循环输出数字 1 到 5 的例子:

    $ awk 'BEGIN {i = 1; while (i < 6) { print i; ++i } }'

    Break

    break 用以结束循环:

    在下面的示例子中,当计算的和大于 50 的时候使用 break 结束循环:

     
    

     

    Continue

    Continue 语句用于在循环体内部结束本次循环,从而直接进入下一次循环迭代。

    下面的例子输出 1 到16 之间的偶数:

     
    

     

    Exit

    Exit 用于结束脚本程序的执行。

    该函数接受一个整数作为参数表示 AWK 进程结束状态。 如果没有提供该参数,其默认状态为 0。

    下面例子中当和大于 50 时结束 AWK 程序。

    awk 'BEGIN {
       sum = 0; for (i = 0; i < 20; ++i) {
          sum += i; if (sum > 50) exit(10); else print "Sum =", sum 
       } 
    }'

    让我们检查一下脚本执行后的返回状态:

    $ echo $?

    执行上面的命令可以得到如下的结果:

     

    (三)grep  

            grep是一种强大的文本搜索工具,用于关键字进行过滤,并把匹配到的行进行打印,特别的是他在一个或多个文件中搜索满足模式的文本行。

    语法形式:

    grep   [选项]  '关键词' 文件名

    常见的grep的选项参数:
    选项作用
    -c只输出匹配到的行数
    -i不区分大小写(只适用于单字符)
    -v显示不包匹配文本的所有行
    -w按单词搜索
    -o打印匹配关键字
    -A显示匹配行即后面多少行
    -B显示匹配行即前面多少行
    -C显示匹配行即前后多少行
    -e使用正则匹配
    -E使用扩展正则匹配
    -h查询多文件时不显示文件名
    -n显示匹配行及行号
    -s不显示不存在或无匹配文本的错误信息
    ^key以关键字开头
    ^$匹配空行

     (四)cut

             cut:剪切,切割,是一个强大文本处理工具,它是将文本按列进行划分的文本处理。cut命令逐行读入文本,按列划分字段并进行提取、输出等操作。

    语法形式:

    cut [选项] 文件名

    常见的选项参数:

    参数作用
    -f  提取范围列号,获取第几列
    -c 以字符为例以字符为单位进行分割
    -b 提取范围以字节为单位进行分割,这些字节位置将忽略多字节字符边界,除非其指定-n标志
    -d 自定义分隔符自定义分隔符,默认为制表符
    -n与“-b"选项连用,不分隔多字节字符

    提取范围说明:

    提取范围说明
    n-提取指定第n列或字符或字节后面所有数据
    n-m提取指定第n列或字符或字节到第m列字符或字节中间所有数据
    -m提取指定第m列或字符或字节前面所有数据
    n1,n2……提取枚举列的所有数据

    示范:

    (五)sed

            sed是Linux下一款功能强大的非交互流式文本编辑器,可以对文本文件进行增、删、改、查等操作,支持按行、按字段,技正则匹配文本内容,灵活方便,特别适合于大文件的
    编辑。
            sed工作原理:sed会读取每一行数据到模式空间中,判断当前行是否符合模式匹配要求,符合要求就会执行sed程序命令,否则不会执行sed程序命令,如果不写匹配模式,那么每一行都会执行sed程序命令。

    sed的使用语法:

    sed [选项参数] [模式匹配|sed程序命令]         [文件名]

    sed的常用选项:

    选项作用
    -r使用扩展正则表达式
    -e告诉sed将下一个参数解释为一个sd指令,只有当命令行上给出多个sed指令时才需要使用-e
    -f后跟保存sed指令的文件
    -i直接对内容进行修改,不加-i时默认只是预览,不会对文件做实际修改
    -n取消默认输出,sed默认会输出所有文本内容,使用-n 参数后只显示处理过的行

     

    (六)sort

            sort命令以行为单位对文本进行排序。sort将文件的每一行作为一个单位,互相比较,比较原则:从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。

     

    语法

    sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+<起始栏位>-<结束栏位>][--help][--verison][文件][-k field1[,field2]]

    参数说明

    • -b 忽略每行前面开始出的空格字符。
    • -c 检查文件是否已经按照顺序排序。
    • -d 排序时,处理英文字母、数字及空格字符外,忽略其他的字符。
    • -f 排序时,将小写字母视为大写字母。
    • -i 排序时,除了040至176之间的ASCII字符外,忽略其他的字符。
    • -m 将几个排序好的文件进行合并。
    • -M 将前面3个字母依照月份的缩写进行排序。
    • -n 依照数值的大小排序。
    • -u 意味着是唯一的(unique),输出的结果是去完重了的。
    • -o<输出文件> 将排序后的结果存入指定的文件。
    • -r 以相反的顺序来排序。
    • -t<分隔字符> 指定排序时所用的栏位分隔字符。
    • +<起始栏位>-<结束栏位> 以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。
    • --help 显示帮助。
    • --version 显示版本信息。
    • [-k field1[,field2]] 按指定的列进行排序。

    (六)tee命令

            tee命令作用把输出的一个副本输送到标准输出,另一个副本拷贝到相应的文件中。如果希望在看到输出的同时,也将其存入一个文件,那么这个命令合适不过。

    语法形式:

    tee  [参数] files 

    参数

    • -a或--append  附加到既有文件的后面,而非覆盖它.
    • -i或--ignore-interrupts  忽略中断信号。
    • --help  在线帮助。
    • --version  显示版本信息

    当执行某些命令或脚本时,如果希望把输出保存下来,tee命令非常方便。

  • 相关阅读:
    2021年JAVA 精心整理的常见面试题-附详细答案【持续更新~~】
    本质上理解C++STL的六大组件
    Kafak简单使用
    黄金眼PAAS化数据服务DIFF测试工具的建设实践
    《从0到1:HTML5+CSS3修炼之道》笔记
    商品分类,汉码批发进销存管理软件
    简单工厂模式
    css 基础语法
    关于Flask高级_Session有效期设置方法
    tecplot将一系列散点差值到模型
  • 原文地址:https://blog.csdn.net/qq_63976098/article/details/134210382