RHCE7认证学习笔记:重定向与管道
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...显示其他的文件
在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
<
> RER
> EOF
也可以这样写
[root@clz ~]# cat <
> 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{}'