linux中的管道符与重定向

1、管道命令符

管道命令符“|”的作用是将前一个命令的标准输出当作后后一个命令的标准输入,格式为“命令A|命令B”。
举个例子:
    我们学过一个grep查找命令,这个命令可以在一个文件中通过匹配某些字符来查找到你想要得到的信息,我们还学过一个wc -l统计文本的行数,现在我们想通过grep命令来匹配关键词"/sbin/nologin"来统计出有多少用户不允许登录,这里我们就用到了管道符。

理清思路:
    找出被限制登陆用户的命令是:grep “/sbin/nologin” /etc/passwd
    统计文本行数的命令则是:wc -l
    现在要做的是就是将搜索命令的输出值传递给统计命令,其实只要把管道符夹在中间就可以了。
    [root@linux ~]# grep "/sbin/nologin" /etc/passwd | wc -l
用翻页的形式查看/etc目录中有那些文件:
[root@linuxprobe ~]# ls -l /etc/ | more

注意:管道命令符不只可以使用一次,还可以:命令1|命令2|命令3

2、输入输出的重定向

在学习标准输入输出重定向前,我们先看一个简单的演示吧:
查看linuxprobe目录的信息:
[root@linux ~]# ls linuxprobe/
查看xxxxxx目录的信息:
[root@linux ~]# ls xxxxxx/
ls: cannot access xxxxxx: No such file or directory
刚刚我们先查看了一个名为linuxprobe目录内的文件,后又尝试查看名为”xxxxxx”目录内的文件,显示该目录并不存在。
虽然好像命令都执行成功了,但其实有所差异,前者执行后返回的是标准输出,而后者执行失败返回的是错误输出。
标准输入(STDIN,文件描述符为0):默认从键盘输入,为0时表示是从其他文件或命令的输出。
标准输出(STDOUT,文件描述符为1):默认输出到屏幕,为1时表示是文件。
错误输出(STDERR,文件描述符为2):默认输出到屏幕,为2时表示是文件。

对于输出重定向符有这些情况:
符号                  作用
命令 > 文件         将标准输出重定向到一个文件中(清空原有文件的数据)
命令 2> 文件        将错误输出重定向到一个文件中(清空原有文件的数据)
命令 >> 文件        将标准输出重定向到一个文件中(追加到原有内容的后面)
命令 2>> 文件       将错误准输出重定向到一个文件中(追加到原有内容的后面)
命令 >> 文件 2>$1   将标准输出与错误输出共同写入到文件中(追加到原有内容的后面)


对于输入重定向有这些情况:
符号                  作用
命令 < 文件              将文件作为命令的标准输入
命令 << 分界符           从标准输入中读入,直到遇见“分界符”才停止
命令 < 文件1 > 文件2      将文件1作为命令的标准输入并将标准输出到文件2
几个例子:

将man命令的帮助文档写入到/root/man.txt中:
[root@linux ~]# man bash > /root/man.txt

向readme.txt文件中写入一行文字:
[root@linux ~]# echo "Welcome to LinuxProbe.Com" > readme.txt

向readme.txt中追加一行文字:
[root@linux ~]# echo "Quality linux learning materials" >> readme.txt

查看readme.txt中的内容:
[root@linux ~]# cat readme.txt
Welcome to LinuxProbe.Com
Quality linux learning materials

把readme.txt文件作为输入重定向给wc -l命令来计算行数,命令等同于“cat readme.txt | wc -l”。
[root@linux ~]# wc -l < readme.txt

用”ls”命令查看文件信息,若文件不存在则将报错信息输出到/root/stderr.txt中:
[root@linux ~]# ls linuxprobe 2> /root/stderr.txt
-rw-r--r--. 1 root root 0 Mar  1 13:30 linuxprobe
文件为空,代表上面命令并没有报错:
[root@linux ~]# cat /root/stderr.txt

将查看xxxxxx目录命令的错误信息输出到/root/stderr.txt文件中:
[root@linux ~]# ls xxxxxx 2> /root/stderr.txt
查看到stderr.txt文件中保存的ls命令报错信息:
[root@linux~]# cat /root/stderr.txt
ls: cannot access xxxxxx: No such file or directory

因为”linuxprobe”的文件确实存在,所有没有报错信息,但”xxxxxx”文件是不存在的,所以则将报错信息输出到了指定的文件。


你可能感兴趣的:(Linux)