Linux命令行-重定向

Linux命令行-重定向

学习来源:TLCL (billie66.github.io)


标准输出重定向

I/O 重定向允许我们来重定义标准输出的地点。我们使用 “>” 重定向符后接文件名将标准输出重定向到除屏幕 以外的另一个文件。例如,我们可以告诉 shell 把 ls 命令的运行结果输送到文件 ls-output.txt 中去, 由文件代替屏幕。

 ls -l /usr/bin > ls-output.txt

我们把目录换成一个不存在的目录,收到一个错误信息。这讲得通,因为我们指定了一个不存在的目录

我们的输出文件长度为零!这是因为:当我们使用 “>” 重定向符来重定向输出结果时,目标文件总是从开头被重写。 因为我们 ls 命令没有产生运行结果,只有错误信息,重定向操作开始重写文件,然后 由于错误而停止,导致文件内容清空。事实上,如果我们需要清空一个文件内容(或者创建一个 新的空文件)

> ls-output.txt

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

为了不是从开头重写文件使用”>>“操作符,将导致输出结果添加到文件内容之后。如果文件不存在,文件会 被创建,就如使用了”>”操作符

 ls -l /usr/bin >> ls-output.txt

标准错误输出重定向

标准错误输出重定向没有专用的重定向操作符,为了重定向标准错误输出,我们必须用到其文件描述符。标准输入、标准输出和标准错误输出,shell 内部分别将其称为文件描述符0、1和2

ls -l /bin/usr 2> ls-error.txt

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

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

有时我们希望将一个命令的所有输出保存到一个文件。

第一个是传统的方法,首先重定向标准输出到文件 ls-output.txt,然后 重定向文件描述符2(标准错误输出)到文件描述符1(标准输出)使用表示法2>&1。注意重定向的顺序安排非常重要。标准错误输出的重定向必须总是出现在标准输出 重定向之后,要不然它不起作用

 ls -l /bin/usr > ls-output.txt 2>&1

现在的 bash 版本提供了第二种方法,我们使用单单一个表示法 &> 来重定向标准输出和错误到文件 ls-output.txt。

ls -l /bin/usr &> ls-output.txt

处理不需要的输出

有时候我们不想要一个命令的输出结果,只想把它们扔掉。这种情况 尤其适用于错误和状态信息。具体做法是重定向输出结果到一个叫做”/dev/null”的特殊文件。这个文件是系统设备,叫做数字存储桶,它可以 接受输入,并且对输入不做任何处理。为了丢掉命令错误信息

ls -l /bin/usr 2> /dev/null

标准输入重定向

cat - 连接文件

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

cat [file]

cat 经常被用来显示简短的文本文件。因为 cat 可以 接受不只一个文件作为参数,所以它也可以用来把文件连接在一起。比方说我们下载了一个 大型文件,这个文件被分离成多个部分(USENET 中的多媒体文件经常以这种方式分离), 我们想把它们连起来。如果文件命名为:

movie.mpeg.001 movie.mpeg.002 … movie.mpeg.099

我们能用这个命令把它们连接起来:

cat movie.mpeg.0* > movie.mpeg

如果 cat 没有给出任何参数,它会从标准输入读入数据,又因为标准输入默认情况下连接到键盘, 它正在等待我们输入数据!

cat
The quick brown fox jumped over the lazy dog.

下一步,输入 Ctrl-d(按住 Ctrl 键同时按下”d”),来告诉 cat,在标准输入中, 它已经到达文件末尾(EOF):

cat
The quick brown fox jumped over the lazy dog.
The quick brown fox jumped over the lazy dog.

由于没有文件名参数,cat 复制标准输入到标准输出,所以我们看到文本行重复出现。 我们可以使用这种行为来创建简短的文本文件。比方说,我们想创建一个叫做”lazy_dog.txt” 的文件,这个文件包含例子中的文本。我们这样做:

cat > lazy_dog.txt
The quick brown fox jumped over the lazy dog.

输入命令,其后输入要放入文件中的文本。记住,最后输入 Ctrl-d。通过使用这个命令,我们 实现了世界上最低能的文字处理器!看一下运行结果,我们使用 cat 来复制文件内容到 标准输出:

cat lazy_dog.txt
The quick brown fox jumped over the lazy dog.

管道线

命令从标准输入读取数据并输送到标准输出的能力被一个称为管道线的 shell 功能所利用。 使用管道操作符”|”(竖杠),一个命令的标准输出可以通过管道送至另一个命令的标准输入:

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

ls -l /usr/bin | less

使用这项技术,我们可以方便地检测会产生标准输出的任一命令的运行结果。

过滤器

管道线经常用来对数据完成复杂的操作。有可能会把几个命令放在一起组成一个管道线。 通常,以这种方式使用的命令被称为过滤器。想象一下,我们想把目录/bin 和/usr/bin 中 的可执行程序都联合在一起,再把它们排序,然后浏览执行结果:

ls /bin /usr/bin | sort | less

ls 命令的输出结果由有序列表组成, 各自针对一个目录。通过在管道线中包含 sort,我们改变输出数据,从而产生一个 有序列表。

uniq - 报道或忽略重复行

uniq 命令经常和 sort 命令结合在一起使用。uniq 从标准输入或单个文件名参数接受数据有序 列表(详情查看 uniq 手册页),默认情况下,从数据列表中删除任何重复行。如果我们想看到 重复内容,让 uniq 命令带上”-d”选项

ls /bin /usr/bin | sort | uniq -d | less

wc - 打印行数、字数和字节数

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

wc ls-output.txt
7902 64566 503634 ls-output.txt

”-l”选项限制命令输出只能 报道行数。添加 wc 到管道线来统计数据,是个很便利的方法。查看我们的有序列表中程序个数,

ls /bin /usr/bin | sort | uniq | wc -l
2728

grep - 打印匹配行

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

ls /bin /usr/bin | sort | uniq | grep zip
bunzip2
bzip2
gunzip
...

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

head 命令打印文件的前十行,而 tail 命令打印文件的后十行。默认情况下,两个命令 都打印十行文本,但是可以通过”-n”选项来调整命令打印的行数。

head -n 5 ls-output.txt
tail -n 5 ls-output.txt

也能用在管道线中:

 ls /usr/bin | tail -n 5

ad 命令打印文件的前十行,而 tail 命令打印文件的后十行。默认情况下,两个命令 都打印十行文本,但是可以通过”-n”选项来调整命令打印的行数。

head -n 5 ls-output.txt
tail -n 5 ls-output.txt

也能用在管道线中:

 ls /usr/bin | tail -n 5
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值