• Linux小工具(grep+cut+sort+uniq+tee+diff+patch+paste+tr)



    1. grep

    grep是一个行过滤工具,可以根据指定的关键词进行过滤
    语法:grep [选项] ‘关键字’ [文件名]

    常用选项:

    	-i: 不区分大小写
        -v: 查找不包含指定内容的行,反向选择
        -w: 按单词搜索
        -o: 打印匹配关键字
        -c: 统计匹配到的行数
        -n: 显示行号
        -r: 逐层遍历目录查找
        -A: 显示匹配行及后面多少行	
        -B: 显示匹配行及前面多少行
        -C: 显示匹配行前后多少行
        -l:只列出匹配的文件名
        -L:列出不匹配的文件名
        -e: 使用正则匹配
        -E:使用扩展正则匹配
        ^key:以关键字开头
        key$:以关键字结尾
        ^$:匹配空行
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    2. cut

    cut是截取工具,用于列的截取
    语法:cut [选项] [文件名]

    常见选项

    -c:	以字符为单位进行分割,截取
    -d:	自定义分隔符,默认为制表符\t
    -f:	与-d一起使用,指定截取哪个区域(哪一列)
    
    • 1
    • 2
    • 3

    示例

    [root@lamp tmp]# cut -d : -f1 test.txt # 以冒号分割,截取第1列内容
    
    [root@lamp tmp]# cut -d : -f2 test.txt # 以冒号分割,截取第2列内容
    
    [root@lamp tmp]# cut -d : -f1,2,4 test.txt # 以冒号分割,截取底2列和第3列的内容
    
    [root@lamp tmp]# cut -c5 test.txt # 截取每行第5个字符
    
    [root@lamp tmp]# cut -c1-5 test.txt # 截取1到5个字符
    
    [root@lamp tmp]# cut -c2-6 test.txt # 截取2到6个字符
    
    [root@lamp tmp]# cut -c6- test.txt # 截取从第6个字符往后的所有字符
    x:0:0:ROOT:/root:/bin/bash
    :1:1:bin:/bin:/sbin/nologin
    n:x:2:2:daemon:/sbin:/sbin/nologin
    :3:4:adm:/var/adm:/sbin/nologin
    4:7:lp:/var/spool/lpd:/sbin/nologin
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    3. sort

    sort工具用于排序;它将文件的每一行作为一个单位,从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。

    语法:sort [选项] [文件名]

    常用选项

    -u :去除重复行
    -r :降序排列,默认是升序
    -o : 将排序结果输出到文件中,类似重定向符号>
    -n :以数字排序,默认是按字符排序
    -t :分隔符
    -k :第N列
    -b :忽略前导空格。
    -R :随机排序,每次运行的结果均不同
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    按照用户uid升序排序

    [root@lamp tmp]# cat test.txt 
    root:x:0:0:ROOT:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    [root@lamp tmp]# sort -n -t: -k3 test.txt
    root:x:0:0:ROOT:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    排序并去重

    [root@lamp tmp]# cat file1
    444
    ddd
    aaa
    aaa
    333
    bbb
    bbb
    111
    
    [root@lamp tmp]# sort -nu file1
    ddd
    111
    333
    444
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    4. uniq

    uniq用于去除重复的行

    语法:uniq [选项] [文件名]

    常用选项

    -i: 忽略大小写
    -c: 统计重复行次数
    -d:只显示重复行
    
    • 1
    • 2
    • 3
    [root@lamp tmp]# cat file1 # 统计重复行次数
    444
    ddd
    aaa
    aaa
    333
    bbb
    bbb
    111
    
    [root@lamp tmp]# uniq -c file1 # 只显示重复行
          1 444
          1 ddd
          2 aaa
          1 333
          2 bbb
          1 111
          1 
    [root@lamp tmp]# uniq -cd file1
          2 aaa
          2 bbb
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    5. tee

    tee工具是从标准输入读取并写入到标准输出和文件
    即:双向覆盖重定向(屏幕输出|文本输入)

    常用选项

    -a: 双向追加重定向
    
    
    • 1
    • 2
    [root@lamp tmp]# echo hello | tee file1
    hello
    [root@lamp tmp]# cat file1
    hello
    [root@lamp tmp]# echo 999|tee -a file1
    999
    [root@lamp tmp]# cat file1
    hello
    999
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    6. diff

    diff工具用于逐行比较文件的不同
    注意:diff描述两个文件不同的方式是告诉我们怎样改变第一个文件之后与第二个文件匹配

    语法:diff [选项] [文件1] [文件2]

    常用选项

    -b:不检查空格
    -B:不检查空白行
    -i:不检查大小写
    -w:忽略所有的空格
    --normal:正常格式显示(默认)
    -c:上下文格式显示
    -u:合并格式显示
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    比较两个普通文件异同,文件准备

    [root@lamp tmp]# cat file1
    aaaa
    111
    hello world
    222
    333
    bbb
    [root@lamp tmp]# cat file2
    aa
    hello
    111
    222
    bbb
    333
    world
    [root@lamp tmp]# 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    1)正常显示

    [root@lamp tmp]# clear
    [root@lamp tmp]# diff file1 file2
    1c1,2 # 第一个文件的第1行需要改变(c=change)才能和第二个文件的第1到2行匹配	
    < aaaa # 小于号"<"表示左边文件(file1)文件内容
    --- # ---表示分隔符
    > aa  # 大于号">"表示右边文件(file2)文件内容
    > hello
    3d3 # 第一个文件的第3行删除(d=delete)后才能和第二个文件的第3行匹配
    < hello world
    5d4 # 第一个文件的第5行删除后才能和第二个文件的第4行匹配
    < 333
    6a6,7 # 第一个文件的第6行增加(a=add)内容后才能和第二个文件的第6到7行匹配
    > 333 # 需要增加的内容在第二个文件里是333和world
    > world
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    2)上下文格式显示

    [root@lamp tmp]# diff -c file1 file2
     # 前两行主要列出需要比较的文件名和文件的时间戳;文件名前面的符号***表示file1,---表示
    *** file1	2022-07-26 21:48:45.771150441 +0800
    --- file2	2022-07-26 21:48:56.349150967 +0800
    ***************
    *** 1,6 **** # 以***开头表示file1文件,1,6表示1到6行
    ! aaaa # !表示该行需要修改才与第二个文件匹配
      111
    - hello world # -表示需要删除该行才与第二个文件匹配
      222
    - 333 # -表示需要删除该行才与第二个文件匹配
      bbb
    --- 1,7 ---- # 以---开头表示file2文件,1,7表示1到7行
    ! aa # 表示第一个文件需要修改才与第二个文件匹配
    ! hello # 表示第一个文件需要修改才与第二个文件匹配
      111
      222
      bbb
    + 333 # 表示第一个文件需要加上该行才与第二个文件匹配
    + world
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    3)合并格式显示

    [root@lamp tmp]# diff -u file1 file2
    前两行主要列出需要比较的文件名和文件的时间戳;文件名前面的符号---表示file1,+++表示file2
    --- file1	2022-07-26 21:48:45.771150441 +0800
    +++ file2	2022-07-26 21:48:56.349150967 +0800
    @@ -1,6 +1,7 @@
    -aaaa
    +aa
    +hello
     111
    -hello world
     222
    -333
     bbb
    +333
    +world
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    4)比较两个目录不同

    # 默认情况下也会比较两个目录里相同文件的内容
    [root@lamp tmp]# cat dir1/file1
    aaaa
    111
    hello world
    222
    333
    bbb
    [root@lamp tmp]# cat dir2/file1
    test
    
    [root@lamp tmp]# diff dir1 dir2
    diff dir1/file1 dir2/file1
    1,6c1
    < aaaa
    < 111
    < hello world
    < 222
    < 333
    < bbb
    ---
    > test
    # 如果只需要比较两个目录里文件的不同,不需要进一步比较文件内容,需要加-q选项
    [root@lamp tmp]# diff -q dir1 dir2
    Files dir1/file1 and dir2/file1 differ
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    5)小技巧(patch)

    有时候我们需要以一个文件为标准,去修改其他文件,并且修改的地方较多时,我们可以通过打补丁的方式完成。

    [root@lamp tmp]# cat file1
    aaaa
    111
    hello world
    222
    333
    bbb
    [root@lamp tmp]# cat file2
    aa
    hello
    111
    222
    bbb
    333
    world
    # 先找出文件不同,然后输出到一个文件
    [root@lamp tmp]# diff -uN file1 file2 > file.patch
    -u:上下文模式
    -N:将不存在的文件当作空文件
    2)将不同内容打补丁到文件
    [root@lamp tmp]# patch file1 file.patch
    patching file file1
    # 测试验证
    [root@lamp tmp]# diff file1 file2
    [root@lamp tmp]# cat file1
    aa
    hello
    111
    222
    bbb
    333
    world
    [root@lamp tmp]# cat file2
    aa
    hello
    111
    222
    bbb
    333
    world
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    7. paste

    paste工具用于合并文件行

    常用选项

    -d:自定义间隔符,默认是tab
    -s:串行处理,非并行
    
    • 1
    • 2
    [root@lamp tmp]# cat test1
    aaa
    bbb 111
    222
    [root@lamp tmp]# cat test2
    hello world
    [root@lamp tmp]# paste test1 test2
    aaa	hello world
    bbb 111	
    222	
    [root@lamp tmp]# paste -d : test1 test2
    aaa:hello world
    bbb 111:
    222:
    [root@lamp tmp]# paste -d : -s test1 test2
    aaa:bbb 111:222
    hello world
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    8. tr工具

    tr用于字符转换,替换和删除;主要用于删除文件中控制字符或进行字符转换

    用法

    用法1:命令的执行结果交给tr处理,其中string1用于查询,string2用于转换处理
    # [命令]|tr  'string1'  'string2'
    用法2:tr处理的内容来自文件,记住要使用"<"标准输入
    # tr  'string1'  'string2' < [文件]
    
    用法3:匹配string1进行相应操作,如删除操作
    # tr [选项]'string1' < filename
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    常用选项

    -d 删除字符串1中所有输入字符。
    -s 删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串
    
    • 1
    • 2
    [root@lamp tmp]# cat tmp.txt # 测试使用
    root:x:0:0:ROOT:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/ROOT:/sbin/nologin
    112345
    aabvd
    
    
    123445 aabccde
    hello	world
    
    ====================================分割线=======================================
    
    # tr -d '[:/]' < tmp.txt 删除文件中的 :和 /
    # cat tmp.txt | tr -d '[:/]' 删除文件中的 :和 /
    # tr '[0-9]' '@' < tmp.txt 将文件中的数字替换成@符号
    # tr '[a-z]' '[A-Z]' < tmp.txt 将文件中的小写字符替换成大写字母
    # tr -s '[a-z]' < tmp.txt 匹配小写字母,把连续相同的小写字母压缩成一个
    # tr -s '[a-z0-9]' < tmp.txt 匹配小写字母和数字并将连续重复的替换成一个
    # tr -d '[:digit:]' < tmp.txt 删除文件中的数字
    # tr -d '[:blank:]' < tmp.txt 删除水平空白(空格、\t)
    # tr -d '[:space:]' < tmp.txt 删除所有水平和垂直空白(换行、空格、\t)
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
  • 相关阅读:
    利用云服务器搭配宝塔面板解禁网易云
    Java线程池ThreadPoolExecutor详解(一篇就够了)
    Bootstrap Blazor Table 组件(四)自定义列生成
    Tilemap瓦片资源
    gitlab 合并分支
    PyQt中QFrame窗口中的组件不显示的原因
    从数据的crud开始讲起,回顾一下Buffer Pool在数据库里的地位
    华为appgallery上架
    centos7.x本地挂载阿里云oss
    回归测试选择用例,看这里就可以了。
  • 原文地址:https://blog.csdn.net/weixin_53946852/article/details/126002558