• 5-管线‘|‘常用指令(筛选、排序、tab转空格、重定向、切分文件等)


    说明:
    管线仅能处理经由前面一 个指令传来的正确信息,错误信息不能直接处理,要想处理错误信息,需要吧错误输出重定向成为标准输出
    管线命令必须能够接受来自前一个指令的数据成为输入,然后继续进行处理才可以

    常用管线命令

    指令选项不一定全,详细信息可以使用 --help 查看

    cut 截取

    切割获取行信息
    使用说明:

    # 用于有特定分隔字符,分割后下标从1开始
    cut -d'分隔字符' -f fields
    
    # 用于排列整齐的讯息
    cut -c 字符区间
    
    • 1
    • 2
    • 3
    • 4
    • 5

    选项与参数:

    -d :后面接分隔字符。与 -f 一起使用;
    -f :依据 -d 的分隔字符将一段讯息分区成为数段,用 -f 取出第几段的意思;
    -c :以字符 (characters) 的单位取出固定字符区间;
    
    • 1
    • 2
    • 3

    样例:

    # 查看PATH
    echo $PATH
    # 结果
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
    
    # 使用cut查看环境变量的第2个
    echo $PATH | cut -d ":" -f 2
    # 输出,cut下标从1开始,需要注意
    /usr/local/bin
    
    # 使用cut查看环境变量的第2-4个,左闭右开
    echo $PATH | cut -d ":" -f 2-4
    # 输出,cut下标从1开始,需要注意
    /usr/local/bin:/usr/sbin:/usr/bin
    
    # 查看第2-3的字符,下标从1开始,左闭右闭
    echo $PATH | cut -c 2-3
    # 输出
    us
    
    # 查看20到结尾的字符
    echo $PATH | cut -c 20-
    # 输出
    r/local/bin:/usr/sbin:/usr/bin:/root/bin
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    grep 过滤

    语法:

    grep [-acinv] [--color=auto] '搜寻字串' filename
    
    选项与参数:
    -a :将 binary 文件以 text 文件的方式搜寻数据
    -c :计算找到 '搜寻字串' 的次数
    -i :忽略大小写的不同,所以大小写视为相同
    -n :顺便输出行号
    -v :反向选择,亦即显示出没有 '搜寻字串' 内容的那一行!
    --color=auto :可以将找到的关键字部分加上颜色的显示喔!
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    sort 排序

    排序的字符与语系的编码有关,如果需要排序,建议先使用LANG=C 先统一语系,然后再进行排序

    语法:

    sort [-fbMnrtuk] [file or stdin]
    
    选项与参数:
    -f :忽略大小写的差异,例如 A 与 a 视为编码相同;
    -b :忽略最前面的空白字符部分;
    -d :只考虑空格和字母数字字符
    -i :仅考虑可打印字符
    -M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法; 
    -g :根据一般数值进行比较
    -n :根据字符串数值进行比较
    -h :比较人类可读的数字(例如2K 1G)
    -r :反向排序;
    -u :就是 uniq ,相同的数据中,仅出现一行代表;
    -t :分隔符号,默认是用 [tab] 键来分隔;
    -k :以那个区间 (field) 来进行排序
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    uniq 去重、计数

    去除重复的数据,但是只能去除和上一个一样的数据。

    uniq [-ic]
    
    选项与参数:
      -i :忽略大小写字符的不同; 
      -c :进行计数
    
    • 1
    • 2
    • 3
    • 4
    • 5

    注意:只能去除连续的重复,如果不连续,将不会被去重
    例如:文件t内容如下

    111
    222
    111
    222
    
    • 1
    • 2
    • 3
    • 4

    直接使用uniq 去除重复:

    cat t | uniq
    
    # 输出:
    111
    222
    111
    222
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    没有生效,如果先排序,在进行才能顺利的去除重复部分:

    # 排序
    cat t | sort
    # 排序后的结果:
    111
    111
    222
    222
    
    # 排序后去重,并且计数
    cat t | sort | uniq -c
    # 输出: 出现次数 内容
    2 111
    2 222
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    如果需要记录重复出现的个数,可以用sort结合uniq -c 一起使用,单纯去除重复,使用sort -u 就可以实现了

    wc 统计

    获取一些统计信息,例如:行数、单词数、字符数等
    用法:

    # 不加参数的时候,默认显示行数 单词数 字符数
    wc [-lwmLc]
    
    选项与参数:
    -l :仅列出行;
    -w :仅列出多少个单词(英文单字); 
    -m :多少字符;
    -L :最长的行的长度
    -c :所占字节数
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    tee 双向重定向

    tee 会同时将数据流分送到文件去与屏幕 (screen);
    而输出到屏幕的, 其实就是 stdout ,那就可以让下个指令继续处理

    # 语法:
    tee [-a] file
    
    选项与参数:
    -a :以累加 (append) 的方式,将数据加入 file 当中!若不使用 -a 则文件如果已存在,会被覆盖
    
    • 1
    • 2
    • 3
    • 4
    • 5

    tr 删除或替换某字符串

    tr 可以用来删除一段讯息当中的文字,或者是进行文字讯息的替换

    # 语法:
    tr [-ds] SET1 ...
    
    选项与参数:
    -d :删除讯息当中的 SET1 这个字串; 
    -s :取代掉重复的字符!
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    例子:

    # 文件t内容
    cat t
    # 输出
    111
    222
    
    # 将1替换为3
    cat t | tr 1 3
    # 输出
    333
    222
    
    # 删除1
    cat t | tr -d 1
    # 输出
    
    222
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    将tab转为空格

    col

    用法:

    col [-xb]
    
    选项与参数:
    -x :将 tab 键转换成对等的空白键
    
    • 1
    • 2
    • 3
    • 4

    样例用法:

    # 将test.py 中的tab转换成空格,然后输出到 new_test.py文件中
    cat test.py | col -x > new_test.py
    
    • 1
    • 2

    expand

    将文件的 tab 键转换为空格

    expand [-t] file
    
    选项与参数:
    -t :后面可以接数字。一般来说,一个 tab 按键可以用 8 个空白键取代。
        我们也可以自行定义一个 [tab] 按键代表多少个字符呢!
    
    • 1
    • 2
    • 3
    • 4
    • 5

    join 合并两个文件的数据

    用法:

    join [-ti12] file1 file2
    
    选项与参数:
    -a :完全展示某文件的内容,例如:-a 1,完全展示1的内容
    -t :指定分隔符。join 默认以空白字符分隔数据,并且比对“第一个字段”的数据,
    如果两个文件相同,则将两笔数据联成一行,且第一个字段放在第一个!
    -i :忽略大小写的差异;
    -1 :这个是数字的 1 ,代表“第一个文件要用那个字段来分析”的意思;
    -2 :代表“第二个文件要用那个字段来分析”的意思。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    例子:

    # 文件 t 的内容
    111 222
    222 aaa 
    
    # 文件 t-c 的内容
    222 333
    333 444
    
    # join 之后
    join t t-c
    # 输出
    222 aaa  333
    
    # 展示a的全部内容,并展示可以合并的内容
    join -a 1 t t-c
    # 输出
    111 222
    222 aaa  333
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    需要特别注意的是,在使用 join 之前,你所需要处理的文件应该要 事先经过排序 (sort) 处理! 否则有些比对的项目会被略过

    paste

    paste 就要比 join 简单多了!相对于 join 必须要比对两个文件的 数据相关性, paste 就直接“将两行贴在一起,且中间以 [tab] 键隔开”而已!

    paste [-d] file1 file2
    
    选项与参数:
    -d :后面可以接分隔字符。默认是以 [tab] 来分隔的!
    -  :如果 file 部分写成 - ,表示来自 standard input 的数据的意思。
    
    • 1
    • 2
    • 3
    • 4
    • 5

    split 将大文件分割

    他可以帮你将一个大文件,依据文件大小或行数来分区,就可以将大文件 分区成为小文件了!

    split [-bl] file PREFIX
    
    选项与参数:
    -b :后面可接欲分区成的文件大小,可加单位,例如 b, k, m 等;
    -l :以行数来进行分区。
    PREFIX :代表前置字符的意思,可作为分区文件的前导文字。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    例子:使用 ls -al / 输出的信息中,每十行记录成一个文件

    # 使用 ls -al / 输出的信息中,每十行记录成一个文件
    ls -al / | split -l 10 - lsroot
    
    # 统计文件信息
    wc -l lsroot*
    
    # 输出:
       10 lsrootaa
       10 lsrootab
       4 lsrootac
    24 total
    
    # 重点在那个 - 啦!一般来说,如果需要 stdout/stdin 时,但偏偏又没有文件, # 有的只是 - 时,那么那个 - 就会被当成 stdin 或 stdout。 这里就被当作标准输入了!
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    xargs 参数代换

    更过操作可以查看 man xargs
    xargs 可以读入 stdin 的数据,并且以空白字符或断行字符作 为分辨,将 stdin 的数据分隔成为 arguments 。
    因为是以空白字符作为分隔, 所以,如果有一些文件名或者是其他意义的名词内含有空白字符的时候, xargs 可能就会误判了

    xargs [-0epn] command
    
    选项与参数:
    -0 :如果输入的 stdin 含有特殊字符,例如 `, \, 空白键等等字符时,这个 -0 参数可以将他还原成一般字符。这个参数可以用于特殊状态喔!
    -e :这个是 EOF (end of file) 的意思。后面可以接一个字符串,当 xargs 分析到这个字符串就会停止继续工作!
    -p :在执行每个指令的 argument 时,都会询问使用者的意思;
    -n :后面接次数,每次 command 指令执行时,要使用几个参数的意思。 
    -I 替换字符: 在指令中对替换字符进行替换
    
    当 xargs 后面没有接任何的指令时,默认是以 echo 来进行输出喔!
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    番外

    关于减号(-)的使用

    管线命令在 bash 的连续的处理程序中是相当重要的。在管线命令当中,常常 会使用到前一个指令的 stdout 作为这次的 stdin , 某些指令需要用到文件名称 (例如 tar) 来进行处理时,该 stdin 与 stdout 可以利用减号 “-” 来替代。

    例如:

    tar -cvf - /home | tar -xvf - -C /tmp/homeback
    
    将 /home 里面的文件给他打包,但打包的数据不是 纪录到文件,而是传送到 stdout;
    经过管线后,将 tar -cvf - /home 传送给 后面的 tar -xvf - ”。
    后面的这个 - 则是取用前一个指令的 stdout, 因此, 我们就不需要使用 filename 了
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    AI创作教程之 如何在本地 PC 上运行稳定的 Diffusion 2.0 (无代码指南)
    Linux 常用命令
    2022技术趋势预测,Python、Java占主导,Rust、Go增长迅速,元宇宙成为关注焦点
    09 nginx 中 upstream max_conns 配置为 1, 导致的一部分静态资源请求成功, 一部分静态资源请求失败
    JDK19虚拟线程初探(二)
    哈希算法--MD5算法
    Flowable 外置的 HTML 表单怎么玩?
    Vue+NodeJS实现邮件发送
    Android 10 应用层如何操作设备节点/sys/devices
    ArcGIS实验教程——实验四十五:坐标直接转点、线、面案例教程(Create Features From Text File)
  • 原文地址:https://blog.csdn.net/weixin_43852058/article/details/128101345