双向重导向
tee
tee -a file
能将数据流分别输出到文件和屏幕中,到屏幕中的数据输出(stdout)就可以让下一个命令继续处理。
例:
last | tee last -a last.list | cut -d ’ ’ -f 1
字符转换命令:tr、col、join、paste、expand
tr
tr [-ds] 字符串
-d 删除
-s 取代重复的字符
例:
last | tr -s [a-z] [A-Z]
将输出内容小写变成大写。
cat /etc/passwd | tr -d ':'
将输出内容里面的:都删掉。
col
col [-x]
将输出内容里面的tab转换成空白键
join
join [-ti12] file1 file2
对比2个文件(必须经过经过相同规则进行过排序),找出同一位置有相同的部分进行合并为一个,剩余部分在后面追加。
-t join默认以空字符分割剩余数据,-t可以指定分割的字符,例如使用:分割2段数据。
-i 忽略大小写
-1 数字1,代表第一个文件以那一段的数据进行对比
-2 代表第二个文件以那一段的数据进行对比
例:
A文件为学生姓名、学号
cat A
zhangsan 05
lisi 11
wangwu 21
B文件为学生姓名、成绩
cat B
zhangsan 78
lisi 82
wangwu 59
现在需要将学生的姓名、学号、对应的成绩合并一个文件里面。
join A B
zhangsan 05 78
lisi 11 82
wangwu 21 59
paste
paste -d file1 file2
直接将2个文件内容以行进行连接,并以tab隔开。
-d 后面接分隔字符,默认是tab
- file部分写成- ,表示是来自stdin的数据
expand
expand -t file
用于将tab转变成空格字符,-t后面接数字,一般一个tab为8个空格。
split
split [-bl] file
用于将一个文件以大小或行数来切割成几个文件。
-b 后面为切割的文件大小,可加单位,b、k、m
-l 以行数进行切割
例:
split -b 1000 A.txt ./learn_shell/A ;cd ~/learn_shell/;ll
xargs
xargs [-dpne0] command
命令可以通过管道接受字符串
,并将接收到的字符串通过空格分割成许多参数
(默认情况下是通过空格分割) 然后将参数传递给其后面的命令
,作为后面命令的命令行参数
。
例一:
echo ‘–help’ | cat
--help <==输出
例二:
echo ‘–help’ | xargs cat
用法:cat [选项]... [文件]...
Concatenate FILE(s) to standard output.
如果没有指定文件,或者文件为"-",则从标准输入读取。
-A, --show-all equivalent to -vET
-b, --number-nonblank number nonempty output lines, overrides -n
-e equivalent to -vE
-E, --show-ends display $ at end of each line
-n, --number number all output lines
-s, --squeeze-blank suppress repeated empty output lines
-t 与-vT 等价
-T, --show-tabs 将跳格字符显示为^I
......
第一个例子中cat接受的是管道中过来的标准输出,然后将其显示出屏幕中。例二中xargs可以将管道传过来的–help转为cat的参数,所有输出的是cat --help。
xargs的选项:
-d xargs默认是以空格分割参数,-d可以指定分割参数的特殊符合。
例:
echo ‘11@22@33’ | xargs -d ‘@’ echo
指定@为分割参数符号
11
22
33
-p 可以在运行command前,会显示要执行的命令,并询问是否需要执行命令。
例:
echo ‘11’ | xargs -p kill
kill 11 ?...
-n 这个选项会根据-n后面的数字来决定要执行的命令每次接受多少个参数来运行。
例:
echo ‘11 22 33’ | xargs -n 2 echo
echo命令会每次接受2个参数。
11 22
33
-e 当xargs解释到多个参数时,当运行到-e后面的参数时就会停止。
echo ‘11 22 33’ | xargs -e ‘33’ echo
,命令运行到33时就会停止。
11
22
-0 等于-d ‘\0’,就是输出内容不换行。
实际中有很多命令不支持管道命令的stdin,如ls、rm、kill等,xargs就可以将接收到的stdin作为这些命令的参数来运行命令。比如我在学习中在家目录下建了很多类似123.txt的文件,我想把他们删掉可以这样:
find ~/ -name 123.txt | xargs -p rm
减号-的用途
在管道命令中,管道前命令产生的stdout可以作为管道后面命令的stdin,而-可以代替这个stdin。
例:
有一个123.txt的文件,内容是abc。
echo ‘123’ | cat 123.txt
abc
虽然echo ‘123’ 产生出stdout,但cat 的参数是123.txt所有输出的是abc。
echo ‘123’ | cat 123.txt -
abc
123
-就是cat的stdin,所有管道前的stdout也一并输出。