(五)linux 学习 --重定向
The Linux Command Line 读书笔记 - 部分内容来自 http://billie66.github.io/TLCL/book/chap07.html
文章目录
标准输入、输出、错误
Linux 系统中一切都是文件,标准输入、输出、错误都被看成是特殊的文件。其中标准输出、错误通常链接到显示器上,因此可以在显示器看到标准输出、错误。标准输入通常连接到键盘,因此,可以通过键盘进行录入。
标准输出重定向
标准输出默认是连接到显示器,因此,输出在显示器上,我们可更改标准输出到其他地方,比如更改到文件中,则输出不会在显示器上出现,相反输出会出现在文件中。
使用 > 重定向符,进行标准输出的重定向。

输出被保存到 haha.txt 中了。
> 每次重定向都会把目标输出文件覆盖,如果不想覆盖改用 >>,变为追加 ,其中目标输出文件
不存在,会被自动创建。
如果直接使用 > ,前面没有任何命令,则会清空后面跟随的目标输出文件。

标准错误重定向
标准错误输出没有 > 这种重定向符。
程序可以在几个编号的不同文件流上面任意一个流上进行输出。前三个流的编号分为 0,1,2 ,分别代表标准输入、输出、错误。
shell 还提供了另外一种方法来表示重定向文件。因为标准错误和文件描述符2一样,我们用这种 表示法来重定向标准错误:
[me@linuxbox ~]$ ls -l /bin/usr 2> ls-error.txt
标准输出、错误到同一个文件
可能有这种情况,我们希望捕捉一个命令的所有输出到一个文件。为了完成这个,我们 必须同时重定向标准输出和标准错误。有两种方法来完成任务。第一个,传统的方法, 在旧版本 shell 中也有效:
注意重定向的顺序安排非常重要。标准错误的重定向必须总是出现在标准输出 重定向之后,要不然它不起作用。
[me@linuxbox ~]$ ls -l /bin/usr > ls-output.txt 2>&1
命令的理解,首先完成标准输出的重定向,然后用 2 代表标准错误, >& 表示添加到后面的 1 也就是标准输出,表示将 2 也一并重定向到 1 中。书上说的 标准错误的重定向必须总是出现在标准输出 重定向之后 我测试发现,可以不是这样,但是必须要保证 >& 在后面使用,然后再使用文件流的编号:
yiaz@yiaz-virtual-machine:~$ ls ./sss 2>>haha.txt 1>&2
使用这种方法,我们完成两个重定向。首先重定向标准输出到文件 ls-output.txt,然后 重定向文件描述符2(标准错误)到文件描述符 1(标准输出)使用表示法 2>&1。
新版本中也提供了简化的命令,使用 &>:
[me@linuxbox ~]$ ls -l /bin/usr &> ls-output.txt
处理不需要的输出
Unix 中有个系统自带的设备叫 位存储桶 特殊文件,位于 /dev/null 。它可以 接受输入,并且对输入不做任何处理。
如果不想看到命令的输出,可以将其输出重定向到 位存储桶:
yiaz@yiaz-virtual-machine:~$ less h.txt > /dev/null
标准输入重定向
使用 < 重定向符。
在下面的几个命令中讲解标准输入重定向。
cat 命令
cat命令读取一个或多个文件,然后复制它们到标准输出cat可以一次性读取多个文件拼接输出,或者将拼接的文件重定向其他地方:yiaz@yiaz-virtual-machine:~$ cat h.txt haha.txt > new.txt
如果
cat没有给出任何参数,它会从标准输入读入数据,输入结束使用Ctrl + d表示EOF结束。利用第二条,不给任何参数,然后重定向输出到其他文件,可以完成从键盘读取录入文本的操作。
yiaz@yiaz-virtual-machine:~$ cat > myTxt.yaiz
this is my input ,
and now i want to say goodbay!
goodboy! yiaz@yiaz-virtual-machine:~$ cat myTxt.yaiz
this is my input ,
and now i want to say goodbay!
goodboy! yiaz@yiaz-virtual-machine:~$
使用
<将cat的标准输入重定向到文本,也可以完成文本的复制yiaz@yiaz-virtual-machine:~$ cat < myTxt.yaiz
this is my input ,
and now i want to say goodbay!
goodboy!yiaz@yiaz-virtual-machine:~$ cat < myTxt.yaiz >myTxt2.txt yiaz@yiaz-virtual-machine:~$ cat < myTxt2.txt
this is my input ,
and now i want to say goodbay!
goodboy! yiaz@yiaz-virtual-machine:~$
管道线
命令从标准输入读取数据并输送到标准输出的能力被一个称为管道线的 shell 特性所利用。
使用管道操作符 |(竖杠),一个命令的标准输出可以通过管道送至另一个命令的标准输入。
[me@linuxbox ~]$ ls -l /usr/bin | less
首先 ls -l /usr/bin 产生一个标准输出,随后被 | 管道线送到 less 那,当做标准输入。
过滤器
管道线经常用来对数据完成复杂的操作。有可能会把几个命令放在一起组成一个管道线。 通常,以这种方式使用的命令被称为过滤器。过滤器接受输入,以某种方式改变它,然后输出它。
想象一下,我们想把目录/bin 和/usr/bin 中 的可执行程序都联合在一起,再把它们排序,然后浏览执行结果:
[me@linuxbox ~]$ ls /bin /usr/bin | sort | less
命令的理解,就是类似于击鼓传花一样,一个一个传递下去。
uniq - 报道或忽略重复行
如果不带参数,则是去除重复行,带上参数 -d 则是仅显示重复行。
uniq 命令只能去除排好序的行,因此重复行必须是相邻的才行 。
-c 显示重复的行的数量,-d 仅仅显示重复的行。
yiaz@yiaz-virtual-machine:~$ cat haha2.txt
aaa
bbb
aaa
ccc
aa
bbb
ddd
yiaz@yiaz-virtual-machine:~$ cat haha2.txt | sort | uniq -c
1 aa
2 aaa
2 bbb
1 ccc
1 ddd
yiaz@yiaz-virtual-machine:~$ cat haha2.txt | sort | uniq -d
aaa
bbb
yiaz@yiaz-virtual-machine:~$ cat haha2.txt | sort | uniq -cd
2 aaa
2 bbb
yiaz@yiaz-virtual-machine:~$
wc - 打印行数、字数和字节数
wc(字计数)命令是用来显示文件所包含的 行数、单词数 和 字节数。
yiaz@yiaz-virtual-machine:~$ cat haha2.txt
aaa
bbb
aaa
ccc
aa
bbb
ddd
yiaz@yiaz-virtual-machine:~$ wc haha2.txt
7 7 27 haha2.txt
如果不带参数,则接收命令行输入:
yiaz@yiaz-virtual-machine:~$ wc
asasaaas asas as as as
1 5 23
因此,可以利用这个特性使用管道符,完成一些统计:
yiaz@yiaz-virtual-machine:~$ ls / | wc -l
26
wc 带上参数 -l 代表只显示行数,这里就统计了根目录 / 下面的目录总数,一共 26 个。
grep - 打印匹配行
grep 是个很强大的程序,用来找到文件中的匹配文本。这里只介绍最简单的匹配,以后介绍难的,难的就是正则表达式,一般学过编程的,都学过正则表达式。
yiaz@yiaz-virtual-machine:~$ ls -l
总用量 68
-rw-r--r-- 1 yiaz yiaz 8980 1月 3 2019 examples.desktop
-rw-r--r-- 1 yiaz yiaz 0 7月 10 17:31 haha1.txt
-rw-r--r-- 1 yiaz yiaz 27 7月 10 19:29 haha2.txt
-rw-r--r-- 1 yiaz yiaz 269 7月 10 17:51 haha.txt
-rw-r--r-- 1 yiaz yiaz 269 7月 10 17:56 h.txt
-rw-r--r-- 1 yiaz yiaz 58 7月 10 18:17 myTxt2.txt
-rw-r--r-- 1 yiaz yiaz 58 7月 10 18:14 myTxt.yaiz
-rw-r--r-- 1 yiaz yiaz 538 7月 10 18:06 new.txt
-rw-r--r-- 1 yiaz yiaz 0 7月 10 17:32 sss.txt
drwxr-xr-x 2 yiaz yiaz 4096 1月 3 2019 公共的
drwxr-xr-x 2 yiaz yiaz 4096 1月 3 2019 模板
drwxr-xr-x 2 yiaz yiaz 4096 1月 3 2019 视频
drwxr-xr-x 2 yiaz yiaz 4096 7月 5 19:52 图片
drwxr-xr-x 2 yiaz yiaz 4096 1月 3 2019 文档
drwxr-xr-x 2 yiaz yiaz 4096 7月 5 16:42 下载
drwxr-xr-x 3 yiaz yiaz 4096 7月 5 16:47 音乐
drwxr-xr-x 4 yiaz yiaz 4096 7月 5 19:42 桌面
yiaz@yiaz-virtual-machine:~$ ls -l | grep haha
-rw-r--r-- 1 yiaz yiaz 0 7月 10 17:31 haha1.txt
-rw-r--r-- 1 yiaz yiaz 27 7月 10 19:29 haha2.txt
-rw-r--r-- 1 yiaz yiaz 269 7月 10 17:51 haha.txt
yiaz@yiaz-virtual-machine:~$ ls -l | grep *.txt
haha.txt:haha1.txt
h.txt:haha1.txt
new.txt:haha1.txt
new.txt:haha1.txt
grep 有一些方便的选项:”-i”使得 grep 在执行搜索时忽略大小写(通常,搜索是大小写 敏感的),”-v”选项会告诉 grep 只打印不匹配的行。
head / tail - 打印文件开头部分/结尾部分
有时候你不需要一个命令的所有输出。可能你只想要前几行或者后几行的输出内容。 head 命令打印文件的前十行,而 tail 命令打印文件的后十行。默认情况下,两个命令 都打印十行文本,但是可以通过”-n”选项来调整命令打印的行数 。可以搭配管道符使用。
yiaz@yiaz-virtual-machine:~$ cat haha2.txt
aaa
bbb
aaa
ccc
aa
bbb
ddd
yiaz@yiaz-virtual-machine:~$ cat haha2.txt | head -n 2
aaa
bbb
yiaz@yiaz-virtual-machine:~$ cat haha2.txt | tail -n 2
bbb
ddd
tail 有一个选项允许你 实时 地浏览文件。当观察日志文件的进展时,这很有用,因为 它们同时在被写入。
使用”-f”选项,tail 命令继续监测这个文件,当新的内容添加到文件后,它们会立即 出现在屏幕上。这会一直继续下去直到你输入 Ctrl + c。
tee
从 Stdin 读取数据,并同时输出到 Stdout 和文件。
为了和我们的管道隐喻保持一致,Linux 提供了一个叫做 tee 的命令,这个命令制造了 一个”tee”,安装到我们的管道上。tee 程序从标准输入读入数据,并且同时复制数据 到标准输出(允许数据继续随着管道线流动)和一个或多个文件。
意思是说,我们使用管道符的时候,击鼓传花一样,必须保证前一个输出到标准输出,然后管道里面才会有数据,继续传下去,否则其中一环输出到其他地方,后面的过滤器就是没有意义的。
现在,我们在操作的时候,需要在其中的某一环将输出送到其他文件中保存下,标注输出重定向以后,后面的过滤器就没有意义了。因此,可以在需要重定向输出的时候,使用 tee ,复制一份输出留在管道中。
tee 有个选选项 -a 追加添加到文本中。
yiaz@yiaz-virtual-machine:~$ ls | tee haha2.txt | cat
examples.desktop
haha1.txt
haha2.txt
haha.txt
h.txt
myTxt2.txt
myTxt.yaiz
new.txt
sss.txt
tee
公共的
模板
视频
图片
文档
下载
音乐
桌面
yiaz@yiaz-virtual-machine:~$ cat haha2.txt
examples.desktop
haha1.txt
haha2.txt
haha.txt
h.txt
myTxt2.txt
myTxt.yaiz
new.txt
sss.txt
tee
公共的
模板
视频
图片
文档
下载
音乐
桌面
(五)linux 学习 --重定向的更多相关文章
- Linux入门基础(五):Linux管道,重定向,文本处理
多命令协作:管道及重定向 在Linux中,大多数命令都很简单,每个命令往往只实现一个或几个很简单功能. 我们可以通过将不同功能的命令组合起来一起使用,达到完成某个复杂功能的目的 CLI下几乎所有的命令 ...
- 《Linux内核设计与实现》课本第五章学习笔记——20135203齐岳
<Linux内核设计与实现>课本第五章学习笔记 By20135203齐岳 与内核通信 用户空间进程和硬件设备之间通过系统调用来交互,其主要作用有三个. 为用户空间提供了硬件的抽象接口. 保 ...
- Linux学习之管道符、重定向、通配符、转义符、环境变量
Linux学习之管道符.重定向.通配符.转义符.环境变量 1. 输入输出重定向 输入重定向是指把文件导入命令中. 输出重定向是指把原本要输出到屏幕的数据信息写入指定文件中. a 标准输入重定向(STD ...
- Linux shell 重定向学习笔记
在了解重定向之前,我们先来看看linux 的文件描述符. linux文件描述符:可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件的读 ...
- 《Linux内核分析》第五周学习总结
<Linux内核分析>第五周学习总结 ——扒开系统调用的三层皮(下) 姓名:王玮怡 学号:20135116 1.给menu ...
- 《Linux内核设计与实现》第五章学习笔记
<Linux内核设计与实现>第五章学习笔记 姓名:王玮怡 学号:20135116 一.与内核通信 在Linux中,系统调用是用户空间访问内核的唯一手段:除异常和陷入外,它们是内核 ...
- 《Linux内核分析》第五周学习笔记
<Linux内核分析>第五周学习笔记 扒开系统调用的三层皮(下) 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.c ...
- LINUX内核分析第五周学习总结——扒开系统调用的“三层皮”(下)
LINUX内核分析第五周学习总结--扒开系统调用的"三层皮"(下) 标签(空格分隔): 20135321余佳源 余佳源 原创作品转载请注明出处 <Linux内核分析>M ...
- Linux学习之用户管理命令与用户组管理命令(十五)
Linux学习之用户管理命令与用户组管理命令 目录 用户管理命令 用户添加命令useradd 修改用户密码passwd 修改用户信息usermod 修改用户密码状态chage 删除用户userdel ...
随机推荐
- 05-Flutter移动电商实战-dio基础_引入和简单的Get请求
这篇开始我们学习Dart第三方Http请求库dio,这是国人开源的一个项目,也是国内用的最广泛的Dart Http请求库. 1.dio介绍和引入 dio是一个强大的Dart Http请求库,支持Res ...
- JavaScript基础04——数组的创建及方法
数组的概念及定义 数组的概念: 一组数据,数据的组和 哪些数据的组和,只要是数据(所有数据),就可以放在数组中 数组的意义: 可以同时操作多个数据 数组 ...
- 多条件查询----补发周一内容(六级让我忽略了JAVA)
周一测试多条件查询 要求仿照知网高级查询页面重构期中考试多条件查询功能,可以根据志愿者姓名.性别.民族.政治面目.服务类别.注册时间六种条件实现模糊查询,输出结果以列表形式显示,显示姓名.性别,民族. ...
- WinDbg常用命令系列---!analyze
!analyze命令简介 这个!analyze扩展显示有关当前异常或错误检查的信息. 用户模式: !analyze [-v] [-f | -hang] [-D BucketID] !analyze - ...
- 让你的shell更体贴
使用shell的时候很多,特别是拉幕式终端,使用时更加方便,同时可以利用 echo "Did you know that:" ;whatis $(ls /bin | shuf -n ...
- php中socket、fsockopen、curl、stream 区别
socket 水泥.沙子,底层的东西fsockopen 水泥预制件,可以用来搭房子curl 毛坯房,自己装修一下就能住了 水泥.沙子不但可以修房子,还能修路.修桥.大型雕塑.socket也是,不但可以 ...
- mark_rabbitMQ
一.1.6 和1.7的区别 二.63跟65好像有点差异 有些jar包问题 三.预取策略 https://blog.csdn.net/hry2015/article/details/79078312 四 ...
- docker 进程管理
详文:理解Docker容器的进程管理:https://yq.aliyun.com/articles/5545 在Docker中,每个Container都是Docker Daemon的子进程. dock ...
- 联合主键SQL 联合索引
联合主键索引 联合索引 ALTER TABLE [dbo].[Tb_Shop] ADD CONSTRAINT [shopno] UNIQUE NONCLUSTERED ( [ShopGid] ASC, ...
- 【LeetCode算法-21】Merge Two Sorted Lists
LeetCode第21题 Merge two sorted linked lists and return it as a new list. The new list should be made ...