一、Shell文件描述字(0,1,2)
1、0:STDIN 标准输入
标准输入默认为键盘,文件,管道(pipe |).设备文件名为/dev/stdin
2、1:STDOUT 标准输出
标准输出为终端(terminal),也可以重定向到文件,管道。设备文件名为/dev/stdout
3、2:STDERR 标准错误输出
标准错误输出默认为终端,也可以重定向到文件。设备文件名为/dev/stderr
同时3~9也可以用来作为临时的文件描述符。
二、重定向
1.> 或 >> 输出重定向 > 会被替换; >>会累加,不会替换之前的内容
eg: ls -l > t.txt
eg:ls -l >> t.txt (追加)
eg:ls -l > t.txt (替换)
可以使用: echo "hehe" >> /home/test.txt,创建文件
2.<输入重定向
eg: wall < /tmp/t.txt 把t.txt中的内容广播出去
3.自动创建文件
cat > t.txt << EXIT(仅仅作为之后的结束标志)
>AAA
>VVV
>EXIT(或者ctrl+6)
4.错误输出重定向
eg:cp -R /usr /backup/usr.bak 2> /bak.error
(0和1的输入输出重定向把数字省略了)
5.正确输出和错误输出同时保存
命令 > 文件 2>&1 覆盖方式,把正确输出和错误输出都保存到同一个文件当中。
命令 >> 文件 2>&1 追加方式,把正确输出和错误输出都保存到同一个文件当中。
命令 &> 文件 覆盖方式,把所有输出都保存到同一个文件当中。
命令 &>> 文件 追加方式,把所有 输出都保存到同一个文件当中。
命令 >> 文件1 2>>文件2 正确输出追加到文件1中,错误输出追加到文件2中。
&把程序放到后台执行,但是当终端关闭时,程序可能关闭
nohup能保证终端关闭时,进程依然存在
分析 2>&1 以>/dev/null 2>&1 为例:
分解这个组合:
1:> 代表重定向到哪里,例如:echo '123' > /home/123.txt
2:/dev/null 代表空设备文件
3:2> 表示重定向stderr标准错误
4:& 表示等同于的意思,2>&1,表示2的输出重定向等同于1
5:1 表示stdout标准输出,系统默认值是1,所以'>/dev/null'等同于 '1>/dev/null',因此,>/dev/null 2>&1也可以写成“1> /dev/null 2> &1”
那么>/dev/null 2>&1语句执行过程为:
1>/dev/null :首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。
2>&1 :接着,标准错误输出重定向到标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。
在linux下最常用的方式有两种:
command > file 2>file 与command > file 2>&1
首先command > file 2 > file的意思是将命令所产生的标准输出信息和错误的输出信息送到file 中。command > file 2 > flie这样的写法,stdout和stderr都直接送到file中,file会被打开两次,这样stdout和stderr会互相覆盖,这样相当实用了FD1和FD2两个同事去抢占file 的管道
而command > file2 > &1 这条命令就将stdout直接送向file,stderr继承了FD1管道后,再被送往file,此时file制备打开了一次,也只是用了一个管道FD1,它包括了stdout和stderr的内容。
从IO效率上将,前一条命令的效率要比后面一条的命令效率要低,所以在编写设立了脚本的时候,较多的时候我们会command>file 2 >&1
另外一个非常有用的重定向操作符是 '-',请看下面这个例子:
$ (cd /source/directory && tar cf - . ) | (cd /dest/directory && tar xvfp -)
该命令表示把 /source/directory 目录下的所有文件通过压缩和解压,快速的全部移动到/dest/directory 目录下去,这个命令在/source/directory 和 /dest/directory 不处在同一个文件系统下时将显示出特别的优势。
几种不常见的用法:
n<$- 表示将n号输入关闭
<&- 表示关闭标准输入(键盘)
n>&- 表示将 n 号输出关闭
>&- 表示将标准输出关闭
wc [option] filename 统计文件字数
功能:统计文件中的文件行数、字数和字符数。
选项:
-l lines 统计文件的行数
-w words 统计文件的单词数 (英文单字)
-c bytes 统计文件的字节数
-m chars 统计文件字符数
注释:若缺省文件名则指标准输入
eg:wc
输入字符,按ctrl+d结束,输出统计结果
eg: wc /etc/services
10774 58108 641020 /etc/services
依次为:行数 单词数 字符数 文件名
eg:wc << hello
输入字符,直到输入hello才结束并统计
eg:cat test.txt |wc -l 用wc命令做到只打印统计数字不打印文件名
注意事项:
a:一个汉字占三个字节,一个回车符等不可见字符也占一个字节
b:一行的末尾如果没有回车符,则不算是一行,也就是说,如果一个文件的最后一行末尾没有换行符,wc命令统计的行数会比实际行数少一,所谓实际行数是你所看到的行数,实际上,没有回车符,确实不能算作一行
c:所谓一个字就是连续的字符,即不被空字符分割的连续的字母或者汉字算作是一个字
统计文件中,字符串出现的行数
eg:统计aaa.txt文件中,unix出现的行数
# grep -o "unix" aaa.txt | wc -l
# cat aaa.txt | grep unix|wc -l
# grep -c "unix" aaa.txt