1.6管线命令(pipe)

1.6 管线命令(pipe)

1.6.1 管线命令的符号

管线命令使用“|”符号,pipe只是他的英文。
管线命令“|”仅能处理经由前一条指令STDIN传来的STDOUT信息,不能处理STDERR信息。
但是它具体是个啥,我暂时还不清楚,那就继续向下看吧。

1.6.2 截取命令:cut、grep

  • cut,即切,是帮助我们将一段信息中我们需要的部分直接切出来。使用规则如下:

    [haoqiqi@localhost ~]$ cut -d'分隔字符' -f fields
    [haoqiqi@localhost ~]$ cut -c字符区间
    # -d与-f结合使用。-d的分隔字符表示利用此字符将一段信息分成几段,然后使用-f取出第几段
    # -c表示以字符(characters)为单位取出固定字符区间
    

    举例如下:

    [haoqiqi@localhost ~]$ echo ${PATH}
    /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/haoqiqi/.local/bin:/home/haoqiqi/bin
    [haoqiqi@localhost ~]$ echo ${PATH} | cut -d ':' -f 3
    /usr/bin
    [haoqiqi@localhost ~]$ echo ${PATH} | cut -c 3
    s
    [haoqiqi@localhost ~]$ echo ${PATH} | cut -c 3-7
    sr/lo
    
  • grep的作用是分析一行信息,若有我们需要的,则将它取出来。使用规则如下:

    [haoqiqi@localhost ~]$ grep [-acinv][--color=auto]'搜寻字符串'filename
    # -a:将binary文件以text文件的方式搜寻数据
    # -c:计算找到‘搜索字符串’的次数
    # -i:忽略大小写的不同
    # -n:输出行号
    # -v:反向选择,即显示出没有搜寻字符串的行
    # --color=auto:将找到的关键词加上颜色显示
    

    举例如下:

    [haoqiqi@localhost ~]$ echo last | grep 'root'
    [haoqiqi@localhost ~]$ echo last | grep -v 'root'
    last
    [haoqiqi@localhost ~]$ grep --color=auto 'MANPATH' /etc/man_db.conf
    # 取出/etc/man_db.conf文件中含有MANPATH的行
    # 由于贴代码不能显示颜色,因此把图片贴出来
    

    在这里插入图片描述

1.6.3 排序命令:sort、wc、uniq

  • sort命令主要用来根据不同的数据型态排序,此外,排序的字符与语系的编码也有关系。其使用规则如下:

    [haoqiqi@localhost ~]$ sort [-fbMnrtuk][file or stdin]
    # -f:忽略大小写差异
    # -b:忽略最前面的空格符
    # -M:以月份的名字排序
    # -n:使用“纯数字”进行排序(默认文字排序)
    # -r:反向排序
    # -u:即uniq,对于相同的数据,只出现一行代表
    # -t:分隔符,预设使用“Tab”分隔
    # -k:以区间(field)排序
    

    举例如下:

    [haoqiqi@localhost ~]$ cat /etc/passwd | sort
    abrt:x:173:173::/etc/abrt:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
    bin:x:1:1:bin:/bin:/sbin/nologin
    chrony:x:994:991::/var/lib/chrony:/sbin/nologin
    colord:x:997:995:User for colord:/var/lib/colord:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    # 可以看到,它将信息按照字面的顺序进行了排序
    
  • uniq指令的作用是将重复的资料仅列出一个显示。使用规则如下:

    [haoqiqi@localhost ~]$ uniq [-ic]
    # -i:忽略字符大小写
    # -c:计数
    

    举例如下:

    [haoqiqi@localhost ~]$ last |cut -d ' ' -f1|sort|uniq -c
      1 
     40 haoqiqi
      5 reboot
      1 wtmp
    # 这段代码段的意思为:
    # 使用last将账号列出,仅取出账号栏,进行排序,
    # 仅取出最后一位,并记录每个账号的登录次数
    
  • wc指令是用来统计文件中的字符信息,其使用规则如下:

    [haoqiqi@localhost ~]$ wc [-lwm]
    -l:仅列出行
    -w:仅列出多少字
    -m:列出有多少字符
    

    举例如下:

    [haoqiqi@localhost ~]$ cat /etc/man_db.conf|wc
    131     723    5171
    # 此段代码的含义为:
    # 统计man_db.conf文件里的行、字数、字符数
    

1.6.4 双向重向导:tee

tee的作用是包含了">"的作用,能够同时将数据流STDOUT分去屏幕与文件。其使用规则如下:

