(五)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
公共的
模板
视频
图片
文档
下载
音乐
桌面