说明:
管线仅能处理经由前面一 个指令传来的正确信息,错误信息不能直接处理,要想处理错误信息,需要吧错误输出重定向成为标准输出
管线命令必须能够接受来自前一个指令的数据成为输入,然后继续进行处理才可以
指令选项不一定全,详细信息可以使用 --help
查看
切割获取行信息
使用说明:
# 用于有特定分隔字符,分割后下标从1开始
cut -d'分隔字符' -f fields
# 用于排列整齐的讯息
cut -c 字符区间
选项与参数:
-d :后面接分隔字符。与 -f 一起使用;
-f :依据 -d 的分隔字符将一段讯息分区成为数段,用 -f 取出第几段的意思;
-c :以字符 (characters) 的单位取出固定字符区间;
样例:
# 查看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
语法:
grep [-acinv] [--color=auto] '搜寻字串' filename
选项与参数:
-a :将 binary 文件以 text 文件的方式搜寻数据
-c :计算找到 '搜寻字串' 的次数
-i :忽略大小写的不同,所以大小写视为相同
-n :顺便输出行号
-v :反向选择,亦即显示出没有 '搜寻字串' 内容的那一行!
--color=auto :可以将找到的关键字部分加上颜色的显示喔!
排序的字符与语系的编码有关,如果需要排序,建议先使用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) 来进行排序
去除重复的数据,但是只能去除和上一个一样的数据。
uniq [-ic]
选项与参数:
-i :忽略大小写字符的不同;
-c :进行计数
注意:只能去除连续的重复,如果不连续,将不会被去重
例如:文件t内容如下
111
222
111
222
直接使用uniq
去除重复:
cat t | uniq
# 输出:
111
222
111
222
没有生效,如果先排序,在进行才能顺利的去除重复部分:
# 排序
cat t | sort
# 排序后的结果:
111
111
222
222
# 排序后去重,并且计数
cat t | sort | uniq -c
# 输出: 出现次数 内容
2 111
2 222
如果需要记录重复出现的个数,可以用sort
结合uniq -c
一起使用,单纯去除重复,使用sort -u
就可以实现了
获取一些统计信息,例如:行数、单词数、字符数等
用法:
# 不加参数的时候,默认显示行数 单词数 字符数
wc [-lwmLc]
选项与参数:
-l :仅列出行;
-w :仅列出多少个单词(英文单字);
-m :多少字符;
-L :最长的行的长度
-c :所占字节数
tee 会同时将数据流分送到文件去与屏幕 (screen);
而输出到屏幕的, 其实就是 stdout ,那就可以让下个指令继续处理
# 语法:
tee [-a] file
选项与参数:
-a :以累加 (append) 的方式,将数据加入 file 当中!若不使用 -a 则文件如果已存在,会被覆盖
tr 可以用来删除一段讯息当中的文字,或者是进行文字讯息的替换
# 语法:
tr [-ds] SET1 ...
选项与参数:
-d :删除讯息当中的 SET1 这个字串;
-s :取代掉重复的字符!
例子:
# 文件t内容
cat t
# 输出
111
222
# 将1替换为3
cat t | tr 1 3
# 输出
333
222
# 删除1
cat t | tr -d 1
# 输出
222
用法:
col [-xb]
选项与参数:
-x :将 tab 键转换成对等的空白键
样例用法:
# 将test.py 中的tab转换成空格,然后输出到 new_test.py文件中
cat test.py | col -x > new_test.py
将文件的 tab 键转换为空格
expand [-t] file
选项与参数:
-t :后面可以接数字。一般来说,一个 tab 按键可以用 8 个空白键取代。
我们也可以自行定义一个 [tab] 按键代表多少个字符呢!
用法:
join [-ti12] file1 file2
选项与参数:
-a :完全展示某文件的内容,例如:-a 1,完全展示1的内容
-t :指定分隔符。join 默认以空白字符分隔数据,并且比对“第一个字段”的数据,
如果两个文件相同,则将两笔数据联成一行,且第一个字段放在第一个!
-i :忽略大小写的差异;
-1 :这个是数字的 1 ,代表“第一个文件要用那个字段来分析”的意思;
-2 :代表“第二个文件要用那个字段来分析”的意思。
例子:
# 文件 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
需要特别注意的是,在使用 join 之前,你所需要处理的文件应该要 事先经过排序 (sort) 处理! 否则有些比对的项目会被略过
paste 就要比 join 简单多了!相对于 join 必须要比对两个文件的 数据相关性, paste 就直接“将两行贴在一起,且中间以 [tab] 键隔开”而已!
paste [-d] file1 file2
选项与参数:
-d :后面可以接分隔字符。默认是以 [tab] 来分隔的!
- :如果 file 部分写成 - ,表示来自 standard input 的数据的意思。
他可以帮你将一个大文件,依据文件大小或行数来分区,就可以将大文件 分区成为小文件了!
split [-bl] file PREFIX
选项与参数:
-b :后面可接欲分区成的文件大小,可加单位,例如 b, k, m 等;
-l :以行数来进行分区。
PREFIX :代表前置字符的意思,可作为分区文件的前导文字。
例子:使用 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。 这里就被当作标准输入了!
更过操作可以查看 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 来进行输出喔!
管线命令在 bash 的连续的处理程序中是相当重要的。在管线命令当中,常常 会使用到前一个指令的 stdout 作为这次的 stdin , 某些指令需要用到文件名称 (例如 tar) 来进行处理时,该 stdin 与 stdout 可以利用减号 “-” 来替代。
例如:
tar -cvf - /home | tar -xvf - -C /tmp/homeback
将 /home 里面的文件给他打包,但打包的数据不是 纪录到文件,而是传送到 stdout;
经过管线后,将 tar -cvf - /home 传送给 后面的 tar -xvf - ”。
后面的这个 - 则是取用前一个指令的 stdout, 因此, 我们就不需要使用 filename 了