shell编程——文件的操作(二)

1    使用comm比较文件

comm [option] ... file1 file2

逐行比较两个有序的文件

默认情况下,comm命令会输出3列,分别为第1个文件独有的文本行、第2个文件独有的文本行,以及两个文件公共的文本行。用户可以使用-1、-2以及-3选项分别隐藏这三个列。

在输出结果中,每一行都是一条记录

2    使用diff比较文件

diff命令功能也是逐行比较多个文件的内容,与comm不同的是,diff命令并不要参与比较的文件是有序的。另外,diff不仅可以比较普通文件,而且还可以比较多个目录的内容的差异。

diff [option] ... files

-c:输出包含上下文环境的格式

-u:以统一格式显示文件的不同

-y:以并列的方式显示文件的异同之处

通常情况下,文件的内容的差异包括增加、删除和修改这三种操作,diff分别使用a、d、c这3个字母来表示这3种操作。

-c:

星号标注的是原始文件的内容的范围,连字符标注的是新文件中的内容范围

行首的感叹号表示两个文件对应行的内容被修改

+表示新增加的行

行首的空格表示没有发生改变的行

-u:

原始文件的信息以连字符-标注,而新文件的信息以加号+表示

3    文件描述符

从形式上讲,文件描述符是一个非负整数,实际上,它是一个索引值,指向内核为每个进程所维护的该进程打开文件的记录表。

当用户在shell中执行命令的时候,每个进程都和3个文件描述符相关联,并且使用这3个文件描述符来引用相关的文件:

标准输入的文件描述符为0,表示默认的输入文件,即shell需要执行命令的来源。通常情况下,标准输入的为键盘。但是标准输入也可以是文件或者其他的命令的输出,这需要使用输入重定向.

标准输出文件描述符为1,表示默认的输出文件,即显示shell命令的执行结果的地方。通常情况下,标准输出的设备为显示器,但也可以是其他的文件或者设备。

标准错误文件的描述符为2,标准shell命令的错误消息输出的地方。在默认情况下,标准错误与标准输出的设备相同,也是显示器,但也可以是其他文件或者设备。

在shell命令执行的时候,都会继承父进程的文件描述符,因此所有运行的shell命令,都会有默认3个文件描述符。

用户自定义的描述符不能用0 1 2这三个数字。

4    输出重定向(覆盖)

所谓输出重定向是指将原本输出到标准输出的数据输出到其他文件或者设备中:

cmd > file

在执行重定向操作时,如果目标文件file不存在,则重定向操作符会创建一个名称为file的空文件,然后向该文件写入数据;如果目标文件已经存在,则重定向符>会清空原始文件的内容,然后再向该文件写入数据。

eg.

ls -l /etc > filelist  //  不再显示到屏幕上,而是写入到文件中

完整语法:

cmd [n]> file

n表示 0 1 2

在执行输出重定向的时候,如果文件描述符被省略的话,则表示重定向的是标准输出。

ls -l /etc 1> filelist

文件描述符与大于号之间没有任何空格,大于号与后面的文件名之间的空格可有可无

用户还可以将标准输出重定向文件

ls -lz 1> filelist 2> errmsg

对于标准输出和标准错误的重定向,还有一种更简洁的语法:

ls -lz &> filelist

&代表标准输入和标准输出错误

linux中,/dev/null 是一个空设备,任何写入到该设备的疏数据都将被直接丢弃。因此用户想要把某个命令的输出信息和错误信息完全丢弃,可以使其重定向到/dev/null

ls -lz &> /dev/null

重定向操作符>会覆盖原始文件的内容,快速清空一个文件的内容或者创建一个新文件:

> errmsg

或:

:> errmsg

绝大部分shell还支持将一组命令的输出重定向:

{ cmd1;cmd2;cmd3;...; } [n]> file

多个命令用分号相隔,命令与左右大括号之间各保留一个空格,最后一条命令的结尾也要使用分号。

eg.

{ data;who; } &> message

5    输出重定向(追加)

>>操作符的功能与>基本相同,只是不会覆盖目标文件的内容,而是追加在已有文件的后面。

cmd [n]>> file

{ cmd1;cmd2;...; } [n]>> file

6    输入重定向

通常情况下,shell命令会从标准输入,即键盘读取用户的输入的数据,但是shell提供了另外一种读取用户输入的机制,即从文件中获取输入,这种机制称为输入重定向。

cmd < file

eg.

grep bae < students.txt

输入重定向默认的文件描述符为0,所以上述命令等价于:

grep bae 0< students.txt

输入重定向和输出重定向可以同时使用,表示从文件中读取数据,然后将执行结果输入到文件中:

grep bae > demo.txt < students.txt

7    当前文档

输入重定向的另外一个用途是生成当前文档,当前文档主要用在命令行中需要多行输入的情况,其基本语法为:

cmd << delimiter

document

delimiter

当shell遇到重定向操作符<<时,会一直读取用户的输入,直到遇到某一行,其中包含指定的分隔符delimiter。两个分隔符之间的行都属于命令cmd的标准输入。

delimiter不能含有空格或制表符。

eg.

cat << eof

> this is a test file

> there are two lines

> eof

this is a test file

there are two lines

8    重定向两个文件描述符

用户可以通过重定向操作将一个文件的描述符的输出重定向到另外一个文件描述符,即复制一个文件描述符:

n>&m

当n=1,m=2时,文件描述符1成为文件描述符2的副本,所以所有的标准输出都被重定向到标准错误。

当n=2,m=1时,文件描述符2成为文件描述符1的副本,所以所有的标准输出都被重定向到标准输出。

eg.

echo "hello world" 1>&2

等价于:

echo "hello world" >&2

echo "hello world" > message 2>&1   //    错误消息也被重定向到文件message中

9    使用exec命令分配文件描述符

用户可以使用exec命令创建新的文件描述符,并且将文件描述符绑定到文件或者另外一个文件描述符或者文件

你可能感兴趣的:(shell编程——文件的操作(二))