• 七、文件的排序、合并和分割


    1 概述

    sort命令、uniq命令、join命令、cut命令、paste命令、split命令、tr命令和tar命令,能够实现对文件记录排序、统计、合并、提取、粘贴、分隔、过滤、压缩和解压等功能。

    2 sort命令

    • 定义

      sort命令将输入文件看做由多条记录组成的数据流,而记录由可变宽度的字段组成,以换行符作为定界符。

    • 说明

      1. 可将记录分成多个域进行处理,默认的域分隔符是空格符,域分隔符可由用户指定其他符号
    • 语法

      sort [选项] [输入文件]
      
      • sort命令选项及其意义

        选项 意义
        -c 测试文件是否已经被排序
        -k 指定排序的域
        -m 合并两个已排序的文件
        -n 根据数字大小进行排序
        -o [输出文件] 将输出写到指定的文件,相当于将输出重定向到指定文件
        -r 将排序结果逆向显示
        -t 改变域分隔符
        -u 去除结果中的重复行
    • sort命令的用法

      1. -t选项

        sort命令分域对文件进行排序,默认的域分隔符是空格符,-t选项可用于设置分隔符。

        sort -t: filename
        # -t与":"之间没有空格
        # sort命令默认根据第1域对数据记录进行排序,如果第1域相同,再根据第2域排序,以此类推
        # 当未指定-t时,分隔符是空格符,这时记录内开头与结尾的空格都将被忽略
        # 当用-t选项改变分隔符时,空格符变得有意义
        
      2. -k选项

        -k选项指定排序的域。

        sort命令以1表示第1域、以2表示第2域,依次类推。

        sort -t: -k3 /etc/passwd
        # -k和3之间也没有空格
        
      3. -n选项

        -n选项可以指定根据数字大小进行排序

        sort -t: -k3n /etc/passwd
        # -n选项不单独使用,一般放在域号之后
        
      4. -r选项

        -r选项用于将排序结果逆向显示

        sort -t: -k3nr /etc/passwd
        # 利用-k3n选项将/etc/passwd文件的第3域从小到大排序,然后用-r选项将结果逆向显示
        
      5. -u选项

        -u选项用于去除排序结果中的重复行

        sort -t: -u
        
      6. -o选项

        sort命令默认将排序后的结果输出到屏幕上

        sort -t: -k1n -o outfile /etc/passwd
        
      7. -c选项

        -c选项用于测试文件是否已经排好序

        sort -t: c /etc/passwd
        
      8. -m选项

        -m选项用于将两个排好序的文件合并成一个排好序的文件

        在文件合并前,他们必须已经排好序

        sort -t: m filename1 filename2
        

    3 uniq命令

    uniq命令用于去除文本文件中的重复行。

    • uniq和sort -u命令的区别
    1. uniq命令去除的重复行必须是连续重复出现的行,中间不能夹杂任何其他文本行
    2. sort -u命令则是去除所有的重复记录
    • uniq命令选线及其意义

      选项 意义
      -c 打印每行在文本中重复出现的次数
      -d 只显示有重复的记录,每个重复记录只出现一次
      -u 只显示没有重复的记录
    • 语法

      uniq -c /etc/passwd
      

    4 join命令

    • 定义

    join命令用于实现两个文件中记录的连接操作,即连接操作将两个文件中具有相同域的记录选择出来,再将这些记录所有的域放到一行(包含来自两个文件的所有域);

    join命令在对两个文件进行连接时,两个文件必须都是按照连接域排好序的,按其他域排序无效。

    • 语法

      join [选项] 文件1 文件2
      
    • join命令选项及其意义

      选项 意义
      -a1或-a2 除了显示以共同域进行连接的结果外,-a1表示还显示第1个文件中没有共同域的记录,-a2则表示显示第2个文件中没有共同域的记录
      -i 比较域内容时,忽略大小写差异
      -o 设置结果显示的格式
      -t 改变域分隔符
      -v1或-v2 与-a选项类似,但是,不显示以共同域进行连接的结果
      -1和-2 -1用于设置文件1用于连接的域,-2用于设置文件2用于连接的域
      • 说明

        1. -a和-v选项的区别在于

          -a选项显示以共同域进行连接的结果,而-v选项则不显示这些记录

        2. join命令的结果默认不显示未进行连接的记录,即默认显示连接记录在两个文件中的所有域,而且是按顺序来显示的。

        3. -o选项用于改变结果显示的格式,可指定显示哪几个域、按什么顺序显示这些域

          join -t: -o1.1 2.2 1.2 filename1 filename2
          
        4. join命令默认比较文件1和文件2的第1域,当需要通过其他域进行连接,可使用-1和-2选项,-1用于设置文件1用于连接的域,-2用于设置文件2用于连接的域

          join -t: -i -1 3-2 1 filename1 filename2
          # 以文件1的第3域和文件2的第1域进行连接,并忽略大小写
          

    5 cut命令

    • 定义

      cut命令用于从标准输入或文本文件中按域或行提取文本

    • 语法

      cut [选项] 文件
      
      • cut命令选项及其意义

        选项 意义
        -c 指定提取的字符数或字符范围
        -f 指定提取的域数或域范围
        -d 改变域分隔符
      • 示例

        cut -c3 /etc/passwd
        
        cut -c1-5 /etc/passwd
        # -c后跟数字表示字符数或字符范围,共3种表示方式
        (1) -cn表示第n个字符
        (2) -cn,m表示第n个字符和第m个字符
        (3) -cn-m表示第n个字符到第m个字符
        
        cut -d: -f1,4 /etc/passwd
        # 提取第1,4域
        
        cut -d: -f1-4 /etc/passwd
        # 提取第1~4域
        
    • 说明

      cut命令灵活提取文本文件中的内容,它默认将提取的内容放到标准输出上,如果要将提取的内容保存到文件,可以使用文件重定向来实现。

    6 paste命令

    • 定义

      paste命令用于将文本文件或标准输出中的内容粘贴到新的文件,它可以将来自不同文件的数据粘贴到一起,形成新的文件。

    • 语法

      paste [选项] 文件1 文件2
      
      • paste命令选项及其意义

        选项 意义
        -d 默认域分隔符是空格或tab键,设置新的域分隔符
        -s 将每个文件粘贴成一行
        - 从标准输入中读取数据
      • 说明

        paste命令不同于sort、join和cut命令改变域分隔符都是为了按域读取文件内容,paste命令改变域分隔符是用于设置输出文件的格式。

      • 示例

        paste -d: filename1 filename2
        

    7 split

    • 定义

      split命令用于将大文件切割成小文件,split命令可以按照文件的行数、字节数切割文件,并能在输出的多个小文件中自动加上编号

    • 语法

      split [选项] 待切割的大文件 输出的小文件
      
      • 选项及其意义

        选项 意义
        -或-l 此两个选项等价,都用于指定切割成小文件的行数
        -b 指定切割成小文件的字节
        -C 与-b选项类似,但是,切割时尽量维持每行的完整性
    • 示例

      # 每2行进行切割,输出文件的以小文件名字开头命名
      split -2 /etc/passwd
      
      --说明
      - 由于小文件有多个,split命令在小文件名后面自动加上编号以区分不同的小文件,编号为aa~zz
      - split命令所切割生成的小文件最多包含1000行记录
      
      # 按每100B切割成小文件
      split -b100 /etc/passwd
      
      --说明
      - 当split命令不指定小文件的名字时,将自动以x开头、aa~zz为编号对这些小文件进行命名
      - split命令-b选项在切割文件时仅考虑了文件大小,未考虑记录的完整性
      

    8 tr命令

    • 定义

      tr命令实现字符转换功能,其功能类似于sed命令

    • 语法

      tr [选项] 字符串1 字符串2 <输入文件
      
      • 选项及其意义

        选项 意义
        -c 选定字符串1中字符集的补集,即反选字符串1中的字符集
        -d 删除字符串1中出现的所有字符
        -s 删除所有重复出现的字符序列,只保留一个
      • 说明

        1. "<输入文件" 表示将输入文件重定向到标准输入,tr命令只能从标准输入读取数据
        2. tr命令要么将输入文件重定向到标准输入,要么从管道读入数据。
      • 示例

        tr -d a-z </etc/passwd
        # 删除/etc/passwd中所有的小写字母
        tr -d 0-9 </etc/passwd
        # 删除/etc/passwd中所有的数字
        tr -d "[
        ]" </etc/passwd
        
        • tr命令支持正则表达式的一部分以及POSIX字符类

          选项 意义 八进制方式
          a Ctrl+G 铃声 07
           Ctrl+H 退格符 10
          f Ctrl+L 走换行页 14
          Ctrl+J 换行符 12
          Ctrl+M 回车键 15
          Ctrl+I Tab键 11
        # tr -s 能将重复出现的字符串压缩为一个字符
        # 空白行可以看做该行只有一个换行符而无其他任何字符
        tr -s "[
        ]" </etc/passwd
        
        # 将所有重复的字母压缩成一个
        tr -s "[a-z],[A-Z]" </etc/passwd
        
        # tr命令加上字符串1和字符串2,将字符串1用字符串2来替换
        tr "[a-z]" "[A-Z]" </etc/passwd
        
        tr "[:lower:]" "[:upper:]" </etc/passwd
        
        # 将不在"[a-z][A-Z]"字符集内的字符替换为换行符
        # 然后-s选项将重复出现的换行符压缩成一个
        tr -cs "[a-z][A-Z]" "[12*]" </etc/passwd
        

    9 tar命令

    • 定义

      tar命令实现了Linux系统文件的压缩和解压缩

    • 语法

      tar [选项] 文件名或目录名
      
      • 选项及其意义

        选项 意义
        -c 创建新的包
        -r 为包添加新的文件
        -t 列出包内容
        -u 更新包中的文件,若包中无此文件,则将该文件添加到包中
        -x 解压缩文件
        -f 使用压缩文件或设备,该选项通常是必选的
        -v 详细报告tar处理文件的信息
        -z 用gzip压缩和解压缩文件,若加上此选项创建压缩包,那么解压缩时也需要加上此选项
      • 说明

        #gzip -d 能将tar.gz文件还原为.tar文件,gzip -d解压缩压缩文件而得到包
        gazip -d db.tar.gz
        
  • 相关阅读:
    Apache的443端口被占用解决方法
    关于变量初始化问题
    浏览无法加载控件
    关于网络数据传输
    java 对象是在什么时候创建的?
    HTML HTTP
    2020 年计划
    Docker 学习
    [腾讯 TMQ] 接口测试用例设计
    pytest + request
  • 原文地址:https://www.cnblogs.com/nuochengze/p/14417970.html
Copyright © 2020-2023  润新知