《快乐的Linux命令行》学习记录——重定向

版权声明:共同提高:) https://blog.csdn.net/u011436427/article/details/83268539

I/O重定向:
“I/O” 代表输入/输出,通过这个工具,你可以重定向命令的输入输出,命令的输入来自文件,而输出也存到文件。也可以把多个命令连接起来组成一个强大的命令管道

本章主要介绍的命令如下:

• cat -连接文件
• sort -排序文本行(可用在管道线)
• uniq -报道或省略重复行(可用在管道线)
• grep -打印匹配行(可用在管道线)
• wc -打印文件中换行符,字,和字节个数(可用在管道线)
• head -输出文件第一部分(可用在管道线)
• tail - 输出文件最后一部分(可用在管道线)

1 标准输入,输出,和错误

我们用到的许多程序都会产生某种输出。这种输出,经常由两种类型组成。
第一,程序运行结果;这是说,程序要完成的功能。
第二,我们得到状态和错误信息,这些告诉我们程序进展。

1)标准输出:

运行结果输送到一个叫做标准输出的特殊文件(经常用 stdout 表示);

2)标准错误输出:

它们的状态信息则送到另一个叫做标准错误的文件(stderr)

默认情况下,标准输出和标准错误都连接到屏幕,而不是保存到磁盘文件

3)标准的输入:

许多程序从一个叫做标准输入(stdin)的设备得到输入,默认情况下,标准输入连接到键盘

总结:
I/O 重定向允许我们可以更改输出走向和输入来向。一般地,输出送到屏幕,输入来自键盘,但是通过 I/O 重定向,我们可以改变输入输出方向。

2 重定向标准输出

把一个命令的运行结果存储到一个文件中,很有用。

重定向符号有两种:

1)>:从开头重写文件

2)>>:把重定向结果追加到文件内容后面

eg:
我们可以告诉 shell 把 ls 命令的运行结果输送到文件 ls-output.txt 中去,由文件代替屏幕。

[me@linuxbox ~]$ ls -l /usr/bin > ls-output.txt

创建了一个长长的目录/usr/bin 列表,并且输送程序运行结果到文件 ls-output.txt 中。我们检查一下重定向的命令输出结果:

[me@linuxbox ~]$ ls -l ls-output.txt
-rw-rw-r-- 1 me me 167878 2008-02-01 15:07 ls-output.txt

less 阅读器来查看这个文件,看到文件ls-output.txt 的确包含 ls 命令的执行结果。

[me@linuxbox ~]$ less ls-output.txt

重复我们的重定向测试,我们把目录换成一个不存在的目录

[me@linuxbox ~]$ ls -l /bin/usr > ls-output.txt
ls: cannot access /bin/usr: No such file or directory

为什么这条错误信息显示在屏幕上而不是被重定向到文件 ls-output.txt?
答:ls 程序不把它的错误信息输送到标准输出,因为我们只是重定向了标准输出,而没有重定向标准错误,所以错误信息被送到屏幕。

但是首先看一下我们的输出文件发生了什么事情?
在这里插入图片描述

注:简单地使用重定向符,没有命令在它之前,这会删除一个已存在文件的内容或是创建一个新的空文件

怎样才能把重定向结果追加到文件内容后面,而不是从开头重写文件?
答案:使用 “>>” 重定向符

接着上面的eg继续:

[me@linuxbox ~]$ ls -l /usr/bin >> ls-output.txt

使用 “>>” 操作符,将导致输出结果添加到文件内容之后。如果文件不存在,文件会被创建

我们重复执行命令三次,导致输出文件大小是原来的三倍

[me@linuxbox ~]$ ls -l /usr/bin >> ls-output.txt
[me@linuxbox ~]$ ls -l ls-output.txt
-rw-rw-r-- 1 me me 503634 2008-02-01 15:45 ls-output.txt

3 重定向标准错误

重定向标准错误缺乏专用的重定向操作符。重定向标准错误,我们必须参考它的文件描述符

shell 提供了一种表示法来重定向文件,使用文件描述符。因为标准错误和文件描述符 2 一样,我们用这种表示法来重定向标准错误

[me@linuxbox ~]$ ls -l /bin/usr 2> ls-error.txt

文件描述符 “2”,紧挨着放在重定向操作符之前,来执行重定向标准错误到文件 ls-error.txt任务。

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

1)旧版本的bash(麻烦,别用了)

[me@linuxbox ~]$ ls -l /bin/usr > ls-output.txt 2>&1

在这里插入图片描述

2)新版本的bash

[me@linuxbox ~]$ ls -l /bin/usr &> ls-output.txt

我们使用单单一个表示法 &> 来重定向标准输出和错误到文件 lsoutput.txt。

5 处理不需要的输出

我们不想要一个命令的输出结果,只想把它们扔掉。
通过重定向输出结果到一个特殊的叫做 “/dev/null” 的文件
这个文件是系统设备,叫做位存储桶,它可以接受输入,并且对输入不做任何处理。

