前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux笔记4.重定向及管道

Linux笔记4.重定向及管道

作者头像
章鱼喵
发布2018-06-27 15:14:20
8030
发布2018-06-27 15:14:20
举报
文章被收录于专栏:codingcoding

重定向及管道

I/O重定向

I(input)/O(output)重定向,即输入输出重定向。

标准输入,输出,和错误

默认情况下,标准输入来自键盘;标准输出和错误显示在屏幕。通过I/O重定向,可以指定输入输出的载体

重定向标准输出

I/O 重定向允许我们来重定义标准输出送到哪里。使用“>”重定向符。

如:将ls命令的运行结果输送到文件ls-output.txt中

代码语言:javascript
复制
[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指向一个不存在的路径

代码语言:javascript
复制
[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

结果分析:

  • 屏幕输出了错误信息
  • ls-output.txt的内容为空。因为该命令没有产生结果,而>符号是将原来的内容进行覆盖式操作
代码语言:javascript
复制
[root@senlong io]# > ls-output.txt # 利用`>`可以将一个文件的内容清空

如果要实现内容追加写入,使用>>符号:

代码语言:javascript
复制
[root@senlong io]# ls -l /bin/usr >> ls-output.txt

将标准错误输出重定向到文件

shell中用数字(0,1,2)分别表示标准输入、输入和错误,因此标准错误重定向符为2>

代码语言:javascript
复制
[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
重定向标准输出和错误到同一个文件

两种实现方式:

  1. 传统的方法:(在旧版本的shell中也有效)

可能有这种情况,我们希望捕捉一个命令的所有输出到一个文件。为了完成这个,我们 必须同时重定向标准输出和标准错误。有两种方法来完成任务。第一个,传统的方法, 在旧版本 shell 中也有效:

代码语言:javascript
复制
[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
  1. 精简的方法:
代码语言:javascript
复制
[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"文件。这个文件是系统设备,叫做位存储桶,它可以接受输入,并且对输入不做任何处理

代码语言:javascript
复制
-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]

代码语言:javascript
复制
[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命令不加文件名参数,即会默认读取标准输入(键盘输入):

代码语言:javascript
复制
[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.

接下来重定向标准输入

代码语言:javascript
复制
[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 来一页一页地显示任何命令的输出,命令把 它的运行结果输送到标准输出:

代码语言:javascript
复制
[root@senlong io]# ls -l /usr/bin | less # 将ls -l /usr/bin的输出作为less的输入
过滤器

管道线经常用来对数据完成复杂的操作。有可能会把几个命令放在一起组成一个管道线。通常,以这种方式使用的命令被称为过滤器。过滤器接受输入,以某种方式改变它,然后输出它。

sort指令可以对结果进行排序:

代码语言:javascript
复制
[root@senlong io]# ls /bin /usr/bin | sort | less

以上命令指定了两个目录(/bin 和/usr/bin),ls 命令的输出结果由有序列表组成,各自针对一个目录。通过在管道线中包含sort,对输出数据排序,从而产生一个有序列表。

uniq - 报道或忽略重复行

代码语言:javascript
复制
[root@senlong io]# ls /bin /usr/bin | sort | uniq | less # 过滤了重复行
代码语言:javascript
复制
[root@senlong io]# ls /bin /usr/bin | sort | uniq -d | less # 显示重复行

wc - 打印行,字和字节数

wc(字计数)命令是用来显示文件所包含的行,字和字节数。例如:

代码语言:javascript
复制
[root@senlong io]# wc ls-output.txt 
 1  9 54 ls-output.txt

wc 打印出来三个数字:包含在文件 ls-output.txt 中的行数,单词数和字节数

”-l”选项限制命令输出只能 报道行数。

在管道中用wc统计数据:

代码语言:javascript
复制
[root@senlong io]# ls /bin /usr/bin | sort | uniq | wc -l
1068

grep - 打印匹配行

grep 是个很强大的程序,用来找到文件中的匹配文本。这样使用 grep 命令:

grep pattern [file...]

当 grep 遇到一个文件中的匹配”模式”,它会打印出包含这个类型的行。grep 能够匹配的模式可以 很复杂,在此只列举简单的文本匹配模式

示例:找到文件名中包含单词”zip”的所有文件

代码语言:javascript
复制
[root@senlong io]# ls /bin /usr/bin | sort | uniq | grep zip
bunzip2
bzip2
bzip2recover
...

选项:

  • -i:忽略大小写
  • iv:只打印不匹配的选项

head / tail - 打印文件开头部分/结尾部分

有时候你不需要一个命令的所有输出。可能你只想要前几行或者后几行的输出内容。 head 命令打印文件的前十行,而 tail 命令打印文件的后十行。默认情况下,两个命令都打印十行文本,但是可以通过”-n”选项来调整命令打印的行数。

代码语言:javascript
复制
[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

应用到管道中:

代码语言:javascript
复制
[root@senlong io]# ls /usr/bin | tail -n 5
znew
zsoelim
zts-php
zts-php-config
zts-phpize

实时浏览文件:监测日志文件的变动时很有用

代码语言:javascript
复制
[root@senlong io]# tail -f /var/log/messages

使用”-f”选项,tail 命令继续监测这个文件,当新的内容添加到文件后,它们会立即 出现在屏幕上。这会一直继续下去直到你输入 Ctrl-c。

tee - 从 Stdin 读取数据,并同时输出到 Stdout 和文件

tee 程序从标准输入读入数据,并且同时复制数据到标准输出(允许数据继续随着管道线流动)和一个或多个文件。当在某个中间处理 阶段来捕捉一个管道线的内容时,显得很有用。

示例:在 grep 过滤管道线的内容之前,捕捉整个目录列表到文件 ls.txt:

代码语言:javascript
复制
[root@senlong io]# ls /usr/bin/ | tee ls.txt | grep zip
bunzip2
bzip2
bzip2recover
funzip
gpg-zip
gunzip
...
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.04.26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • I/O重定向
    • 重定向标准输出
      • 重定向标准错误输出
        • 重定向标准输出和错误到同一个文件
          • 扔掉输出
            • 重定向标准输入
              • 管道线
                • 过滤器
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档