bash的IO重定向及管道

    程序:指令+数据(数据结构+算法)

            读入数据:input

            输出数据:output

    

    打开的文件都有一个fd:file descriptor(文件描述符)

    标准输入:keyborad,0

    标准输出:monitor,1

    标准错误输出:monitor,2


    I/O重定向:改变标准位置


    输出重定向:COMMAND > NEW_POS,COMMAND >> NEW_POS

        >:覆盖重定向,目标文件中的原有内容会被清除

        >>:追加重定向,将原文件中的内容追加到目标文件末尾

        # set -C:禁止将内容覆盖输出至已有文件中

            强制覆盖:>|

        # set +C:取消禁止将内容覆盖输出至已有文件中

        

        2>:覆盖重定向错误输出数据流

        2>>:追加重定向错误输出数据流


        标准输出和错误输出各自定向至不同位置

            COMMAND > /path/to/file.suc 2>/path/to/file.err

        合并标准输出和错误输出为同一个数据流进行重定向

            &>:覆盖重定向

            &>>:追加重定向


            COMMAND > /path/to/file 2>&1    :将错误输出覆盖重定向至/path/to/file中

            COMMAND >> /path/to/file 2>>&1

        

    输入重定向:<

        tr命令:转换或删除字符

            tr [OPTION]... SET1 [SET2]

            tr abc ABC < /etc/fstab    :以/etc/fstab作为输入,并将其输入数据流中小写abc替换为大写ABC

    HERE Documentation:<<

        (1)cat << EOF

        >1111111

        >2222222

        >EOF

        (2)cat >>/tmp/test<<EOF

                    >

                追加或覆盖输入内容至/tmp/test中


管道:前一个命令的结果当做后一个命令的输入

    COMMAND1 | COMMAND2 | COMMAND3|......

    Note:最后一个命令会在当前shell进程的子shell进程中执行


tee:

    tee [OPTION]... [FILE]...

    # tee 1.out

    123

    123

    456

    456

    ^C

    # cat 1.out 

    123

    456

    # 

    一路输入,两路输出



文本处理工具:wc,cut,sort,uniq

    wc命令:

    wc [OPTION]... [FILE]...

        wc -l 文件名 行数

        wc -c 文件名 字节数  set list显示换行符

        wc -w 文件名 连续到字符串(单词)

            cat -n /etc/passwd | head -20 | tail -2 | rev | tac (rev 左右颠倒  tac颠倒)

    

    cut命令:

    cut [OPTION]... [FILE]...

        -d DELIMITER:指明分隔符

        -f   FILEDS:

            #:第#个字段

            #,#[,#]:离散的多个字段:例如1,3,6

            #-#:连续的多个字段:例如1-6

            1-3,7:混合使用

        --output-delimiter=STRING:指明分隔的字段

        cut -d: -f1 /etc/passwd | head -5

        cut -d: -f1,3,5 /etc/passwd | head -5

        cut -d: -f1-3 /etc/passwd | head -5

        cut -c 1 /etc/passwd | head -5

        cut -c 1,2,3 /etc/passwd | head -5

        cut -c 1-4 /etc/passwd | head -5

        cut -d: -f1-3 --output-delimiter=' ' /etc/passwd

    

    sort命令:排序

    sort [OPTION]... [FILE]...

        sort    默认按首字符排序

        sort -n    按数值大小排序

        sort -u    (uniq)去掉重复行

        sort -r    降序排序

        sort -f    忽略字符大小写

        sort -t    DELIMITER:字段分隔符

        sort -k #:以#字段为标准排序


    uniq命令:默认去掉连续且完全相同的行

    uniq [OPTION]... [FILE]...

        uniq -d  显示重复行

        uniq -u  显示不重复行

        uniq -c  统计重复次数


练习:以冒号分隔,取出/etc/passwd文件的第6至第10行,并将这些信息按第3个字段的数值大小进行排序,最后仅显示各自的第一个字段。

    # sed -n '6,10p' /etc/passwd | sort -t: -k3 | cut -d: -f1