IO重定向及管道操作

程序是由指令+数据组成的。换言之,程序是对读入的数据进行处理,再输出数据。数据的输入(Input),输出(Output),简称为IO,在没有指定输入输出的情况下,默认为标准输入和标准输出。打开的文件都有一个文件描述符(fd: file descriptor)表现为一个数字

  • 标准输入:keyborad(键盘), 文件描述符:0
  • 标准输出:monitor(显示屏), 文件描述符:1
  • 标准错误输出:monitor, 文件描述符:2

I/O重定向:改变标准输入与输出的默认位置

标准输出重定向

输出重定向:COMMAND > NEW_POS, COMMAND >> NEW_POS

  • >:覆盖重定向,目标文件中的原有内容会被清除;
  • >>: 追加重定向,新内容会追加至目标文件尾部;
[root@senlong ~]# ls /etc > /tmp/etc.out

注意:覆盖文件内容具有风险

[root@senlong ~]# set -C # 禁止将内容覆盖输出至已有文件中
[root@senlong ~]# ls /etc > /tmp/etc.out
-bash: /tmp/etc.out: cannot overwrite existing file
[root@senlong ~]# ls /etc >| /tmp/etc.out # 强制覆盖
[root@senlong ~]# set +C # 允许将内容覆盖输出至已有文件中

标准错误输出重定向

  • 2>: 覆盖重定向错误输出数据流;
  • 2>>: 追加重定向错误输出数据流;

标准输出和错误输出各自定向至不同位置: COMMAND > /path/to/file.out 2> /path/to/error.out 这种写法会创建两个文件,一个为空

合并标准输出和错误输出为同一个数据流进行重定向:只会生成一个文件

  • &>:覆盖重定向
  • &>>:追加重定向
[root@senlong tmp]# echo $PATH &> /tmp/path.out

标准输入重定向

输入重定向:<

tr命令:转换或删除字符 默认接受键标准输入(键盘输入)

[root@senlong tmp]# tr abc ABC # 将abc转成ABC
hello
hello
alpha  
AlphA
[root@senlong tmp]# cat test
hello world
[root@senlong tmp]# tr eo EO < ./test
hEllO wOrld

HERE Documentation:<< 创建文档

  • cat << EOF
  • cat > /path/to/somefile << EOF
[root@senlong tmp]# cat << EOF
> how are you?
> how old are you?
> EOF
how are you?
how old are you?
[root@senlong tmp]# cat >> /tmp/test.out << EOF
> how are you?
> how old are you?
> EOF
[root@senlong tmp]# cat /tmp/test.out 
how are you?
how old are you?

tee命令

同时在显示屏和文件中输出:一路输入,两路输出

tee [OPTION]... [FILE]...

[root@senlong tmp]# tee /tmp/tee.out
hello
hello
world
world
[root@senlong tmp]# cat /tmp/tee.out 
hello
world

管道 |

COMMAND1 | COMMAND2 | COMMAND3 |...

Note:最后一个命令会在当前shell进程的子shell进程中执行;

[root@senlong tmp]# echo $PATH | tr 'a-z' 'A-Z'
/USR/LIB/GOLANG/BIN/LINUX_AMD64:/USR/LOCAL/SBIN:/USR/LOCAL/BIN:/SBIN:/BIN:/USR/SBIN:/USR/BIN:/ROOT/BIN:/USR/LOCAL/GIT/BIN:/ROOT/BIN
[root@senlong tmp]# echo $PATH | tr 'a-z' 'A-Z' | tr -d 'U'
/SR/LIB/GOLANG/BIN/LINX_AMD64:/SR/LOCAL/SBIN:/SR/LOCAL/BIN:/SBIN:/BIN:/SR/SBIN:/SR/BIN:/ROOT/BIN:/SR/LOCAL/GIT/BIN:/ROOT/BIN

练习

1.将/etc/passwd文件中的前5行内容转换为大写后保存至/tmp/passwd.out文件中

[root@senlong tmp]# head -n 5 /etc/passwd | tr 'a-z' 'A-Z' > /tmp/passwd.out
[root@senlong tmp]# cat /tmp/passwd.out 
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

2.将登录至当前系统上用户信息中的后3行的信息转换为大写后保存至/tmp/who.out文件中

[root@senlong tmp]# who | tail -n 3 | tr 'a-z' 'A-Z' > /tmp/who.out
[root@senlong tmp]# cat /tmp/who.out 
ROOT     PTS/0        2017-01-16 17:05 (10.0.2.2)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏bdcn

CoreOS配置Docker API TLS认证 顶

我们经常会利用Portainer来管理docker环境,也经常会用Jenkins来自动构建和部署docker,远程管理都会使用到Docker API,通常我们只...

1142
来自专栏互联网技术栈

系统安全-JWT(JSON Web Tokens)

系统开发来讲,安全验证永远是最重要的,从最原始的session、cookie验证方式,到符合restful风格、满足前后端分离需求、启用https请求,各方面都...

1246
来自专栏大内老A

[WCF安全系列]实例演示:TLS/SSL在WCF中的应用[HTTPS]

上一篇演示的是绑定类型为NetTcpBinding情况下基于TLS/SSL的Transport安全模式的实现,接下来我们改用另外一种绑定:WS2007HttpB...

1998
来自专栏FreeBuf

从Windows 10 SSH-Agent中提取SSH私钥

在这个周末我安装了Windows 10 Spring Update,最令我期待的就是它的内置OpenSSH工具,这意味着Windows管理员不再需要使用Putt...

1113
来自专栏偏前端工程师的驿站

.Net魔法堂:发个带附件的邮件

一、前言                             由于工作需要最近把邮件发送封装成WebService,现在把代码记录在此,以便日后查阅。 二、...

19210
来自专栏cloudskyme

跟我一起云计算(4)——lucene

了解lucene的基本概念 这一部分可以参考我以前写的博客: http://www.cnblogs.com/skyme/tag/lucene/ lucene是什...

3226
来自专栏FreeBuf

CVE-2017-3085:Adobe Flash泄漏Windows用户凭证

早前我写了一篇文章讲述Flash沙盒逃逸漏洞最终导致Flash Player使用了十年之久的本地安全沙盒项目破产。从之前爆出的这个漏洞就可以看出输入验证的重要性...

2886
来自专栏云知识学习

​TKE容器服务搭建kubernetes-dashboard教程

目前TKE控制台暂时不支持Job, Pod, CronJob等对象的展示。有通过web界面查看这些类型对象的需求的话,可以自行安装k8s dashboard U...

1500
来自专栏惨绿少年

ssh密钥创建分发(端口号非22)&脚本实现自动创建分发密钥

1.1 服务端端口号变化了,如何基于秘钥连接 1.1.1 环境准备 实验环境: [root@test ~]# cat /etc/redhat-release C...

2360
来自专栏偏前端工程师的驿站

.Net魔法堂:发个带附件的邮件

一、前言                             由于工作需要最近把邮件发送封装成WebService,现在把代码记录在此,以便日后查阅。 二、...

1839

扫码关注云+社区