Linux学习笔记----bash命令(1)

输入输出重定向

一、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 

Linux学习笔记----bash命令(1)

Linux学习笔记----bash命令(1)

eg:ls -l >> t.txt (追加)

Linux学习笔记----bash命令(1)

eg:ls -l > t.txt (替换)

Linux学习笔记----bash命令(1)

可以使用: echo "hehe" >> /home/test.txt,创建文件

 

2.<输入重定向

eg: wall < /tmp/t.txt 把t.txt中的内容广播出去

 

3.自动创建文件

cat > t.txt << EXIT(仅仅作为之后的结束标志)

>AAA

>VVV

>EXIT(或者ctrl+6)

Linux学习笔记----bash命令(1)

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