重定向及管道
程序 = 指令 + 数据
数据: 输入/输出数据
每打开一个文件都会有一个文件描述符fd
输入输出
标准输入
标准输出 1
标准错误输出 2
输出重定向
> 覆盖重定向
>> 追加重定向
2> 覆盖重定向错误输出流
2>> 追加重定向错误输出流
简而言之:输入重定向就是把文件导入到命令中,而输出重定向就是把原本要输入到屏幕的数据写到指定的文件中去。
其中,输出重定向包括标准输出重定向和错误输出重定向以及**清空写入与追加写入两种模式**。

标准输入重定向:(STDIN,文件描述为0):默认从键盘输入,也可以从其他文件或者命令输入。
标准输出重定向:(STDOUT,文件描述为1):默认输出到屏幕
错误输出重定向:(STDERR,文件描述为2):默认输出到屏幕。
**

  1. [root@test tmp]# echo "hello eagles" #输出到屏幕上<br /> hello eagles<br /> [root@test tmp]# echo "hello eagles" > 2.txt #输入到指定的2.txt文件中<br /> [root@test tmp]# cat 2.txt **查看2.txt文件**<br /> hello eagles<br /> [root@test tmp]# echo "hello eagles" >> 2.txt #将**标准输出重定**向到一个文件中(追加到原有的内容后面)<br /> [root@test tmp]# cat 2.txt <br /> hello eagles<br /> hello eagles #看到追加一行代码<br /> [root@test tmp]# lnd 指令输入到文件中<br /> -bash: lnd: command not found<br /> [root@test tmp]# lnd 2> output_error #错误输出重定向到文件中<br /> [root@test tmp]# cat output_error <br /> -bash: lnd: command not found<br /> [root@test tmp]# lnd 2>> output_error<br /> [root@test tmp]# cat output_error <br /> -bash: lnd: command not found<br /> -bash: lnd: command not found<br />标准输出和错误输出到各自不同的位置<br />[root@test tmp]# ll 1> file.out 2> file_error.out** #ll=ls -l查看详细信息,命令写入文件file.out 2**<br />[root@test tmp]# cat file.out 查看<br />total 8<br />lrwxrwxrwx. 1 root root 5 Feb 6 07:26 1_soft.txt -> 1.txt **#1表示inode的引用次数,5表示文本字节大小,->表示这个是谁的软链接 !!!**<br />-rw-r--r--. 1 root root 0 Feb 6 07:26 1.txt<br />-rw-r--r--. 1 root root 26 Feb 6 07:51 2.txt<br />-rw-r--r--. 1 root root 0 Feb 6 07:53 file_error.out<br />-rw-r--r--. 1 root root 0 Feb 6 07:53 file.out<br />-rw-r--r--. 1 root root 60 Feb 6 07:51 output_error<br />[root@test tmp]# lld 1> file.out 2> file_error.out<br />[root@test tmp]# cat file_error.out <br />-bash: lld: command not found<br />**垃圾桶: /dev/null 类似于windows的回收站 无限大**<br />**合并标准输出和错误输出为同一数据流进行重定向,将错误输出与标准输出共同写入到文件中,并且追加到原有的内容之后。**<br />**两种写法:**
  • 命令&>>文件
  • [x] 命令>>文件2>&1

    &> :覆盖重定向错误流
    &>>: 追加重定向正确流
    2>&1: 将错误流重定向到标准输出文件中 (>>)
    1>&2 : 将正确流重定向到错误输出文件中 (>>)

    [root@test tmp]# lld &> all.out #覆盖重定向
    [root@test tmp]# ll &>> all.out #追加重定向
    [root@test tmp]# cat all.out
    -bash: lld: command not found
    total 16
    lrwxrwxrwx. 1 root root 5 Feb 6 07:26 1_soft.txt -> 1.txt
    -rw-r—r—. 1 root root 0 Feb 6 07:26 1.txt
    -rw-r—r—. 1 root root 26 Feb 6 07:51 2.txt
    -rw-r—r—. 1 root root 30 Feb 6 07:56 all.out
    -rw-r—r—. 1 root root 30 Feb 6 07:53 file_error.out
    -rw-r—r—. 1 root root 0 Feb 6 07:53 file.out
    -rw-r—r—. 1 root root 60 Feb 6 07:51 output_error

    [root@test tmp]# lld 1> file.out 2> file_error.out 2>&1
    #lld命令标准输出到file.out文件中,将错误流重定向到标准输出文件中,最后合并输出重定向到文件中追加模式。
    [root@test tmp]# cat file.out
    -bash: lld: command not found
    [root@test tmp]# ll 1> file.out 2> file_error.out 1>&2
    #ll标准输入重定向到文件file.out中在错误输出重定向到文件中,最后将正确流重定向输入到错误输出文件中

    [root@test tmp]# cat file_error.out
    total 16
    -rw-r—r—. 1 root root 30 Feb 6 07:57 1.out
    lrwxrwxrwx. 1 root root 5 Feb 6 07:26 1_soft.txt -> 1.txt
    -rw-r—r—. 1 root root 0 Feb 6 07:26 1.txt
    -rw-r—r—. 1 root root 26 Feb 6 07:51 2.txt
    -rw-r—r—. 1 root root 396 Feb 6 07:56 all.out
    -rw-r—r—. 1 root root 0 Feb 6 07:59 file_error.out
    -rw-r—r—. 1 root root 0 Feb 6 07:59 file.out
    -rw-r—r—. 1 root root 60 Feb 6 07:51 output_error #追加重定向正确流

    标准输入(实际基本不用)

    覆盖:
    cat > /path/somefile <….
    EOF
    追加:
    cat >> /path/somefile <….
    EOF
    cat > test.txt <hello eagles
    hello Linux
    EOF
    cat >> test.txt <hello eagles
    hello Linux
    EOF

    管道

    command1 | command2 | command3 …
    最后一个命令会在当前shell进程的子shell进程中执行;前一个命令的执行结果
    会由当前命令继续使用
    tr命令:
    Usage: tr [OPTION]… SET1 [SET2]
    常用选项:
    -d: 删除

    案例1:将/etc/passwd文件中的前5行内容转换为大写后保存至/tmp/passwd.out文件中
    [root@node1 ~]# head ‐n 5 /etc/passwd | tr ‘a‐z’ ‘A‐Z’ > /tmp/passwd.output
    image.png
    案例2:将登陆至当前系统上用户信息中的最后1行的信息转换为大写后保存至/tmp/who.out文件中
    [root@node1 ~]# who | tail ‐n 1 | tr ‘a‐z’ ‘A‐Z’ >/tmp/who.out
    tail可以持续刷新一个文件的内容,可以查看最新的日志文件。-n查最后一行就是可以查看最新的日志文件,接着信息转变为大写输入到/tmp/who.out文件中。
    案例3:将文件中的:删除之后重定向到新文件中
    [root@test tmp]# cat output_error | tr -d “:” > output_error_new
    查阅output_error文件 并且tr -d 表示删除一个字符 再重新输入到文件中。
    wc命令:统计文本的行数、字数还有字节数
    Usage: wc [OPTION]… [FILE]…
    [root@test tmp]# wc test.txt
    4 8 50 test.txt —->4行 8个字数 字节50个
    常用参数:
    -l : 行数
    -w : 单词数
    -c :字符数

    [root@test tmp]# wc -l test.txt 查看文本的行数
    4 test.txt
    [root@test tmp]# wc -w test.txt 查看单词数
    8 test.txt
    [root@test tmp]# wc -c test.txt 查看字符数
    50 test.txt
    cut命令:
    [root@test tmp]# cut —help
    Usage: cut OPTION… [FILE]…
    Print selected pa**rts of lines from each FILE to standard output.
    常用参数:
    -d: 指定分隔符
    -f: 指定字段
    实例: 以:为分隔符显示第7列内容
    [root@test tmp]# cut -d: -f7 passwd.output 一定要有分隔符号:
    sort命令
    常用参数:
    -f: 忽略大小写
    -r:逆序
    -t:字段分隔符
    -k #: 以指定字段为标准排序
    -n: 以数字进行排序(默认情况下,如果没有-n参数,会以ASCII进行排序)
    -u: 排序后进行去重
    实例: 以:为分隔符,指定第3字段,以数字进行逆序
    [root@test tmp]# sort -t: -k3 -r -n passwd.output
    uniq命令:去重
    常用参数:
    -c : 显示每行出现的次数
    -d :仅显示重复过的行
    -u :仅显示不曾重复过的行

    实例:
    [root@test tmp]# uniq -c test.txt
    2 hello eagles
    2 hello Linux
    1 fjkldlaj
    1 fdkajjf;
    [root@test tmp]# uniq -d test.txt
    hello eagles
    hello Linux
    [root@test tmp]# uniq -u test.txt
    fjkldlaj
    fdkajjf;
    测试文本:
    [root@test tmp]# cat test.txt
    hello eagles
    hello eagles
    hello Linux
    hello Linux
    fjkldlaj
    fdkajjf;
    综合案例:以:为分割,取出/etc/passwd文件的第6列至第10列,并将这些信息按照第3个字段的数值大小进行排序,最后仅显示一个字段
    [root@node1 ~]# cut ‐d: ‐f6‐10 /etc/passwd |cut ‐f3 | sort ‐n |uniq -c
    [root@test tmp]# cut -d: -f6-10 /etc/passwd | sort -t: -k3 -n | uniq -c #sort -t字段分隔符号:三字段排序 最后显示一个字段uniq -c sort -n:表示数字大小排序 **-k #: 以指定字段为标准排序??????
    image.png
    cat log.txt | awk -F “”‘{print &1}’|sort|uniq -c|sort -nrt””|awk _F””‘print &2’|head -10