重定向及管道
I(input)/O(output)重定向,即输入输出重定向。
标准输入,输出,和错误
默认情况下,标准输入来自键盘;标准输出和错误显示在屏幕。通过I/O重定向,可以指定输入输出的载体
I/O 重定向允许我们来重定义标准输出送到哪里。使用“>”重定向符。
如:将ls
命令的运行结果输送到文件ls-output.txt中
[root@senlong io]# ls -l /usr/bin > ls-output.txt
[root@senlong io]# ll
total 60
-rw-r--r-- 1 root root 59841 Apr 26 15:48 ls-output.txt
ls
指向一个不存在的路径
[root@senlong io]# ls -l /bin/usr > ls-output.txt
ls: cannot access /bin/usr: No such file or directory
[root@senlong io]# ll
total 0
-rw-r--r-- 1 root root 0 Apr 26 15:50 ls-output.txt
结果分析:
>
符号是将原来的内容进行覆盖式操作[root@senlong io]# > ls-output.txt # 利用`>`可以将一个文件的内容清空
如果要实现内容追加写入,使用>>
符号:
[root@senlong io]# ls -l /bin/usr >> ls-output.txt
将标准错误输出重定向到文件
shell中用数字(0,1,2)分别表示标准输入、输入和错误,因此标准错误重定向符为2>
[root@senlong io]# ls -l /bin/usr 2> ls-error.txt
[root@senlong io]# ll
total 4
-rw-r--r-- 1 root root 54 Apr 26 16:00 ls-error.txt
-rw-r--r-- 1 root root 0 Apr 26 15:55 ls-output.txt
两种实现方式:
可能有这种情况,我们希望捕捉一个命令的所有输出到一个文件。为了完成这个,我们 必须同时重定向标准输出和标准错误。有两种方法来完成任务。第一个,传统的方法, 在旧版本 shell 中也有效:
[root@senlong io]# ls -l /bin/usr > ls-output.txt 2>&1
[root@senlong io]# ll | grep ls-output.txt
-rw-r--r-- 1 root root 54 Apr 26 16:01 ls-output.txt
[root@senlong io]# ls -l /bin/usr &> ls-output.txt
[root@senlong io]# ll | grep ls-output.txt
-rw-r--r-- 1 root root 54 Apr 26 16:03 ls-output.txt
有时候,不想要一个命令的输出结果,只想把它们扔掉,(一般适用于错误和状态信息),可通过重定向结果到“dev/null"文件。这个文件是系统设备,叫做位存储桶,它可以接受输入,并且对输入不做任何处理
-rw-r--r-- 1 root root 54 Apr 26 16:03 ls-output.txt
[root@senlong io]# ls -l /bin/usr 2> /dev/null
[root@senlong io]# ll /dev/null
crw-rw-rw- 1 root root 1, 3 Apr 26 14:21 /dev/null
cat - 连接文件
cat 命令读取一个或多个文件,然后复制它们到标准输出,就像这样:
cat [file]
[root@senlong io]# ll | grep test.*
-rw-r--r-- 1 root root 2 Apr 26 16:10 test1.txt
-rw-r--r-- 1 root root 2 Apr 26 16:10 test2.txt
-rw-r--r-- 1 root root 2 Apr 26 16:10 test3.txt
[root@senlong io]# cat test*
1
2
3
[root@senlong io]# cat test* > sum.txt
[root@senlong io]# cat sum.txt
1
2
3
cat 默认从所带的文件名参数中读写数据,如果cat命令不加文件名参数,即会默认读取标准输入(键盘输入):
[root@senlong io]# cat > lazy_dog.txt
The quick brown fox jumped over the lazy dog. # 此段文字用键盘输入,完成后按ctrl+d
[root@senlong io]# cat lazy_dog.txt
The quick brown fox jumped over the lazy dog.
接下来重定向标准输入
[root@senlong io]# cat < lazy_dog.txt
The quick brown fox jumped over the lazy dog.
使用“<”重定向操作符,我们把标准输入源从键盘改到文件 lazy_dog.tx。我们看到结果。和传递单个文件名作为参数的执行结果一样。把这和传递一个文件名参数作比较,看起来没意义,但它是用来说明把一个文件作为标准输入源。
linux
命令可以从标准输入读取数据,然后再把数据输送到标准输出,命令的这种能力被一个shell特性所利用,这个特性叫做管道线。使用管道操作符”|”(竖杠),一个命令的标准输出可以管道到另一个命令的标准输入:
command1 | command2
为了全面地说明这个命令,我们需要一些命令。是否记得我们说过,我们已经知道有一个 命令接受标准输入?它是 less 命令。我们用 less 来一页一页地显示任何命令的输出,命令把 它的运行结果输送到标准输出:
[root@senlong io]# ls -l /usr/bin | less # 将ls -l /usr/bin的输出作为less的输入
管道线经常用来对数据完成复杂的操作。有可能会把几个命令放在一起组成一个管道线。通常,以这种方式使用的命令被称为过滤器。过滤器接受输入,以某种方式改变它,然后输出它。
sort指令可以对结果进行排序:
[root@senlong io]# ls /bin /usr/bin | sort | less
以上命令指定了两个目录(/bin 和/usr/bin),ls 命令的输出结果由有序列表组成,各自针对一个目录。通过在管道线中包含sort,对输出数据排序,从而产生一个有序列表。
uniq - 报道或忽略重复行
[root@senlong io]# ls /bin /usr/bin | sort | uniq | less # 过滤了重复行
[root@senlong io]# ls /bin /usr/bin | sort | uniq -d | less # 显示重复行
wc - 打印行,字和字节数
wc(字计数)命令是用来显示文件所包含的行,字和字节数。例如:
[root@senlong io]# wc ls-output.txt
1 9 54 ls-output.txt
wc 打印出来三个数字:包含在文件 ls-output.txt 中的行数,单词数和字节数
”-l”选项限制命令输出只能 报道行数。
在管道中用wc统计数据:
[root@senlong io]# ls /bin /usr/bin | sort | uniq | wc -l
1068
grep - 打印匹配行
grep 是个很强大的程序,用来找到文件中的匹配文本。这样使用 grep 命令:
grep pattern [file...]
当 grep 遇到一个文件中的匹配”模式”,它会打印出包含这个类型的行。grep 能够匹配的模式可以 很复杂,在此只列举简单的文本匹配模式
示例:找到文件名中包含单词”zip”的所有文件
[root@senlong io]# ls /bin /usr/bin | sort | uniq | grep zip
bunzip2
bzip2
bzip2recover
...
选项:
head / tail - 打印文件开头部分/结尾部分
有时候你不需要一个命令的所有输出。可能你只想要前几行或者后几行的输出内容。 head 命令打印文件的前十行,而 tail 命令打印文件的后十行。默认情况下,两个命令都打印十行文本,但是可以通过”-n”选项来调整命令打印的行数。
[root@senlong io]# head -n 5 ls-output.txt
arch
awk
basename
bash
cat
[root@senlong io]# tail -n 3 ls-output.txt
view
ypdomainname
zcat
应用到管道中:
[root@senlong io]# ls /usr/bin | tail -n 5
znew
zsoelim
zts-php
zts-php-config
zts-phpize
实时浏览文件:监测日志文件的变动时很有用
[root@senlong io]# tail -f /var/log/messages
使用”-f”选项,tail 命令继续监测这个文件,当新的内容添加到文件后,它们会立即 出现在屏幕上。这会一直继续下去直到你输入 Ctrl-c。
tee - 从 Stdin 读取数据,并同时输出到 Stdout 和文件
tee 程序从标准输入读入数据,并且同时复制数据到标准输出(允许数据继续随着管道线流动)和一个或多个文件。当在某个中间处理 阶段来捕捉一个管道线的内容时,显得很有用。
示例:在 grep 过滤管道线的内容之前,捕捉整个目录列表到文件 ls.txt:
[root@senlong io]# ls /usr/bin/ | tee ls.txt | grep zip
bunzip2
bzip2
bzip2recover
funzip
gpg-zip
gunzip
...