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时,可以利用“-”来代替。
本节内容就这些了, 欢迎关注我的微信公众号与我联系。