在 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 | 如果输入的标准输入含有特殊字符,比如 “`\” 等字符时,该参数能够将之还原为一般字符,这个参数可以用于特殊状态 |
-e | EOF,后面可接一个字符,当 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 ../