Linux背景知识(三):高级文件操作

本文介绍较为高级的文件知识,算是进阶吧;主要分为文件重定向和文件过滤器(管道)两部分


目录


文件重定向(file redirection)

文件重定向(redirection)如其名表示将文件数据在传输中途定向到他处,这里文件的概念是广泛的,既可以是通常意义上的磁盘文件,也可以是存活于内存中的虚拟“文件”

流的概念

文件流(file stream)如同水流,可以传输、可以被截断;在bash脚本,分为三种不同的文件流,分别是:1. 输入流、2. 输出流、3. 错误流

Linux背景知识(三):高级文件操作

重定向流

既然流可以被截断,就说明它可以被重新定向

1. 输出重定向

Linux背景知识(三):高级文件操作

Linux背景知识(三):高级文件操作

使用>单箭头会覆盖原文件,使用>>则表示在文件末尾追加而不是覆盖,这一点因为太熟悉了就不举例子了XD

另外,使用set -o noclobber(还记得set命令用来设置环境变量)可以防止出现因为粗心使用单箭头而意外覆盖原文件的“血案”

Linux背景知识(三):高级文件操作

这是在我的zsh终端下的执行结果(zsh是完全兼容bash的),如果是bash则会显示如下内容

Linux背景知识(三):高级文件操作

如果想要临时打破noclobber的魔咒又不想要unset的麻烦,下面的命令(>|)会帮到你

Linux背景知识(三):高级文件操作

2. 错误重定向

之所以把错误重定向放到输出重定向之后,是因为它们都是关于“输出”,不同的是我们讲的输出重定向是指“正确输出”,而错误重定向则是“错误输出”

Linux背景知识(三):高级文件操作

Linux背景知识(三):高级文件操作

上面的命令把错误定向到/dev/null这个著名的“文件黑洞”,如果没有错误也就没有什么被传输到这个黑洞去了,不过考虑第一组重定向allfile.txt这个文件确实被创建出来了

Linux背景知识(三):高级文件操作

还可以使用2>&1把正确和错误的输出全部输出定向到文件里去

Linux背景知识(三):高级文件操作

Linux背景知识(三):高级文件操作

3. 输入重定向

使用<<<对文件进行输入重定向,它们是0<0<<的简写

结合使用输出和输入重定向可以实现“指定特定字符结束输入”的效果

Linux背景知识(三):高级文件操作

其实理解了输入重定向就可以写一点简单的小花样了,下面两行脚本代码的作用是一样的

Linux背景知识(三):高级文件操作


文件过滤器(file filter)

不妨想象一个筛子,只有大小合适(经过过滤的文件)才能被保留下来

在bash脚本中,我们用管道(pipe)创建过滤器,事实上二者往往被混为一谈,这也无可厚非——要把过滤器和重定向区别对待,重定向重在定向,而过滤器则重在过滤

为了测试我们的脚本,先用前面学到的知识创建一个文件

Linux背景知识(三):高级文件操作

1. cat命令

cat命令在管道中不没任何作用,可以看到只有第一组命令起作用了

Linux背景知识(三):高级文件操作

2. tee命令

tee命令在处理中间过程很有效,下面的命令将file输出重定向到终端输出到another并同时输出到终端

Linux背景知识(三):高级文件操作

3. grep命令

对正则略有了解的人对这个命令绝对是太熟悉了

Linux背景知识(三):高级文件操作

4. cut命令

cut命令每次读取一行,可以来自文件,也可以来自终端输入的临时字符串

Linux背景知识(三):高级文件操作

上面的命令先创建了一个文件,我故意既用了ASCII字符集的英文(8 bits)和Unicode格式的中文

Linux背景知识(三):高级文件操作

Linux背景知识(三):高级文件操作

同样该命令也可以用管道进行改写(等价于:cat aa.txt | cut -d ' ' -f 1

Linux背景知识(三):高级文件操作

5. tr命令

在管道流中使用tr命令快速对指定字符进行转换

Linux背景知识(三):高级文件操作

使用-d开关删除指定字符

Linux背景知识(三):高级文件操作

6. wc命令

“厕所命令”用来统计文件(作为最后一个参数,或者用管道)的:1. 行数、2. 字符数、3. 单词数

Linux背景知识(三):高级文件操作

7. sort命令

sort命令默认按照字母顺序对文件进行排序

Linux背景知识(三):高级文件操作

8. uniq命令

uniq命令全称unique,用来“去重”,它扫描文件的每一行,如果发现重复行,就只保留一个

Linux背景知识(三):高级文件操作

9. comm命令

comm命令用来『比较』文件(包括文件“流”)

Linux背景知识(三):高级文件操作

比较文件的另一个常用命令是diff

Linux背景知识(三):高级文件操作

10. od命令

od表示octal dump(八进制转储),即输出文件内容的八进制表示

Linux背景知识(三):高级文件操作

11. sed命令

虽然sed也支持正则,但它是用来编辑数据流的,即在传输过程中对其进行编辑(sed全称是stream editor),所以要把它和grep命令区别对待,另外至于re那只是一个概念,或者说适当的使用正则表达式是一种思维方式

熟练掌握sed命令让你在文本处理方面更强大,这里只举出几个我认为比较简单的例子;具体的还请查看官方文档!

Linux背景知识(三):高级文件操作