一、Linux的文件
linux中奉行一切皆文件,包括目录、链接(类似windows的快捷方式)、设备文件。
在内核中,所有打开的文件都使用文件描述符(一个非负整数)标记。文件描述符的变化范围是0~OPEN_MAX – 1。早期的unix系统中,每个进程最多可以同时打开20个文件,就是说文件描述符的范围为0~19,但是现在很多系统将其增加到0~63。
二、重定向
Linux系统中标准的输入设备为键盘,输出设备为屏幕,有时,我们希望能从键盘以外的其他设备读取数据,或者将数据送到屏幕外的其他设备,这种情况叫做重定向。
为何要使用命令输出重定向
• 当屏幕输出的信息很重要,而且我们需要将他存下来的时候;
• 背景执行中的程序,不希望他干扰屏幕正常的输出结果时;
• 一些系统的例行命令(例如写在 /etc/crontab 中的文件)的执行结果,希望他可以存下来时;
• 一些执行命令,我们已经知道他可能的错误讯息,所以想以『 2> /dev/null 』将他丢掉时;
• 错误讯息与正确讯息需要分别输出时。
1.重定向符号
> 输出重定向到一个文件或设备 覆盖原来的文件。
>! 输出重定向到一个文件或设备 强制覆盖原来的文件。
>> 输出重定向到一个文件或设备 追加原来的文件
< 输入重定向到一个程序
2. 错误重定向
2>将一个标准错误输出重定向到一个文件或设备 覆盖原来的文件b-shell。
2>>将一个标准错误输出重定向到一个文件或设备 追加到原来的文件。
2>&1将一个标准错误输出重定向到标准输出。
>& 将一个标准错误输出重定向到一个文件或设备 覆盖原来的文件c-shell。
3.命令重定向示例
在 bash 命令执行的过程中,主要有三种输出入的状况,分别是:
1. 标准输入;代码为 0 ;或称为 stdin ;
2. 标准输出:代码为 1 ;或称为 stdout;
3. 错误输出:代码为 2 ;或称为 stderr;
[test @test test]# ls –al > list.txt
将显示的结果输出到 list.txt 文件中,若该文件已存在则予以取代!
[test @test test]# ls –al >> list.txt
将显示的结果累加到 list.txt 文件中,该文件为累加的,旧数据保留!
[test @test test]# ls –al 1> list.txt 2> list.err
将显示的数据,正确的输出到 list.txt 错误的数据输出到 list.err
[test @test test]# ls -al 1> list.txt 2> &1
将显示的数据,不论正确或错误均输出到 list.txt 当中!错误与正确文件输出到同一个文件中,则必须以上面的方法来写!不能写成其它格式!
[test @test test]# ls -al 1> list.txt 2> /dev/null
将显示的数据,正确的输出到 list.txt 错误的数据则予以丢弃! /dev/null ,可以说成是黑洞装置。为空,即不保存。
三、管道
管道是一种两个进程间进行单向通信的机制。因为管道传递数据的单向性,管道又称为半双工管道。管道的这一特点决定了器使用的局限性。管道是Linux支持的最初Unix IPC形式之一,具有以下特点:
数据只能由一个进程流向另一个进程(其中一个读管道,一个写管道);如果要进行双工通信,需要建 立两个管道。
管道只能用于父子进程或者兄弟进程间通信。,也就是说管道只能用于具有亲缘关系的进程间通信。
除了以上局限性,管道还有其他一些不足,如管道没有名字(匿名管道),管道的缓冲区大小是受限制的。管道所传输的是无格式的字节流。这就需要管道输入方和输出方事先约定好数据格式。虽然有那么多不足,但对于一些简单的进程间通信,管道还是完全可以胜任的。
管道可以将第一个命令的输出通过管道传给第二个命令,作为第二个命令的输入,使用的符号是“|”
1.命令介绍:
tee的功能
功能说明:读取标准输入的数据,并将其内容输出成文件。
语 法:tee [-ai][--help][--version][文件…]
补充说明:tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。我们可利用tee把管道导入的数据存成文件,甚至一次保存数份文件。
参 数:-a 附加到既有文件的后面,而非覆盖它。如果给予tee指令的文件名称已经存在,预设会覆盖该文件的内容。加上此参数后,数据会新增在该文件内容的最后面,而不会删除原先之内容。
-i 忽略中断信号
--help 在线帮助
--version 显示版本信息
|xargs
管道是实现“将前面的标准输出作为后面的标准输入”,xargs是实现“将标准输入作为命令的参数”,你可以试试运行代码:
之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了xargs命令例如:
echo "--help"|cat
echo "--help"|xargs cat
例如:删除数量比较多的文件
ls | xargs -n 20 rm -fr
ls当然是输出所有的文件名(用空格分割)
xargs就是将ls的输出,每20个为一组(以空格为分隔符),作为rm -rf的参数
也就是说将所有文件名20个为一组,由rm -rf删除,这样就不会超过命令行的长度了。
三、练习
将当前目录中的所有文件信息保存到info文件中:
在当前目录下创建文件file1和file2,分别写入内容,并将两个文件合并为新文件newfile:
向文件newfile中追加内容“hello world!”:
查看/etc目录中的文件信息,如有错误,保存在error文件中:
统计当前目录下的newfile中含有“hello”单词的行数:
搜索当前目录下名字为“newfile”的文件,并用cat命令显示文件的内容:
列出文本文件newfile的内容,同时复制3份副本,文件名称分别为ss-copy1、ss-copy2、ss-copy3