学习笔记六(I/O重定向和管道 )

标准输入和输出

  • 程序:指令+数据
    读入数据:Input
    输出数据:Output

  • 打开的文件都有一个fd:file descriptor(文件描述符)

  • Linux给程序提供了三种I/O设备

  1. 标准输入(STDIN) -0 默认接受来自键盘的输入
  2. 标准输出(STDOUT) -1 默认输出到终端窗口
  3. 标准错误(STDERR) -2 默认输出到终端窗口

I/O重定向:改变默认位置

把输出和错误重定向到文件

STDOUT和STDERR可以被重定向到文件
命令 操作符号 文件名

  • 支持的操作符号包括

> 把STDOUT重定向到文件
2> 把STDERR重定向到文件
&> 把所有输出重定向到文件

> 文件内容会被覆盖
set -C 禁止将内容覆盖已有文件,但是可以追加
set +C 允许覆盖
> | file 强制覆盖
**>>**原有内容基础上,追加内容
() 合并多个程序的STDOUT

[root@centos7 ~]#hostname > /data/hostname.log
[root@centos7 ~]#cat /data/hostname.log 
centos7.localdomain
把hostname的内容重定向到/data目录下的hostname.log里

[root@centos7 ~]#uname -r >> /data/hostname.log 
[root@centos7 ~]#cat /data/hostname.log 
centos7.localdomain
3.10.0-1062.el7.x86_64
把uname -r的内容追加到/data目录下的hostname.log里,两个>不会重定向时不会对原文件进行覆盖操作

[root@centos7 ~]#ls /data/ /xxx >f1.log 2>f2.log
[root@centos7 ~]#cat f1.log
/data/:
a
backup2020-04-13
hostname.log
passwd
rootdir
shadow.link
[root@centos7 ~]#cat f2.log
ls: cannot access /xxx: No such file or directory
把一条命令里正确的输出到f1.log,错误的输出到f2.log

[root@centos7 ~]#(ls;hostname) > /data/f3
[root@centos7 ~]#cat /data/f3 
anaconda-ks.cfg
Desktop
Documents
Downloads
f1.log
f2.log
initial-setup-ks.cfg
Music
Pictures
Public
Templates
Videos
centos7.localdomain
把ls和hostname的指令结果一起重定向到/data/f3文件里

tr

  • tr 转换和删除字符
  • tr 选项 字符1 字符2
  • 选项:
  1. -c -C 取字符集的补集
  2. -d 删除所有数据第一字符集的字符
  3. -s 把连续重复的字符以单独一个字符表示
  4. -t 将第一个字符集对应字符转化为第二字符集对应的字符
[root@centos7 ~]#tr [:lower:] [:upper:]
asdafsghfjrerqweq
ASDAFSGHFJRERQWEQ
把所有的小写字母替换成大写字母

[root@centos7 ~]#tr -d 13579
123456789
2468
-d 可以删除指定字符

[root@centos7 ~]#tr -s sad
aaaaaaaaaaas
as
sssssssssdddddddd
sd
aaaaaaassddd
asd
-s 把连续字符转化为一个字符

[root@centos7 ~]#tr -dc 123
qwe123
123[root@centos7 ~]#
把除了123以外的字符都删了,-c可以理解为取反

把多行发送给STDIN

  • 使用“<<终止词” 命令从键盘把多行重导向给STDIN
  • 直到终止词位置的所有文本都发送给STDIN
[root@centos7 ~]#cat <<EOF
> fiel1
> link1
> cof1
> EOF
fiel1
link1
cof1
把以上多行文本重导向

管道 |

  • 管道(使用符号“|”表示)用来连接命令
    命令1 |命令2|命令3
    将命令1的STDOUT发送给命令2的STDIN,命令2的STDOUT发送给命令3的STDIN
    STDERR默认不能通过管道转发,可利用2>&1或|&实现
    最后一个命令会在当前shell进程的子shell进程中执行
    组合多种工具的功能
    ls | tr ‘a-z’ ‘A-Z’
    示例
[root@centos7 ~]#ls |tr 'a-z' 'A-Z'
ANACONDA-KS.CFG
DESKTOP
DOCUMENTS
DOWNLOADS
F1.LOG
F2.LOG
INITIAL-SETUP-KS.CFG
MUSIC
PICTURES
PUBLIC
TEMPLATES
VIDEOS
先执行ls命令,列出所有文件和文件夹,然后通过tr命令把小写字母替换成大写字母

tee

命令1 | tee [-a] 文件名 |命令2
把命令1的stdout保存在文件中,作为命令2的输出,同时能打印执行结果
-a 追加
使用:

  • 保存不同阶段的输出
  • 复杂管道的故障排除
  • 同时查看和记录输出
    示例
[root@centos7 ~]#ls |tee /data/f4 |tr 'a-z' 'A-Z'
ANACONDA-KS.CFG
A-Z
A-Z
DESKTOP
DOCUMENTS
DOWNLOADS
F1.LOG
F2.LOG
INITIAL-SETUP-KS.CFG
MUSIC
PICTURES
PUBLIC
TEMPLATES
VIDEOS

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值