Linux 中的管道命令

在 Linux 中,如果我们想要查看某个目录下是否存在一个特定的文件,我们很有可能会用到 ll 或 ls 命令,如果该目录下的文件数量较少还好,如果很多的话,一个一个找就会花费很多时间。此时我们通常会选择使用管道命令。

什么是管道

我们可以将管道命令类比为水管,水流从自来水厂到居民楼家中中间经过了层层分流,分流的过程就是管道的作用,因为用户使用的水流只需要满足正常使用就可以了,不需要像消防水管一样。而管道命令也可以对数据进行分流和筛选,这就是 Linux 中管道的直观理解。

管道命令使用

  • 管道命令使用的符号为 |。
  • 管道命令能且仅能够处理经由前边一个命令传来的正确信息,也就是说只能够处理标准输出。
  • 在每个管道符号后边接的第一个参数一定是命令,并且该命令必须能够接受标准输入。

例如将 ls 的标准输出内容利用 cat 命令导入到文件 dirinfo 中:

wood@ubuntu:/tmp/test$ ls | cat > dirinfo
wood@ubuntu:/tmp/test$ ls
dirinfo  filea  fileb  filec  filed  filee  filef
wood@ubuntu:/tmp/test$ cat dirinfo 
dirinfo
filea
fileb
filec
filed
filee
filef

选取命令

cut

cut 命令可以将同一行中的数据进行分解,可以用来分析数据。

cut -d'delimiter' -f fields
cut -c'character interval'

上边的选项为:

-d后接分隔字符,与 -f 一起使用
-f根据 -d 后的分隔字符将一段信息划分为数段,用 -f 取出第几段
-c以字符为单位取出固定字符区间
wood@ubuntu:/tmp/test$ cat filea
aaa bbb ccc ddd eee fff ggg
wood@ubuntu:/tmp/test$ cat filea | cut -d ' ' -f 2
bbb
wood@ubuntu:/tmp/test$ cat fileb
aaa
bbb
ccc
ddd
eee
fff
ggg
wood@ubuntu:/tmp/test$ cat fileb | cut -c 3-
a
b
c
d
e
f
g

需要注意的是,cut 处理数据是按照行进行处理的。

grep

grep 命令很多情况下用来从输出的信息中搜索我们想要的信息,和 cut 命令一样,该命令也是按行进行处理的。

grep [-acinv] [--color=auto] 'string for search' filename

上边的选项为:

-a将二进制文件以文本方式查找数据
-c

计算找到 ‘string of search’ 的次数

-i忽略大小写
-n输出行号
-v反向选择
--color=auto将找到的关键字部分加上颜色显示
wood@ubuntu:/tmp/test$ ll
total 16
drwxrwxr-x  2 wood wood 4096 Apr  6 11:48 ./
drwxrwxrwt 15 root root 4096 Apr  6 11:41 ../
-rw-rw-r--  1 wood wood   28 Apr  6 11:42 filea
-rw-rw-r--  1 wood wood   28 Apr  6 11:48 fileb
-rw-rw-r--  1 wood wood    0 Apr  6 11:23 filec
-rw-rw-r--  1 wood wood    0 Apr  6 11:23 filed
-rw-rw-r--  1 wood wood    0 Apr  6 11:23 filee
-rw-rw-r--  1 wood wood    0 Apr  6 11:23 filef
wood@ubuntu:/tmp/test$ ll | grep filea
-rw-rw-r--  1 wood wood   28 Apr  6 11:42 filea

排序命令

如果要对获得的信息进行排序和统计操作,就需要使用排序命令。

sort

sort [-fbMnrtuk] [file or stdin]

上边的选项为:

-f忽略大小写
-b忽略最前边的空格字符
-M以月份排序
-n使用纯数字排序,默认排序方式
-r反向排序
-u相同数据只出现一次
-t分隔符号,默认为 Tab
-k排序区间
wood@ubuntu:/tmp/test$ ls | sort
filea
fileb
filec
filed
filee
filef
wood@ubuntu:/tmp/test$ ls | sort -r
filef
filee
filed
filec
fileb
filea
wood@ubuntu:/tmp/test$ ll | sort -k 5 -n
-rw-rw-r--  1 wood wood    0 Apr  6 11:23 filec
-rw-rw-r--  1 wood wood    0 Apr  6 11:23 filed
-rw-rw-r--  1 wood wood    0 Apr  6 11:23 filee
-rw-rw-r--  1 wood wood    0 Apr  6 11:23 filef
total 16
-rw-rw-r--  1 wood wood   28 Apr  6 11:42 filea
-rw-rw-r--  1 wood wood   28 Apr  6 11:48 fileb
drwxrwxrwt 15 root root 4096 Apr  6 12:06 ../
drwxrwxr-x  2 wood wood 4096 Apr  6 11:48 ./