[haoqiqi@localhost ~]$ tee [-a]file
# -a:以累加(append)的方式,将数据加入file中。
# 若不加此参数,则表示以覆盖的方式将数据加入file。

举例如下:

[haoqiqi@localhost ~]$ ls -l /home |tee ~/homefile |more
总用量 4
drwx------. 17 haoqiqi haoqiqi 4096 10月 10 21:15 haoqiqi
# 此段代码的作用是:
# 将last的输出存一份到last.list文件中,同时输出至屏幕

1.6.5 字符转换命令:tr、col、join、paste、expand

  • tr用来删除或替换一段信息中的文字,其使用规则如下:

    [haoqiqi@localhost ~]$ tr [-ds]SET1...
    # -d:删除信息中SET1字符串
    # -s:取代重复的字符串
    

    举例如下:

    [haoqiqi@localhost ~]$ echo ${PATH}
    /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/haoqiqi/.local/bin:/home/haoqiqi/bin
    [haoqiqi@localhost ~]$ echo ${PATH} |tr -d ':'
    /usr/local/bin/usr/local/sbin/usr/bin/usr/sbin/bin/sbin/home/haoqiqi/.local/bin/home/haoqiqi/bin
    [haoqiqi@localhost ~]$ echo ${PATH} |tr -s '[sbin]' '[SBIN]'
    /uSr/local/BIN:/uSr/local/SBIN:/uSr/BIN:/uSr/SBIN:/BIN:/SBIN:/home/haoqIqI/.local/BIN:/home/haoqIqI/BIN
    # 注意:使用tr -s时,他会按照字符来进行替换,而不是整个的字符串,使用时应注意。
    
  • col常用来将tab键转换为空格,但还有其他作用。举例如下:

    [haoqiqi@localhost ~]$ cat -A /etc/man_db.conf
    MANDATORY_MANPATH^I^I^I/usr/man$
    MANDATORY_MANPATH^I^I^I/usr/share/man$
    MANDATORY_MANPATH^I^I^I/usr/local/share/man$
    [haoqiqi@localhost ~]$ cat /etc/man_db.conf | col -x |cat -A | more
    MANDATORY_MANPATH                       /usr/man$
    MANDATORY_MANPATH                       /usr/share/man$
    MANDATORY_MANPATH                       /usr/local/share/ma
    # 上面的^I即是tab键,col -x会将其转化为空格
    
  • join可以将两个文件当中,有“相同数据”的一行加在一起,使用规则如下:

    [haoqiqi@localhost ~]$ join [-til2] file1 file2
    # -t:join默认以空格符分隔数据,并且对比“第一个字段”的数据。
    #    如果两个文件相同,则将两组数据连成一行,且第一个字放在首位。
    # -i:忽略大小写差异。
    # -1:代表“第一个文件要用的字段”
    # -2:代表“第二个文件要用的字段”
    
  • paste的使用比join简单。paste的作用是将两行连在一起,且中间用tab键隔开。使用规则如下:

    [haoqiqi@localhost ~]$ paste [-d] file1 file2
    # -d:后面接分隔字符。预设按tab分隔
    # - :若file部分为- ,则表示来着STDIN
    

    举例如下:

    [haoqiqi@localhost ~]$ paste /etc/passwd /etc/shadow
    paste: /etc/shadow: 权限不够
    # 在这里,我原本想将/etc/passwd与/etc/shadow连在同一行,却被提示权限不够,因此需要使用root账号进行操作。
    
    [haoqiqi@localhost ~]$ su
    密码:
    [root@localhost haoqiqi]# paste /etc/passwd /etc/shadow
    root:x:0:0:root:/root:/bin/bash	root:$6$Y30Ke7mUR36pEVYj$OLYfD96BDKGkf0wFvjx8EsS3zigSPwItnJAyOfD8tn1RtZxDLdeuSCQ9qmotxg9a8uc4mzm.bE6alZxjimTI6.::0:99999:7:::
    bin:x:1:1:bin:/bin:/sbin/nologin	bin:*:17834:0:99999:7:::
    daemon:x:2:2:daemon:/sbin:/sbin/nologin	daemon:*:17834:0:99999:7:::
    adm:x:3:4:adm:/var/adm:/sbin/nologin	adm:*:17834:0:99999:7:::
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin	lp:*:17834:0:99999:7:::
    # 使用了root之后,此时会发现每行中都会有两套语句了。且中间以tab键进行分隔。
    
    [root@localhost haoqiqi]# exit
    exit
    [haoqiqi@localhost ~]$ 
    # 使用exit指令,则将从root账户返回普通账户
    
  • expand的作用是将tab转成空格,类比于col,但是功能没有col多。

