TLCL Reading notes 3 - WBowam/wbowam.github.com GitHub Wiki

Date: 2015-03-30
Title: TLCL 看书笔记(3)
Tags: TLCL
Category: Reading

笔记开始

命令行最酷的特性。它叫做 I/O 重定向

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

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

把标准输出写入(重定向)到文件

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

把标准输出追加到(重定向)到文件(在文件末尾继续添加)

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

原来如此 往标准输出写入东西,可以达到往别人屏幕输出东西的目的吗?

命令的输入来自文件,输出也存至文件

哈哈,在Unix一切都是文件

我们用到的许多程序都会产生某种输出.这种输出,经常由两种类型组成. 第一,程序的运行结果(程序要完成的功能所在) 第二,状态或错误信息(程序的进展)

输出结果都会写入到某种文件吗?

观察一下会发现,很多程序的这两种结果都会输出在屏幕上

其实与Unix主题"任何东西都是文件"保持一致,程序会把上述两种结果输送到两个叫做标准输出(stdout)和标准错误(stderr)的文件.

默认情况下,标准输出和标准输入都会连接到屏幕上

那可不可以这样子:往别人电脑的标准输出写入message,达到聊天的目的????

类似,程序会从标准输入读取输入.标准输出默认连接到键盘.

这里好抽象了一个层面啊.屏幕怎么连接到标准输出;键盘怎么连接到标准输入?

I/O重定向其实就是允许我们更改输出走向和输入来向. 默认的输入来自键盘,输出去向屏幕.

重定向标准输出到另一个文件(除了屏幕),我们使用">"重定向符号.

这种做法应该很有用吧.....

有时候吧结果输出到另外一个文件很有用处.

实例(干货来也)

#看看标准输入,标准输出和标准错误
$ ls test test1.txt   
ls: cannot access test1.txt: No such file or directory
test:
index.html  main.js  styles.css
#输出标准输出到文件
$ ls test test1.txt >result.txt
ls: cannot access test1.txt: No such file or directory
$ cat test2.txt   
test:
index.html
main.js
styles.css

默认情况下可以缩写"1>"(上述命令相当于 ls test test1.txt 1>result.txt); 标准错误照样输出到屏幕

#标准错误也输出到文件
ls test test1.txt 1>result.txt 2>err.txt
#有时候我们想把结果追加写入文件而不是覆盖写入
ls test test1.txt 1>>result.txt 2>>err.txt
#有时候我们需要丢掉错误信息
ls test test1.txt 1>>result.txt 2>>/dev/null
#可以缩写为
ls test test1.txt 1>>result.txt 2>>&-

/dev/null是linux黑洞,当垃圾箱用

#于是有人关掉所有的输出
ls test test1.txt 1>&- 2>&-
#可以缩写为
ls test test1.txt 1>&- 2>&1
#或
ls test test1.txt &>/dev/null

一直在说标准输出和标准错误

重定向标准输入

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

-- 原来如此啊 -- 是的

于是cat有了个强大的功能

combine file segments

说道这个,可以看看我是怎么做分割与合并文件了

cat seg-* > result.txt

不给cat任何参数,它会读取标准输入,输出到标准输出

#输入cat,输入一些文本,按Ctrl+D结束
$ cat 
sdfdsgdsg
sgdfgdf
sdfdsgdsg
sgdfgdf

通过这个可爱的命令,我们可以实现世界上最小巧的文件创建器

cat > new_file.txt

怎么还没提过标准输入啊

想想下面的命令是如何重定向标准输入的

cat < from.txt

cat默认会读取标准输入,转输出到标准输出.这里把from.txts输出到标准输入了

再看看下面的几个例子

cat > catfile 
testing 
cat file test
#这里按下 [ctrl]+d 离开 
#从标准输入【键盘】获得数据,然后输出给catfile文件
 
cat>catfile <test.sh
#cat 从test.sh 获得输入数据,然后输出给文件catfile 
 
cat>catfile <<eo
test a file
test!
eof
 
#<< 这个连续两个小符号, 他代表的是『结束的输入字符』的意思。这样当空行输入eof字符,输入自动结束,不用ctrl+D

第二个和第三个例子里,为什么先执行后面呢?

管道

使用管道操作符"|"(竖杠),一个命令的 标准输出可以管道到另一个命令的标准输入

command1 | command2

命令一的标准输出重定向到命令二的标准输入.如在统计目录内的文件总数ls | wc -l

过滤器

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

其实是这样的

command1 | 过滤 | command2

过滤一下命令一的结果,重定向到命令二的标准输入

$ ls /bin /usr/bin | sort | less

sort 用于产生一个 有序列表

$ ls /bin /usr/bin | sort | uniq | less

uniq 忽略重复行

wc -打印行,字和字节数

$ wc ls-output.txt

7902 64566 503634 ls-output.txt $ ls /bin /usr/bin | sort | uniq | wc -l 2736


#### **grep**
>grep -打印匹配行
>```
>grep pattern [file...]
>```
>grep 能够匹配的模式可以 很复杂,但是现在我们把
注意力集中在简单文本匹配上面。在后面的章节中,我们将会研究 高级模式,叫做正则表达式。

>grep :"-i"忽略大小写(通常,搜索是大小写 敏感的),
**"-v"选项会告诉 grep 只打印不匹配的行。**

#### **tailf**
>head / tail -打印文件开头部分/结尾部分
`$ head -n 5 ls-output.txt`
`$ tail -n 5 ls-output.txt`
管道线中
`$ ls /usr/bin | tail -n 5`     
实时的浏览文件    
`tail -f /var/log/messages`    
或     
`tailf /var/log/messages`