2.5.5.1 重定向与管道

    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里的原始数据不会有变化。
 
        > 重定向符 (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 '\r' < 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
[many@avention Desktop]$ cat a.txt
a[many@avention Desktop]$                                                           由此可见,连换行符都替换掉了。
[many@avention Desktop]$ cat ab.txt
abcd
 
 
注意:构造管道时,应该试着让每个阶段的数据量变得更少。换句话说,如果你有两个要完成的步骤与先后顺序无关,你可以把会让数据量变少的那一个步骤放在管道的前面。这么做可以提升脚本的整体性能,因为UNIX只需要在两个程序间移动少的数据量,每个程序做的事也比较少。
 
例如,使用sort排序之前,先以grep找出相关的行;这样可以让sort少做些事。
 

猜你喜欢

转载自www.cnblogs.com/avention/p/9688701.html