[me@linuxbox ~]$ ls -l /bin/usr 2> /dev/null

6 重定向标准输入

结合下面的7去看

7 cat -连接文件

cat 命令读取一个或多个文件,然后复制它们到标准输出。

cat [file]

cat 经常被用来显示简短的文本文件,你可以使用 cat 来显示文件而没有分页

[me@linuxbox ~]$ cat ls-output.txt

cat用来把文件连接在一起。比方说我们下载了一个大型文件,这个文件被分离成多个部分(USENET 中的多媒体文件经常以这种方式分离)。

cat movie.mpeg.0* > movie.mpeg

用cat来创建简短的文本文件,比方说,我们想创建一个叫做 “lazy dog.txt” 的文件,这个文件包含例子中的文本。

[me@linuxbox ~]$ cat > lazy_dog.txt

输入命令,其后输入要放入文件中的文本。

最后输入 Ctrl+d。通过使用这个命令,来告诉 cat,在标准输入中,它已经到达文件末尾(EOF)。我们使用 cat 来复制文件内容到标准输出:

[me@linuxbox ~]$ cat lazy_dog.txt

除了文件名参数,让我们试着重定向标准输入:

[me@linuxbox ~]$ cat < lazy_dog.txt

使用“<”重定向操作符,我们把标准输入源从键盘改到文件 lazy dog.tx。

8 管道线

命令可以从标准输入读取数据,然后再把数据输送到标准输出。

管道线:
使用管道操作符 “|”(竖杠),一个命令的标准输出可以,以管道的方式到另一个命令的标准输入

command1 | command2

我们已经知道有一个命令接受标准输入?它是 less 命令
我们用 less 来一页一页地显示任何命令的输出,命令把它的运行结果输送到标准输出

[me@linuxbox ~]$ ls -l /usr/bin | less

我们可以方便地检测会产生标准输出的任一命令的运行结果。

9 过滤器

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

我们想把目录/bin 和/usr/bin 中的可执行程序都联合在一起,再把它们排序,然后浏览执行结果:

[me@linuxbox ~]$ ls /bin /usr/bin | sort | less

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

10 uniq - 报道或忽略重复行

1)uniq 命令经常和 sort 命令结合在一起使用
2)默认情况下,从数据列表中删除任何重复行

eg:删除出现在目录/bin 和/usr/bin 中重名的程序

[me@linuxbox ~]$ ls /bin /usr/bin | sort | uniq | less

如果我们想看到重复的数据列表,让 uniq 命令带上 “-d” 选项

[me@linuxbox ~]$ ls /bin /usr/bin | sort | uniq -d | less

11 wc -打印行,字和字节数

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

[me@linuxbox ~]$ wc ls-output.txt
7902 64566 503634 ls-output.txt
[me@linuxbox ~]$ wc ls-output.txt
7902 64566 503634 ls-output.txt

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

wc接受标准输入。“-l” 选项限制命令输出只能报道行数,添加到管道线来统计数据,查看我们的有序列表中程序个数

[me@linuxbox ~]$ ls /bin /usr/bin | sort | uniq | wc -l
2728

12 grep -打印匹配行

1)grep 是个很强大的程序,用来找到文件中的匹配文本
2)grep 命令

grep pattern [file…]

3)grep的选项:
“-i” 导致 grep 忽略大小写当执行搜索时(通常,搜索是大小写敏感的)
“-v” 选项会告诉 grep 只打印不匹配的行

eg:我们想在我们的程序列表中,找到文件名中包含单词 “zip” 的所有文件。

[me@linuxbox ~]$ ls /bin /usr/bin | sort | uniq | grep zip
bunzip2
bzip2
gunzip

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

1)默认情况下,两个命令都打印十行文本,但是可以通过 “-n” 选项来调整命令打印的行数

[me@linuxbox ~]$ head -n 5 ls-output.txt
total 343496

[me@linuxbox ~]$ tail -n 5 ls-output.txt

它们也能用在管道线中:

[me@linuxbox ~]$ ls /usr/bin | tail -n 5
znew

2)tail 有一个选项允许你实时的浏览文件

当观察日志文件的进展时,这很有用,因为它们同时在被写入。在以下的例子里,我们要查看目录/var/log 里面的信息文件。在一些 Linux 发行版中,要求有超级用户权限才能阅读这些文件,因为文件/var/log/messages 可能包含安全信息。

[me@linuxbox ~]$ tail -f /var/log/messages
Feb 8 13:40:05 twin4 dhclient: DHCPACK from 192.168.1.1

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

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

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

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

[me@linuxbox ~]$ ls /usr/bin | tee ls.txt | grep zip
bunzip2
bzip2

猜你喜欢

转载自blog.csdn.net/u011436427/article/details/83268539