IO重定向及管道
2018-05-27 本文已影响0人
Hye_Lau
1.IO重定向
(1)可用于输入的设备:文件(键盘设备、磁盘、网卡等)
(2)可用于输出的设备:文件(显示器、磁盘、网卡等)
(3)程序的数据流有三种:
- 输入的数据流:<==标准输入(stdinput),键盘;
- 输出的数据流:==>标准输出(stdout),显示器;
- 错误输出流:==>错误输出(stderr),显示器;
(4)fd:file descriptor,文件描述符
- 标准输入:代码为0,使用< 或<<
- 标准输出:代码为1,使用>或>>
- 错误输出:代码为2,使用2>或2>>
实例
[root@localhost ~]# ll /
总用量 106
dr-xr-xr-x. 2 root root 4096 8月 15 2017 bin
.......
drwxr-xr-x. 20 root root 4096 7月 2 2017 var
//将ll命令执行后的信息输出到~/rootfile文件
[root@localhost ~]# ll / > ~/rootfile
[root@localhost ~]# ll ~/rootfile
-rw-r--r--. 1 root root 1251 5月 28 03:19 /root/rootfile
(5)输出重定向
- 1>:以覆盖的方法将正确的数据输出到指定的文件或设备上
- 1>>:以累加的方法将正确的数据输出到指定的文件或设备上;
- 2>:以覆盖的方法将错误的数据输出到指定的文件或设备上;
- 2>>:以累加的方法将错误的数据输出到指定的文件或设备上;
实例
[root@localhost ~]# su - distro
[distro@localhost ~]$ find /home -name .bashrc
find: “/home/abc1”: 权限不够
find: “/home/user2”: 权限不够
find: “/home/abc9”: 权限不够
find: “/home/abc7”: 权限不够
/home/distro/.bashrc
......
//将上述命令的执行结果,正确的输出至list_right文件,错误的输出至list_error文件;
[distro@localhost ~]$ find /home -name .bashrc > list_right 2>list_error
[distro@localhost ~]$ ll list_right
-rw-rw-r--. 1 distro distro 40 5月 28 03:33 list_right
[distro@localhost ~]$ ll list_error
-rw-rw-r--. 1 distro distro 1232 5月 28 03:33 list_error
(6)/dev/null垃圾黑洞设备与特殊写法
- 合并正常输出流和错误输出流:
1)常用选项: &>,&>>
2)命令格式
COMMAND > /path/to/somefile 2>&1
COMMAND>> /path/to/somefile 2>&1
- 特殊设备:/dev/null
实例
//合并正常输出流和错误输出流
[distro@localhost ~]$ find /home -name .bashrc > list 2>&1
[distro@localhost ~]$ ll list
-rw-rw-r--. 1 distro distro 1272 5月 28 03:47 list
//将命令执行后的错误信息输出至/dev/null丢弃
[distro@localhost ~]$ find /home -name .bashrc 2>/dev/null
/home/abc2/.bashrc
/home/distro/.bashrc
(7)输入重定向
1)cat命令
- cat > /path/from/somefile << EOF
以键盘为输入,将信息输出到somefile,并在输入EOF时结束输入
实例
//利用cat创建一个文件,使用键盘输入文件内容
[root@localhost ~]# cat > catfile
hello world
cat file test
[root@localhost ~]# cat catfile
hello world
cat file test
//用stdin替代键盘的输入
[root@localhost ~]# cat > catfile < ~/.cshrc
[root@localhost ~]# ll catfile ~/.cshrc
-rw-r--r--. 1 root root 100 5月 28 03:56 catfile
-rw-r--r--. 1 root root 100 9月 23 2004 /root/.cshrc
//cat将输入的信息输出到catfile,且当键盘输入eof时,结束输入
[root@localhost ~]# cat > catfile << "eof"
> this is a test
> hello world
> eof
[root@localhost ~]#
(8)双向重定向
1)tee命令
- tee会同时将数据流送与文件与屏幕;
- 输出到屏幕的,就是stdout,可以让下个命令继续处理。
命令格式与选项
tee [-a] file
-a:以累加的方式,将数据加入file当中
实例
//将last的输出存一份到last.list中
[root@localhost ~]# last | tee last.list | cut -d " " -f1
mageia
root
......
wtmp
//将ls的数据存一份到 ~/homefile,同时屏幕也有输出信息
[root@localhost ~]# ls -l /home | tee -a ~/homefile | more
总用量 148
drwx------. 3 user_g 4016 4096 5月 16 18:28 abc1
drwx------. 3 4025 4025 4096 5月 16 18:28 abc10
drwx------. 3 distro 4017 4096 5月 16 18:28 abc2
......
//tee后接的文件会被覆盖,若加上-a这个参数则能将信息累加
[root@localhost ~]# ls -l / | tee -a ~/homefile | more
总用量 106
dr-xr-xr-x. 2 root root 4096 8月 15 2017 bin
dr-xr-xr-x. 5 root root 1024 7月 2 2017 boot
......
drwxr-xr-x. 20 root root 4096 7月 2 2017 var
2.管道
- 连接程序,实现将前一个命令的输出直接定向后一个程序当做输入数据流
命令格式
COMMAND1 | COMMAND2 | COMMAND3 | ...
注意
- 管道命令仅会处理standard output,对于standard error output会予以忽略
- 管道命令必须要能够接收来自前一个命令的数据成为standard input继续处理才行
1)tr命令
命令格式
tr [OPTION]... SET1 [SET2]
- 把输入的数据当中的字符,凡是在SET1定义范围内出现的,通通对位转换为SET2出现的字符;
常用方法:
- 用法1:
tr SET1 SET2 < /path/from/somefile - 用法2:
tr -d SET1 < /path/from/somefile
注意:不修改原文件
实例
- 1.把/etc/passwd文件的前6行的信息转换为大写字符后输出
[root@localhost ~]# head -n 6 /etc/passwd | 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
SYNC:X:5:0:SYNC:/SBIN:/BIN/SYNC
- 参考书籍:《鸟哥的Linux私房菜--基础学习篇》