uniq

uniq 命令可以将重复的项目只显示一次。

uniq [-ic]

上边的选项为:

-i忽略大小写
-c进行计数
wood@ubuntu:/tmp/test$ ls
filea  fileb  filec  filed  filee  filef
FILEA  FILEB  FILEC  FILED  FILEE  FILEF
wood@ubuntu:/tmp/test$ ls | uniq -i
filea
fileb
filec
filed
filee
filef

wc

wc 命令能够计算输出信息的整体数据。

wc [-lwm]

上边的选项为:

-l仅列出行
-w仅列出多少字(EN)
-m多少字符
wood@ubuntu:/tmp/test$ ll
total 16
drwxrwxr-x  2 wood wood 4096 Apr  6 12:16 ./
drwxrwxrwt 15 root root 4096 Apr  6 12:17 ../
-rw-rw-r--  1 wood wood   28 Apr  6 11:42 filea
-rw-rw-r--  1 wood wood    0 Apr  6 12:16 FILEA
-rw-rw-r--  1 wood wood   28 Apr  6 11:48 fileb
-rw-rw-r--  1 wood wood    0 Apr  6 12:16 FILEB
-rw-rw-r--  1 wood wood    0 Apr  6 11:23 filec
-rw-rw-r--  1 wood wood    0 Apr  6 12:16 FILEC
-rw-rw-r--  1 wood wood    0 Apr  6 11:23 filed
-rw-rw-r--  1 wood wood    0 Apr  6 12:16 FILED
-rw-rw-r--  1 wood wood    0 Apr  6 11:23 filee
-rw-rw-r--  1 wood wood    0 Apr  6 12:16 FILEE
-rw-rw-r--  1 wood wood    0 Apr  6 11:23 filef
-rw-rw-r--  1 wood wood    0 Apr  6 12:16 FILEF
wood@ubuntu:/tmp/test$ ll | wc
     15     128     676
wood@ubuntu:/tmp/test$ ll | wc -l
15
wood@ubuntu:/tmp/test$ ll | wc -w
128
wood@ubuntu:/tmp/test$ ll | wc -m
676

双向重定向

tee

我们之前提到 Linux 中存在数据流重定向,能够将原本输出到屏幕上的信息重定向到文件或设备中,只是此时屏幕上原本要显示的信息就不会再显示,但是如果我们想要将输出的信息备份到文件中,并且仍然在屏幕输出就需要 tee 命令进行双向重定向。

tee [-a] filename

上边的参数 -a 表示以累加的方式进行重定向。

wood@ubuntu:/tmp/test$ ls
filea  fileb  filec  filed  filee  filef
wood@ubuntu:/tmp/test$ ls | tee dirfile
filea
fileb
filec
filed
filee
filef
wood@ubuntu:/tmp/test$ cat dirfile 
filea
fileb
filec
filed
filee
filef

字符转换命令

tr

tr 命令可以对信息进行修改。

tr [-ds] string ...

上边的选项中:

-d删除信息当中的 string
-s替换掉信息当中的 string
wood@ubuntu:/tmp/test$ ls
dirfile  filea  fileb  filec  filed  filee  filef
wood@ubuntu:/tmp/test$ ls | tr -d 'file'
dr
a
b
c
d


wood@ubuntu:/tmp/test$ ls
dirfile  filea  fileb  filec  filed  filee  filef
wood@ubuntu:/tmp/test$ ls | tr -s '[a-z]' '[A-Z]'
DIRFILE
FILEA
FILEB
FILEC
FILED
FILE
FILEF
wood@ubuntu:/tmp/test$ ls
dirfile  filea  fileb  filec  filed  filee  filef

在该命令中的 -d 选项中,去除掉的是设定 string 中的字符,而不是字符串。同样该命令只是改变显示的信息,而不是源文件的属性。

col

col 可以用来将 tab 键转换为对等的空格键。

col [-xb]

 上式中的 -x 属性可以将 tab 键转换为对等的空格键。

wood@ubuntu:/tmp/test$ cat -A filea
^Iaaa$
^Ibbb$
^Iccc$
^Iddd$
^Ieee$
^Ifff$
wood@ubuntu:/tmp/test$ cat filea | col -x | cat -A
        aaa$
        bbb$
        ccc$
        ddd$
        eee$
        fff$

还有一点是管道命令只是对标准输出的操作,因此管道命令只是对显示出来的信息进行操作,将下边的显示结果与上边的对比:

