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 条评论
登录 后参与评论

相关文章

来自专栏咸鱼不闲

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

42620
来自专栏深度学习自然语言处理

有关vi(vim)的常用命令

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

33560
来自专栏Charlie's Road

<Solidity学习系列二>深入理解Solidity之二---Solidity源代码文件结构

版本Pragma 源文件可以(也应该)用所谓的版本注释来注释,以拒绝被编译为未来可能引入不兼容更改的编译器版本。 我们试图将这种变化保持在绝对最低限度,特别是引...

9610
来自专栏coding

python的多进程与多fork

18230
来自专栏PPV课数据科学社区

大熊学python3爬虫–scrapy浅探(一)

? 在介绍scrapy之前,我觉得简单介绍下python的class很有必要。 class cainiao: def __init__(self,co...

326100
来自专栏Debian社区

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

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

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

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

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

38750
来自专栏WeaponZhi

Python爬虫入门(二)

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

43160
来自专栏ImportSource

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

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

10920
来自专栏IT派

Python 的异步 IO:Asyncio 简介

所谓「异步 IO」,就是你发起一个 IO 操作,却不用等它结束,你可以继续做其他事情,当它结束时,你会得到通知。

14930

扫码关注云+社区

领取腾讯云代金券