Linux背景知识(三):高级文件操作
本文介绍较为高级的文件知识,算是进阶吧;主要分为文件重定向和文件过滤器(管道)两部分
目录
文件重定向(file redirection)
文件重定向(redirection)如其名表示将文件数据在传输中途定向到他处,这里文件的概念是广泛的,既可以是通常意义上的磁盘文件,也可以是存活于内存中的虚拟“文件”
流的概念
文件流(file stream)如同水流,可以传输、可以被截断;在bash脚本,分为三种不同的文件流,分别是:1. 输入流、2. 输出流、3. 错误流
重定向流
既然流可以被截断,就说明它可以被重新定向
1. 输出重定向
使用>
单箭头会覆盖原文件,使用>>
则表示在文件末尾追加而不是覆盖,这一点因为太熟悉了就不举例子了XD
另外,使用set -o noclobber
(还记得set
命令用来设置环境变量)可以防止出现因为粗心使用单箭头而意外覆盖原文件的“血案”
这是在我的zsh
终端下的执行结果(zsh是完全兼容bash的),如果是bash则会显示如下内容
如果想要临时打破noclobber
的魔咒又不想要unset
的麻烦,下面的命令(>|
)会帮到你
2. 错误重定向
之所以把错误重定向放到输出重定向之后,是因为它们都是关于“输出”,不同的是我们讲的输出重定向是指“正确输出”,而错误重定向则是“错误输出”
上面的命令把错误定向到/dev/null
这个著名的“文件黑洞”,如果没有错误也就没有什么被传输到这个黑洞去了,不过考虑第一组重定向allfile.txt这个文件确实被创建出来了
还可以使用2>&1
把正确和错误的输出全部输出定向到文件里去
3. 输入重定向
使用<
、<<
对文件进行输入重定向,它们是0<
、0<<
的简写
结合使用输出和输入重定向可以实现“指定特定字符结束输入”的效果
其实理解了输入重定向就可以写一点简单的小花样了,下面两行脚本代码的作用是一样的
文件过滤器(file filter)
不妨想象一个筛子,只有大小合适(经过过滤的文件)才能被保留下来
在bash脚本中,我们用管道(pipe)创建过滤器,事实上二者往往被混为一谈,这也无可厚非——要把过滤器和重定向区别对待,重定向重在定向,而过滤器则重在过滤
为了测试我们的脚本,先用前面学到的知识创建一个文件
1. cat命令
cat命令在管道中不没任何作用,可以看到只有第一组命令起作用了
2. tee命令
tee命令在处理中间过程很有效,下面的命令将file输出重定向到终端输出到another并同时输出到终端
3. grep命令
对正则略有了解的人对这个命令绝对是太熟悉了
4. cut命令
cut命令每次读取一行,可以来自文件,也可以来自终端输入的临时字符串
上面的命令先创建了一个文件,我故意既用了ASCII字符集的英文(8 bits)和Unicode格式的中文
同样该命令也可以用管道进行改写(等价于:cat aa.txt | cut -d ' ' -f 1
)
5. tr命令
在管道流中使用tr命令快速对指定字符进行转换
使用-d
开关删除指定字符
6. wc命令
“厕所命令”用来统计文件(作为最后一个参数,或者用管道)的:1. 行数、2. 字符数、3. 单词数
7. sort命令
sort命令默认按照字母顺序对文件进行排序
8. uniq命令
uniq命令全称unique,用来“去重”,它扫描文件的每一行,如果发现重复行,就只保留一个
9. comm命令
comm命令用来『比较』文件(包括文件“流”)
比较文件的另一个常用命令是diff
10. od命令
od表示octal dump(八进制转储),即输出文件内容的八进制表示
11. sed命令
虽然sed也支持正则,但它是用来编辑数据流的,即在传输过程中对其进行编辑(sed全称是stream editor),所以要把它和grep命令区别对待,另外至于re那只是一个概念,或者说适当的使用正则表达式是一种思维方式
熟练掌握sed命令让你在文本处理方面更强大,这里只举出几个我认为比较简单的例子;具体的还请查看官方文档!