wood@ubuntu:/tmp/test$ cat -A filea
^Iaaa$
^Ibbb$
^Iccc$
^Iddd$
^Ieee$
^Ifff$
wood@ubuntu:/tmp/test$ cat -A filea | col -x | cat -A
^Iaaa$$
^Ibbb$$
^Iccc$$
^Iddd$$
^Ieee$$
^Ifff$$

join

join 命令能够处理两个文件之间的数据。

join [-ti12] file1 file2

上边的选项中:

-t

join 默认以空格字符分隔数据,并且比对第一个栏位的数据

如果两个文件相同,则将两条数据连成一行,且第一个栏位放在第一位

-i忽略大小写
-1数字1,表示第一个文件要用哪个栏位来分析
-2数组2,表示第二个文件要用哪个栏位来分析

在 join 命令使用过程中,只有当两个文件中存在相同数据的行时,才能够将之相加。

wood@ubuntu:/tmp/test$ cat filea
aaa bbb ccc ddd eee fff
bbb ccc ddd eee fff ggg
ccc ddd eee fff ggg hhh
ddd eee fff ggg hhh iii
eee fff ggg hhh iii jjj
fff ggg hhh iii jjj kkk
wood@ubuntu:/tmp/test$ cat fileb
aaa bbb ccc *** ddd eee fff
bbb ccc ddd *** eee fff ggg
ccc ddd eee *** fff ggg hhh
xxx eee fff *** ggg hhh iii
eee fff ggg *** hhh iii jjj
fff ggg hhh *** iii jjj kkk
wood@ubuntu:/tmp/test$ join -1 1 filea -2 1  fileb
aaa bbb ccc ddd eee fff bbb ccc *** ddd eee fff
bbb ccc ddd eee fff ggg ccc ddd *** eee fff ggg
ccc ddd eee fff ggg hhh ddd eee *** fff ggg hhh
join: fileb:5: is not sorted: eee fff ggg *** hhh iii jjj

从上边的示例也可以看出,join 命令作用的文件栏位应该之前就确认过,才能保证命令正常运行。

paste

join 命令需要比对每一行数据的一致性,但是 paste 命令可以直接将两行粘贴在一块,且中间用 tab 键隔开。

paste [-d] file1 file2

上边的选项为:

-d后面可以接分隔符,默认 Tab
-如果 file 部分写作 -,表示来自标准输入的数据
wood@ubuntu:/tmp/test$ cat filea
aaa bbb ccc ddd eee fff
bbb ccc ddd eee fff ggg
ccc ddd eee fff ggg hhh
ddd eee fff ggg hhh iii
eee fff ggg hhh iii jjj
fff ggg hhh iii jjj kkk
wood@ubuntu:/tmp/test$ cat fileb
aaa bbb ccc *** ddd eee fff
bbb ccc ddd *** eee fff ggg
ccc ddd eee *** fff ggg hhh
xxx eee fff *** ggg hhh iii
eee fff ggg *** hhh iii jjj
fff ggg hhh *** iii jjj kkk
wood@ubuntu:/tmp/test$ paste filea fileb
aaa bbb ccc ddd eee fff	aaa bbb ccc *** ddd eee fff
bbb ccc ddd eee fff ggg	bbb ccc ddd *** eee fff ggg
ccc ddd eee fff ggg hhh	ccc ddd eee *** fff ggg hhh
ddd eee fff ggg hhh iii	xxx eee fff *** ggg hhh iii
eee fff ggg hhh iii jjj	eee fff ggg *** hhh iii jjj
fff ggg hhh iii jjj kkk	fff ggg hhh *** iii jjj kkk

expand

该命令可以将 Tab 键转成空格。

expand [-t] file

上边的选项为:

-t后面可接数字,一般来说一个 Tab 按键可以用 8 个空格键替换,也可以自定义一个 Tab 按键代表多少个字符
wood@ubuntu:/tmp/test$ cat -A filec
^Iaaa$
^Ibbb$
^Iccc$
^Iddd$
^Ieee$
^Ifff$
wood@ubuntu:/tmp/test$ cat filec | expand -t 6 | cat -A
      aaa$
      bbb$
      ccc$
      ddd$
      eee$
      fff$
wood@ubuntu:/tmp/test$ cat filec | cat -A
^Iaaa$
^Ibbb$
^Iccc$
^Iddd$
^Ieee$
^Ifff$

划分命令

split

命令 split 能够将大文件划分成小文件。

split [-bl] file PREFIX

上边的选项为:

