中华考试网·阅读新闻
Linux认证 > 红帽认证 > 红帽认证辅导 > 文章内容

RHCE7认证学习笔记:重定向与管道

2016-2-17编辑:ljnbset

1、输出重定向

    重定向正确内容:

    cat xx.file > yy.file 相当于cat xx.file 1>yy.file将文件内容重定向到yy.file,将会覆盖原有文件内容;

    cat xx.file 》yy.file 将文件内容追加重定向到yy.file,不会覆盖原有文件内容;
    重定向错误的结果

        xxx 2> yy.file 执行错误的命令产生的错误结果重定向到yy.file文件

          xxx 2》 yy.file 
        XXX  >>yy  2>>bb
  正确与错误都重定向到相同文件
这种写法比较常用: [root@clz ~]# cat /etc/passwd &>>/tmp/xx

这种学法不常用,将错误的当成正确的输出:[root@clz ~]# cat /etc/passwd >/tmp/xx 2>&1

    可以从以下的示例中更加深入的理解正确的输入重定向:

    在/dev/pts/1上执行以下命令:

[root@clz ~]# tail -f /var/log/messages >/tmp/xx 2>/tmp/yy

    在/dev/pts/0上查看执行该命令的进程号:
[root@clz fdinfo]# ps aux | grep tail|grep -v 'grep'
root      5567  0.1  0.0 107932  620 pts/1    S+  15:37  0:00 tail -f /var/log/messages

    根据进程号,进入到/proc目录下找到进程号对应的文件夹:
[root@clz fdinfo]# cd /proc/5567

    进入fd/文件夹,执行ls -l命令,可以看到链接文件:0代表输入,1代表标准正确的输出,2,代表标准错误的输出,3、表示命令操作的文件,如果对多个文件进行操作,则会有4,5...显示其他的文件

RHCE7认证学习笔记3——重定向与管道

        在dev目录下面,可以看到以下逻辑的标准输入输出设备,当一个进程运行时,self就会替换成该进程的进程号:
[root@clz fd]# ls -al /dev/std*
lrwxrwxrwx. 1 root root 15 Dec 30  2014 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx. 1 root root 15 Dec 30  2014 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx. 1 root root 15 Dec 30  2014 /dev/stdout -> /proc/self/fd/1

2、输入重定向
将文件内容重定向输入到某个命令
[root@clz ~]# tr 'a-z' 'A-Z' ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN
DAEMON:X:2:2:DAEMON:/SBIN:/SBIN/NOLOGIN
ADM:X:3:4:ADM:/VAR/ADM:/SBIN/NOLOGIN
LP:X:4:7:LP:/VAR/SPOOL/LPD:/SBIN/NOLOGIN

          <[root@clz ~]# cat >/tmp/xx<> ERSARERS
> RER
> EOF

    也可以这样写
[root@clz ~]# cat </tmp/xx
> ERSARERS
> RER
> EOF

3、管道   
        grep -n 在查找的内容前加行数 -i忽略大小写,-A 3 查找的内容后再显示的行数,B 3 显示查找的内容前的行数 -v 排除关键字后的内容,-q不显示输出;
[root@clz ~]# grep -n -A 1 -B 1 root /etc/passwd 
1:root:x:0:0:root:/root:/bin/bash
2-bin:x:1:1:bin:/bin:/sbin/nologin
--
9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbin/nologin
11-games:x:12:100:games:/usr/games:/sbin/nologin

[root@clz ~]# grep -v root /etc/passwd

前面输出的内容传通过管道传递给后面的命令,但是前面的命令生成的内容没有保存下来;
[root@clz ~]# ifconfig | grep 'inet'|grep -v 'inet6'| awk 'BEGIN{print "IP\t\tnetmask"}{print $2,"\t",$4}END{}'
IPnetmask
10.35.89.32  255.255.255.128
10.35.89.33  255.255.255.0
127.0.0.1  255.0.0.0

        通过使用tee命令可以讲前面命令生成的结果保存下来,加-a 选项表示追加不覆盖,然后在过滤输出结果;

[root@clz ~]# ifconfig | grep 'inet'|grep -v 'inet6'| tee -a /tmp/yy|awk 'BEGIN{print "IP\t\tnetmask"}{print $2,"\t",$4}END{}'

RHCE7认证学习笔记:Vim编辑器的使用
咨询热线:4000-525-585(免长途费)