> RedHat >

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

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

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' </tmp/passwd  
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

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

    也可以这样写
[root@clz ~]# cat <<EOF >/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{}'



(责任编辑:IT)