-b后面可接想要划分成的文件大小,可加单位,如b,k,m等
-l以行数来进行划分
PREFIX代表前缀字符的意思,可作为划分文件的前缀文字
wood@ubuntu:/tmp/test$ ll
total 32
drwxrwxr-x  2 wood wood  4096 Apr  6 18:48 ./
drwxrwxrwt 15 root root  4096 Apr  6 18:47 ../
-rw-rw-r--  1 wood wood   144 Apr  6 15:56 filea
-rw-rw-r--  1 wood wood   168 Apr  6 16:02 fileb
-rw-rw-r--  1 wood wood    30 Apr  6 17:59 filec
-rw-rw-r--  1 wood wood     0 Apr  6 11:23 filed
-rw-rw-r--  1 wood wood     0 Apr  6 11:23 filee
-rw-rw-r--  1 wood wood     0 Apr  6 11:23 filef
-rw-rw-r--  1 wood wood 10268 Apr  6 18:47 image
wood@ubuntu:/tmp/test$ split -b 1k ./image fig
wood@ubuntu:/tmp/test$ ll
total 76
drwxrwxr-x  2 wood wood  4096 Apr  6 18:49 ./
drwxrwxrwt 15 root root  4096 Apr  6 18:49 ../
-rw-rw-r--  1 wood wood  1024 Apr  6 18:49 figaa
-rw-rw-r--  1 wood wood  1024 Apr  6 18:49 figab
-rw-rw-r--  1 wood wood  1024 Apr  6 18:49 figac
-rw-rw-r--  1 wood wood  1024 Apr  6 18:49 figad
-rw-rw-r--  1 wood wood  1024 Apr  6 18:49 figae
-rw-rw-r--  1 wood wood  1024 Apr  6 18:49 figaf
-rw-rw-r--  1 wood wood  1024 Apr  6 18:49 figag
-rw-rw-r--  1 wood wood  1024 Apr  6 18:49 figah
-rw-rw-r--  1 wood wood  1024 Apr  6 18:49 figai
-rw-rw-r--  1 wood wood  1024 Apr  6 18:49 figaj
-rw-rw-r--  1 wood wood    28 Apr  6 18:49 figak
-rw-rw-r--  1 wood wood   144 Apr  6 15:56 filea
-rw-rw-r--  1 wood wood   168 Apr  6 16:02 fileb
-rw-rw-r--  1 wood wood    30 Apr  6 17:59 filec
-rw-rw-r--  1 wood wood     0 Apr  6 11:23 filed
-rw-rw-r--  1 wood wood     0 Apr  6 11:23 filee
-rw-rw-r--  1 wood wood     0 Apr  6 11:23 filef
-rw-rw-r--  1 wood wood 10268 Apr  6 18:47 image

参数代换

xargs

命令 xargs 可以用来产生某个命令的参数。xargs 可以读入标准输入的数据,并以空格符或换行符作为识别符,将标准输入的数据分隔为参数。

xargs [-0epn] command
-0如果输入的标准输入含有特殊字符,比如 “`\” 等字符时,该参数能够将之还原为一般字符,这个参数可以用于特殊状态
-eEOF,后面可接一个字符,当 xargs 分析到该字符时,就会停止工作
-p在执行每个命令时,都会询问使用者
-n后面接次数,每次 command 命令执行时,要使用几个参数
wood@ubuntu:/tmp/test$ ll
total 8
drwxrwxr-x  2 wood wood 4096 Apr  6 19:31 ./
drwxrwxrwt 15 root root 4096 Apr  6 19:17 ../
-rw-rw-r--  1 wood wood    0 Apr  6 19:31 filea
-rw-rw-r--  1 wood wood    0 Apr  6 19:31 fileb
-rw-rw-r--  1 wood wood    0 Apr  6 19:31 filec
wood@ubuntu:/tmp/test$ find file* | xargs -p rm
rm filea fileb filec ?...n
wood@ubuntu:/tmp/test$ ll
total 8
drwxrwxr-x  2 wood wood 4096 Apr  6 19:31 ./
drwxrwxrwt 15 root root 4096 Apr  6 19:17 ../
-rw-rw-r--  1 wood wood    0 Apr  6 19:31 filea
-rw-rw-r--  1 wood wood    0 Apr  6 19:31 fileb
-rw-rw-r--  1 wood wood    0 Apr  6 19:31 filec
wood@ubuntu:/tmp/test$ find file* | xargs -p rm
rm filea fileb filec ?...y
wood@ubuntu:/tmp/test$ ll
total 8
drwxrwxr-x  2 wood wood 4096 Apr  6 19:34 ./
drwxrwxrwt 15 root root 4096 Apr  6 19:17 ../
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值