Shell提供了数种语法标记,用来修改默认 I/O 的来源端与目的端。
以 < 改变输入
program < file(s) 可将program的标准输入修改为file(s),允许将多个文件的内容作为程序的输入。
tr -d '/r' < my_dos_file.txt ...
以 > 改变输出
program > file 可将 program 的标准输出修改为 file:
tr -d '/r' <my_dos_file.txt > UNIX_file.txt
上述命令首先以 tr 将 my_dos_file.txt 里的 ASCII 的回车符删除,再将转换完成的数据输出到 UNIX_file.txt 。my_dos_file里的原始数据不会有变化。
[many@avention test]$ tr -d 'c' < myfile.txt > your.txt
[many@avention test]$ cat your.txt
abdefghijklmnopqrstuvwxyz
> 重定向符 (redirector)在目的的文件不存在时,会新建一个。然而,如果目的文件已存在,就会将其覆盖掉:原本的数据都会丢失。
以 >> 附加到文件
program >> file 可将program的标准输出附加到 file 的结尾处。如果目的文件不存在, >> 重定向符便会新建一个。如果目的文件存在,会将 program 产生的数据附加到文件结尾处:
for f in dos-file*.txt
do
tr -d '/r' < $f >> big-UNIX-file.txt
done
以 | 建立管道
program1 | program2 可将 program1 的标准输出修改为 program2 的标准输入。
虽然 < 与 > 可将输入与输出连接到文件,不过管道(pipeline)可以把两个以上执行中的程序衔接在一起。第一个程序的标准输出可以变成第二个程序的标准输入。好处:管道可以使得执行速度比临时文件的程序快上十倍。今后相当多的篇幅都是在讨论如何将工具串在一起,置入越来越复杂且功能越来越强大的管道中。
tr -d '
' < my_dos_file.txt | sort > my_UNIX_file.txt
tr
语法:
tr [options] soruce-char-list replace-char-list
用途:
转换字符。例如,将大写字符转换成小写。选项可让你指定要删除的字符,以及将一串重复出现的字符浓缩成一个。
常用选项:
-c
取source-char-list的反义。tr要转换的字符,变成未列在source-char-list中的字符。此选项常与-d或-s配合使用。
-C
与-c相似,但所处理的是字符(可能是包含多个字节的宽字符),而非二进制的字节值。
-d
自标准输入删除source-char-list里所列的字符,而不是转换它们。
-s
浓缩重复的字符,如果标准输入中连续重复出现source-char-list里所列的字符,则将其浓缩成一个。
行为模式:
如同过滤器,自标准输入读取字符,再将结果写入到标准输出。任何输入字符只要出现在source-char-list中,就会置换成replace-char-list里相应的字符。
[many@avention Desktop]$ echo abcd > ab.txt
[many@avention Desktop]$ tr -cd 'a' < ab.txt > a.txt 把ab.txt文件中的abcd字符串的除a以外的字符删掉
[many@avention Desktop]$ cat a.txt
a[many@avention Desktop]$ 由此可见,连换行符都替换掉了。
[many@avention Desktop]$ cat ab.txt
abcd
注意:构造管道时,应该试着让每个阶段的数据量变得更少。换句话说,如果你有两个要完成的步骤与先后顺序无关,你可以把会让数据量变少的那一个步骤放在管道的前面。这么做可以提升脚本的整体性能,因为UNIX只需要在两个程序间移动少的数据量,每个程序做的事也比较少。
例如,使用sort排序之前,先以grep找出相关的行;这样可以让sort少做些事。