Linux笔记4.重定向及管道

重定向及管道

I/O重定向

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

结果分析:

  • 屏幕输出了错误信息
  • 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

重定向标准输出和错误到同一个文件

两种实现方式:

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

可能有这种情况,我们希望捕捉一个命令的所有输出到一个文件。为了完成这个,我们 必须同时重定向标准输出和标准错误。有两种方法来完成任务。第一个,传统的方法, 在旧版本 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
  1. 精简的方法:
[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
...

选项:

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

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
...

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏锦小年的博客

python学习笔记9.2-文件及文件夹操作

本文主要介绍python对文件以及文件夹的操作,主要涉及到文件的创建、读取、文件内容的修改、删除,文件夹的索引、目录的判断等等。此节内容非常重要,是以后编程的基...

2066
来自专栏Debian社区

Linux 系统 vim 编辑器使用简明教程

vi(vim)是上Linux非常常用的代码编辑器,很多Linux发行版都默认安装了vi(vim)。vi(vim)命令繁多但是如果使用灵活之后将会大大提高效率。v...

1217
来自专栏小白课代表

文件搜索利器——Everything

2372
来自专栏飞雪无情的博客

Go语言实战笔记(十三)| Go 并发资源竞争

上一篇我们讲的原子函数和互斥锁,都可以保证共享数据的读写,但是呢,它们还是有点复杂,而且影响性能,对此,Go又为我们提供了一种工具,这就是通道。

521
来自专栏ImportSource

单线程的Redis为什么辣么快?

你之所以问这样的问题。是因为你认为只有多线程分别接收connection才可以更快,就像过去的tomcat那样,同时开多个线程来响应。

822
来自专栏用户2442861的专栏

深入Python(2): __init__.py 用法

原文:http://www.2cto.com/kf/201204/129388.html python的每个模块的包中,都有一个__init__.py文...

821
来自专栏WeaponZhi

Python爬虫入门(二)

上一篇文章大概的讲解了 Python 爬虫的基础架构,我们对 Python 爬虫内部运行流程有了一定的理解了,我们这节将用一些简单的 Python 代码实现Py...

3586
来自专栏我是业余自学C/C++的

C++中的文件和流

1174
来自专栏林冠宏的技术文章

Golang, 以17个简短代码片段,切底弄懂 channel 基础

(原创出处:https://cloud.tencent.com/developer/user/1148436/activities) 前序:   因为打算自己搞...

3755
来自专栏咸鱼不闲

post和get的区别,面试经常被问到!(二)

2482

扫码关注云+社区