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 学习 --重定向的更多相关文章

  1. Linux入门基础(五):Linux管道,重定向,文本处理

    多命令协作:管道及重定向 在Linux中,大多数命令都很简单,每个命令往往只实现一个或几个很简单功能. 我们可以通过将不同功能的命令组合起来一起使用,达到完成某个复杂功能的目的 CLI下几乎所有的命令 ...

  2. 《Linux内核设计与实现》课本第五章学习笔记——20135203齐岳

    <Linux内核设计与实现>课本第五章学习笔记 By20135203齐岳 与内核通信 用户空间进程和硬件设备之间通过系统调用来交互,其主要作用有三个. 为用户空间提供了硬件的抽象接口. 保 ...

  3. Linux学习之管道符、重定向、通配符、转义符、环境变量

    Linux学习之管道符.重定向.通配符.转义符.环境变量 1. 输入输出重定向 输入重定向是指把文件导入命令中. 输出重定向是指把原本要输出到屏幕的数据信息写入指定文件中. a 标准输入重定向(STD ...

  4. Linux shell 重定向学习笔记

    在了解重定向之前,我们先来看看linux 的文件描述符. linux文件描述符:可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件的读 ...

  5. 《Linux内核分析》第五周学习总结

    <Linux内核分析>第五周学习总结                                  ——扒开系统调用的三层皮(下) 姓名:王玮怡 学号:20135116 1.给menu ...

  6. 《Linux内核设计与实现》第五章学习笔记

    <Linux内核设计与实现>第五章学习笔记 姓名:王玮怡  学号:20135116 一.与内核通信     在Linux中,系统调用是用户空间访问内核的唯一手段:除异常和陷入外,它们是内核 ...

  7. 《Linux内核分析》第五周学习笔记

    <Linux内核分析>第五周学习笔记 扒开系统调用的三层皮(下) 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.c ...

  8. LINUX内核分析第五周学习总结——扒开系统调用的“三层皮”(下)

    LINUX内核分析第五周学习总结--扒开系统调用的"三层皮"(下) 标签(空格分隔): 20135321余佳源 余佳源 原创作品转载请注明出处 <Linux内核分析>M ...

  9. Linux学习之用户管理命令与用户组管理命令(十五)

    Linux学习之用户管理命令与用户组管理命令 目录 用户管理命令 用户添加命令useradd 修改用户密码passwd 修改用户信息usermod 修改用户密码状态chage 删除用户userdel ...

随机推荐

  1. 学习Spring-Data-Jpa(十四)---自定义Repository

    有些时候,我们需要自定义Repository实现一些特殊的业务场景. 1.自定义单个Repository 1.1.首先提供一个片段接口和实现(接口的实现默认要使用Impl为后缀,实现本身不依赖spri ...

  2. VisualStudio 2019 Serials

    9DP6T-9AGWG-KWV33-9MPC8-JDCVF 7G2HE-JR8KL-ABB9D-Y7789-GLNFL U2PWU-H7D9H-69T3B-JEYC2-3R2NG R8R8P-MTT6 ...

  3. Windows 系统PowerShell或cmd设置添加静态路由方式

    电脑上添加静态路由,PowerShell或cmd设置路由 方法/步骤1.首先以管理员身份在“运行”窗口输入cmd或PowerShell(按WIN+R打开运行窗口),然后回车进入命令行,输入 route ...

  4. python学习笔记一: 《python3 input()函数》

    一.在学习之前需要先了解: 1.Python3.x 中 input() 函数接受一个标准输入数据,返回为 string 类型,即把任何输入看作str. 2.input可以用作文本输入,如用户名,密码框 ...

  5. mysql 数据插入insert

    mysql> select * from user; +------+----------+-----------+ | id | name | address | +------+------ ...

  6. hosts 屏蔽定位域名

    通过修改hosts屏蔽定位服务的域名 #屏蔽百度地图 1.0.0.1 api.map.baidu.com 1.0.0.1 ps.map.baidu.com 1.0.0.1 sv.map.baidu.c ...

  7. rust所有权

    所有权与函数 fn main() { let s = String::from("hello"); takes_ownership(s); //s的值移动到函数里 let x = ...

  8. 第09组 Beta冲刺(3/4)

    队名:软工9组 组长博客:https://www.cnblogs.com/cmlei/ 作业博客:https://edu.cnblogs.com/campus/fzu/SoftwareEngineer ...

  9. TOMCAT 可以稳定支持的最大并发用户数

      微软系统平台上 TOMCAT性能调优后可以稳定支持的最大并发用户数量在300人服务器配置:   单硬盘,SATA 8MB缓存测试服务器和loadrunner运行服务器位于同一网段 100MB网络( ...

  10. presto 日期函数和操作

    https://prestodb.github.io/docs/current/functions/datetime.html date '2012-08-08' + interval '2' day ...