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

相关文章

来自专栏老秦求学

汇编语言学习之汇编语言源程序的输入

  在dos下输入汇编源程序的方法   一 环境的搭建   windows下运行“windows+r”键入“cmd”,就就进入dos系统,输入“debug”进入...

3215
来自专栏orientlu

python ssh 库 - paramiko and fabric

标题提到两个第三方库,都是可以实现在 python 中执行 ssh 命令。fabric 是在 paramiko 的基础上封装开发的。所以一般场景下 fabric...

621
来自专栏青青天空树

mfc学习之路--如何删除通过控件新增的变量

   刚刚学校mfc的人都会遇到这样一个问题(比如我),在照做书做一个mfc程序,给控件新增变量时变量类型错了,但是变量名对了,然后想要加个正确的时候提示"已经...

675
来自专栏地方网络工作室的专栏

Shell 命令行,实现一个获取任意位数的随机密码的脚本

Shell 命令行,实现一个获取任意位数的随机密码的脚本 每次我们想要获得一个密码的时候都很头疼,于是我之前自己用nodejs写了一个 Shell 脚本。这两天...

1836
来自专栏ascii0x03的安全笔记

【C++】小心使用文件读写模式:回车('\r') 换行('\n')问题的一次纠结经历

原来没有仔细注意C++读写文件的二进制模式和文本模式,这次吃了大亏。(平台:windows  VS2012) BUG出现: 写了一个程序A,生成一个文本文件F保...

2957
来自专栏漫漫深度学习路

python 文件操作

python 文件操作 判断文件/文件夹是否存在 import os print os.path.exits(file_name) # 存在:返回True,否则...

1837
来自专栏逆向技术

16位汇编第一讲简介

                 汇编第一讲 汇编简介 一.什么是汇编   汇编语言他是计算机语言,计算机语言通俗点说就是人类和计算机(也就是CPU)沟通的...

1880
来自专栏Pythonista

python模块和包

一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py 的后缀。

621
来自专栏老马寒门IT

Node入门教程(8)第六章:path 模块详解

1404
来自专栏软件开发 -- 分享 互助 成长

很经典的GDB调试命令,包括查看变量,查看内存

在你调试程序时,当程序被停住时,你可以使用print命令(简写命令为p),或是同义命令inspect来查看当前程序的运行数据。print命令的格式是: prin...

6036

扫码关注云+社区