笔记开始¶
命令行最酷的特性。它叫做 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.txt
s输出到标准输入了
再看看下面的几个例子
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