# 将/etc/man_db.conf内行首为MANPATH的字样取出,仅取前三行,行首标志为^
[haoqiqi@localhost ~]$ grep '^MANPATH' /etc/man_db.conf | head -n 3
MANPATH_MAP	/bin			/usr/share/man
MANPATH_MAP	/usr/bin		/usr/share/man
MANPATH_MAP	/sbin			/usr/share/man
# 将所有的符号都列出来
[haoqiqi@localhost ~]$ grep '^MANPATH' /etc/man_db.conf | head -n 3 | cat -A
MANPATH_MAP^I/bin^I^I^I/usr/share/man$
MANPATH_MAP^I/usr/bin^I^I/usr/share/man$
MANPATH_MAP^I/sbin^I^I^I/usr/share/man$
# 将tab键设定成8个字符
[haoqiqi@localhost ~]$ grep '^MANPATH' /etc/man_db.conf | head -n 3 | expand -t 8| cat -A
MANPATH_MAP     /bin                    /usr/share/man$
MANPATH_MAP     /usr/bin                /usr/share/man$
MANPATH_MAP     /sbin                   /usr/share/man$

1.6.6 分区命令:spilt

spild可以将大文件进行分区成为小文件,使用规则如下:

[haoqiqi@localhost ~]$ split [-bl] file PREFIX
# -b:接区分后的文件大小,可加单位,b、k、m等
# -l:以行数来区分
# PREFIX:代表前导符,可视为分区文件的前导文字

举例如下:

[haoqiqi@localhost tmp]$ cd /tmp; split -b 300k /etc/services services
[haoqiqi@localhost tmp]$ ll -k services*
-rw-rw-r--. 1 haoqiqi haoqiqi 307200 10月 11 10:27 servicesaa
-rw-rw-r--. 1 haoqiqi haoqiqi 307200 10月 11 10:27 servicesab
-rw-rw-r--. 1 haoqiqi haoqiqi  55893 10月 11 10:27 servicesac
# 此段代码的意思为将/etc/services文件分区为300k的文件,*后为分区文件后缀。
[haoqiqi@localhost tmp]$ cat services* > services
# 将之前分区的文件进行合并,命名为services

1.6.7 参数代换:xargs

从表面上看,args为arguments(参数)的意思。xargs的作用是产生某个指令的参数。xargs可以读入stdin的数据,并按照空格或换行进行分辨,将stdin的资料分为arguments。使用规则如下:

[haoqiqi@localhost tmp]$ xargs [-Open]command
# -0:将stdin中的特殊字符还原成一般字符
# -e:即EOF(end od file)。后面可加字符串,当xargs分析到此字符串时,停止工作。
# -p:在执行每个指令的argument时,都会询问使用者
# -n:后面接次数,每次使用command时,要使用几个参数
# 当xargs后没有加任何指令时,默认echop输出

举例如下:

[haoqiqi@localhost tmp]$ cut -d ':' -f 1 /etc/passwd |head -n 3 |xargs -n 1 id
uid=0(root) gid=0(root)=0(root)
uid=1(bin) gid=1(bin)=1(bin)
uid=2(daemon) gid=2(daemon)=2(daemon)
# 将/etc/passwd的第一栏前三行取出,使用id将其打印出来

xargs可以将不支持管线命令的指令使用stdin输出信息。

[haoqiqi@localhost tmp]$ find /usr/sbin -perm /700 |xargs ls -l
-rwxr-xr-x. 1 root root       11232 8月  13 05:18 /usr/sbin/abrt-auto-reporting
-rwxr-xr-x. 1 root root       32424 8月  13 05:18 /usr/sbin/abrt-configuration
-rwxr-xr-x. 1 root root       31976 8月  13 05:18 /usr/sbin/abrtd
-rwxr-xr-x. 1 root root       31968 8月  13 05:18 /usr/sbin/abrt-dbus
-rwxr-xr-x. 1 root root        1347 8月  13 05:18 /usr/sbin/abrt-harvest-pstoreoops
# 找出/usr/sbin下具有特殊权限的文档名,使用ls -l列出详细属性

1.6.8 减号“-”的用途

在管线命令中,当使用到前一个指令的stdout作为本次的stdin时,可以利用“-”来代替。

本节内容就这些了, 欢迎关注我的微信公众号与我联系。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值