1.重定向概述

1.什么是重定向

将原本要输出到屏幕的数据信息,重新定向到某个指定的文件中。比如:每天凌晨定时备份数据,希望将备份数据的结果保存到某个文件中。

这样第二天通过查看文件的内容就知道昨天备份的数据是成功还是失败。

2.为何要使用重定向

1.当屏幕输出的信息很重要,而且希望保存重要的信息时;

2.后台执行中的程序,不希望他干扰屏幕正常的输出结果时;

3.系统的例行命令, 例如定时任务的执行结果,希望可以存下来时;

4.一些执行命令,我们已经知道他可能出现错误信息, 想将他直接丢弃时;

5.错误日志与正确日志需要分别输出至不同的文件保存时;

3.学习重定向的预备知识,标准输入与输出

当运行一个程序时通常会自动打开三个标准文件,分别是标准输入、标准输出、错误输出

     
名称 文件描述符 作用
标准输入(STDIN) 0 默认是键盘,也可以是文件或其他命令的输出。
标准输出(STDOUT) 1 默认输出到屏幕。
错误输出(STDERR) 2 默认输出到屏幕。
文件名称(filename) 3+  

输入和输出

  • 标准输入 默认是来自键盘的输入 stdin 0

  • 标准输出 默认输出到终端窗口 stdout 1

  • 标准错误输出 默认输出到终端窗口 stderr 2

2.I/O重定向

改变输出另外的地方,比如重定向输出到终端,改到输出到文件

m[root@192 test]#file /run/gssproxy.sock > c
m[root@192 test]#cat c
/run/gssproxy.sock: socket

错误输出到文件f中

m[root@192 test]#ls sdjfjei 2> f
m[root@192 test]#cat f
ls: cannot access sdjfjei: No such file or directory

> 覆盖

  • > 将标准输出重定向到文件中

  • 2> 将错误输出重定向到文件中

  • &> 将所有的输出都重定向到文件中

禁止、允许覆盖

m[root@192 test]#>q
m[root@192 test]#ls jdjfdk 2>q
m[root@192 test]#set -C
m[root@192 test]#>q
-bash: q: cannot overwrite existing file
  • 禁止覆盖 set -C

  • 允许覆盖 set +C

>> 追加

m[root@192 test]#ls djfjdkf 2>>a
m[root@192 test]#ls djfjdkf 2>>a
m[root@192 test]#ls djfjdkf 2>>a
m[root@192 test]#cat a
ls: cannot access djfjdkf: No such file or directory
ls: cannot access djfjdkf: No such file or directory
ls: cannot access djfjdkf: No such file or directory

>> 将标准输出追加到文件中

2>> 将错误输出追加到文件中

&>> 将所有输出追加到文件中

标准输入和错误输入分开保存

[root@localhost ~]#ls f 45yuio > log.log 2> error.log
[root@localhost ~]#cat log.log
f
[root@localhost ~]#cat error.log
ls: cannot access 45yuio: No such file or directory

合并所有的输出

  • &> 覆盖重定向

  • &>> 追加重定向

  • command > file 2>&1

  • command >> file 2>&1

# 把错误的也合并到标准输出到r文件
m[root@192 test]#ls f 34jdj > r 2>&1
m[root@192 test]#cat r
ls: cannot access 34jdj: No such file or directory
f
  • ():合并多个文件的输出

m[root@192 test]#(ls djfj;ls djfjjjnf) 2>g
m[root@192 test]#cat g
ls: cannot access djfj: No such file or directory
ls: cannot access djfjjjnf: No such file or directory
  • /dev/null 黑洞,不断地吞

超级回收站,不断地接受输出

m[root@192 test]#(ls f;ls djfjdk) &> /dev/null
  • /dev/zero 不断地吐

# 测试磁盘速度
m[root@192 test]#dd if=/dev/zero of=j bs=100M count=2
2+0 records in
2+0 records out
209715200 bytes (210 MB) copied, 0.247444 s, 848 MB/s

3.从文件导入stdin

tr 字符替换

-t 截断
-d 删除
-s 压缩,去重
-c 取反 # 从文件中替换
[root@localhost ~]#tr 'a-z' 'A-Z' < /etc/issue
\S
KERNEL \R ON AN \M
[root@localhost ~]#tr 'a-z' 'A-Z'
qwertyy
QWERTYY
12345678
12345678
ASDFGHJ
ASDFGHJ
qwertyuio
QWERTYUIO
^C
[root@localhost ~]#tr ab 12
ab
12
abb
122
asdfghjkl
1sdfghjkl
^C
[root@localhost ~]#tr abc 12
ab
12
abc
122
abc
122
^C
[root@localhost ~]#tr ab 123
ab
12
abb
122
avc
1vc
qbc
q2c
abc
12c # 截断
[root@localhost ~]#tr -t abc 12
abc
12c
ab
12 # 删除
[root@localhost ~]#tr -d abc
qwertyui
qwertyui
an^H^H
n abc artyibrtyuiocrtyuiop
rtyirtyuiortyuiop
^C
[root@localhost ~]#tr -d abc < /etc/issue
\S
Kernel \r on n \m [root@localhost ~]#cat /etc/issue
\S
Kernel \r on an \m
[root@localhost ~]#tr -s a
abc
abc
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabc
abc
^C
[root@localhost ~]#tr -sc a
aasdaaaaaaa
aasdaaaaaaa
^[[A^H^H^C
[root@localhost ~]#tr -sc a
aaaaaaaaabbbbbbbbbbbbbccccccccddddddddddd
aaaaaaaaabcd
[root@localhost ~]#tr -dc a
aaaaaaaaaaaabbbbbbbbbb
asdfghjkqwertyuiozxcvbnmxcvbnm,.
aaaaaaaaaaaaa
ctrl+d 结束
[root@localhost ~]#tr -dc "a\n"
asdfghjk
a
wertyujk;l' asdfghj
a
[root@localhost test]#tr -d a < issue > issue
# 处理完成以后不能写会到源文件,要写到新的文件中 [root@localhost test]#seq 1 10 > b
[root@localhost test]#cat b
1
2
3
4
5
6
7
8
9
10
[root@localhost test]#tr -d "\n" < b
12345678910[root@localhost test]#tr -d "\n" < b
[root@localhost test]#tr "\n" " " <b
1 2 3 4 5 6 7 8 9 10 [root@localhost test]#tr "\n" " " <b >c
[root@localhost test]#cat c
1 2 3 4 5 6 7 8 9 10 [root@localhost test]#tr " " "\n" <c
1
2
3
4
5
6
7
8
9
10

多行发送给stdin

# 第一种方式
[root@localhost test]#cat > f1
qwert
wertyui
wertyui
wertyuiopasdfghjk
sdfghjkl
sdfyhjkl;sdfghjkl;xcvb # 第二种方式
[root@localhost test]#cat > f2 <<EOF
> qwerty
> qwertyu
> wertyui
> qwertyu
> EOF
EOF 不是必须得,只要两个相同就可以

4.管道

管道使用“|”来表示,主要用来连接左右两个命令, 将左侧的命令的标准输出, 交给右侧命令的标准输入

PS: 无法传递标准错误输出至后者命令

命令1|命令2|命令3

  • 把命令1的输出结果当做命令2的输入结果,把命令2的输出结果当成命令3的输入结果

  • 默认情况下,管道只能传送标准输出

  • 如果需要把错误输出也传递,则需要|&

  • 一般用来组合多个命令

  • 有一些命令是不接受管道的

[root@localhost test]#ls f1|tr 'a-z' 'A-Z'
F1
[root@localhost test]#ls f
ls: cannot access f: No such file or directory
[root@localhost test]#ls f|tr 'a-z' 'A-Z'
ls: cannot access f: No such file or directory
[root@localhost test]#ls f|&tr 'a-z' 'A-Z'
LS: CANNOT ACCESS F: NO SUCH FILE OR DIRECTORY
# 不接受管道
[root@localhost test]#echo file{1..20}|touch
touch: missing file operand
Try 'touch --help' for more information.

案例1: 将/etc/passwd 中的用户按 UID 大小排序

[root@lqz ~]# sort -t":" -k3 -n /etc/passwd
[root@lqz ~]# sort -t":" -k3 -n /etc/passwd -r
[root@lqz ~]# sort -t":" -k3 -n /etc/passwd |head

案例2: 统计当前/etc/passwd 中用户使用的 shell 类型

#思路:取出第七列(shell) | 排序(把相同归类)| 去重
[root@lqz ~]# awk -F: '{print $7}' /etc/passwd
[root@lqz ~]# awk -F: '{print $7}' /etc/passwd |sort
[root@lqz ~]# awk -F: '{print $7}' /etc/passwd |sort |uniq
[root@lqz ~]# awk -F: '{print $7}' /etc/passwd |sort |uniq -c

案例4: 统计网站的访问情况 top 20

#思路: 打印所有访问的连接 | 过滤访问网站的连接 | 打印用户的 IP | 排序 | 去重

[root@lqz ~]# yum -y install httpd
[root@lqz ~]# systemctl start httpd
[root@lqz ~]# systemctl stop firewalld [root@lqz ~]# ss -an |grep :80 |awk -F":" '{print $8}' |sort |uniq -c
[root@lqz ~]# ss -an |grep :80 |awk -F":" '{print $8}' |sort |uniq -c |sort -k1 -rn |head -n 20

案例5: 打印当前所有 IP

[root@lqz ~]# ip addr |grep 'inet ' |awk '{print $2}' |awk -F"/" '{print $1}'
127.0.0.1
192.168.69.112

案例6: 打印根分区已用空间的百分比(仅打印数字)

[root@lqz ~]# df |grep '/$' |awk '{print $5}' |awk -F"%" '{print $1}'

PS: 管道命令符能让大家能进一步掌握命令之间的搭配使用方法,进一步提高命令输出值的处理效率。

1.管道中的tee技术

#选项: -a追加
[root@lqz ~]# ip addr |grep 'inet ' |tee ip.txt |awk -F"/" '{print $1}' |awk '{print $2}'
127.0.0.1
10.0.0.100 [root@lqz ~]# cat ip.txt
inet 127.0.0.1/8 scope host lo
inet 10.0.0.100/24 brd 192.168.69.255 scope global ens32

重定向与 tee 有他们在使用过程中有什么区别

[root@lqz ~]# date > date.txt    #直接将内容写入date.txt文件中
[root@lqz ~]# date |tee date.txt #命令执行会输出至屏幕,但会同时保存一份至date.txt文件中

2.xargs参数传递,主要让一些不支持管道的命令可以使用管道技术

# which cat|xargs ls- l
# ls |xargs rm -fv
# ls |xargs cp -rvt /tmp/ -或-> ls | xargs -I {} cp -rv {} /tmp/
# ls |xargs mv -t /tmp/ -或-> ls | xargs -I {} mv {} /tmp

Linux输入输出的更多相关文章

  1. 全面理解Linux输入输出重定向

    全面理解Linux输入输出重定向 本教程通过视频方式讲解shell操作,理解感念,教程通俗易懂,比起看一大堆文档要舒服的多.本次教程主要讲解  Linux Shell 中支持输入输出重定向,用符号&l ...

  2. Linux输入输出重定向和文件查找值grep命令

    Linux输入输出重定向和文件查找值grep命令 一.文件描述符Linux 的shell命令,可以通过文件描述符来引用一些文件,通常使用到的文件描述符为0,1,2.Linux系统实际上有12个文件描述 ...

  3. [转帖]Linux教程(12)- linux输入输出重定向

    Linux教程(12)- linux输入输出重定向 2018-08-21 22:57:02 钱婷婷 阅读数 49更多 分类专栏: Linux教程与操作 Linux教程与使用   版权声明:本文为博主原 ...

  4. Linux 输入输出重定向, &>file, 2>&1, 1>&2

    Linux 输入输出重定向, &>file, 2>&1, 1>&2 一.1和2在Linux中代表什么 1.1 输出重定向 1.2 输入重定向 1.3 绑定重定 ...

  5. linux输入输出重定向

    http://www.cnblogs.com/chengmo/archive/2010/10/20/1855805.html 在Linux下,当一个用户进程被创建的时候,系统会自动为该进程创建三个数据 ...

  6. Linux 输入输出(I/O)重定向

    目录 1.概念 Linux 文件描述符 2.输出重定向 格式 示例 注意 3.输入重定向 格式 示例 4.自定义输入输出设备 解释 示例 最后说两句 1.概念 在解释什么是重定向之前,先来说说什么是文 ...

  7. [100]linux输入输出重定向

    一目了然版本: &号含义: 参考 参考:非常经典,值得一看,我是在linux爱好者公众号里发现的. 下面是我自己的一些总结. linux的命令数据流 在Linux下,当一个用户进程被创建的时候 ...

  8. linux输入输出、重定向、管道

    本篇讲述linux系统的输入输出.管道和重定向. 1. liunx的输入输出 一个linux系统要想发挥作用,就要有输入输出,这样才可以与外界交互. 类型 设备文件名 文件描述符 设备名称 说明 备注 ...

  9. LINUX输入输出与文件——续

    1 目录操作 改变目录或文件的访问权限 #include <sys/stat.h> int chmod(const char *path, mode_t mode); //mode形如07 ...

  10. LINUX输入输出与文件

    1 文件描述符 内核为每个进程维护一个已打开文件的记录表(实现为结构体数组),文件描述符是一个较小的正整数(0-1023)(结构体数组下标),它代表记录表的一项,通过文件描述符和一组基于文件描述符的文 ...

随机推荐

  1. offline 2 online | 重要性采样,把 offline + online 数据化为 on-policy samples

    论文标题:Offline-to-Online Reinforcement Learning via Balanced Replay and Pessimistic Q-Ensemble CoRL 20 ...

  2. junit自定义测试方法执行顺序

    平常我们写单元测试类,多个方法的执行顺序其实是没有特定顺序的.例如下面代码: package com.laoxu.gamedog; import org.junit.FixMethodOrder; i ...

  3. wsl 配置ubuntu apt源为阿里源

    $ sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak $ sudo sed -i 's/security.ubuntu/mirrors.a ...

  4. 分层架构设计模式总结-MVC,洋葱架构,整洁架构,六边形架构,DDD等等

    一.单层结构不分层 最开始开发项目时,由于需求较少,用一个单独的工程文件就可以满足开发的需求了,不需要进行划分. 二.MVC 分层和三层 到后面需求越来越多,于是就把文件进行分解,怎么分解?有人提出了 ...

  5. 零难度指南:手把手教你如何通过在线Excel实现资产负债表

    前言 作为财务分析中的三大报表之一,资产负债表的作用是展示一个企业在特定时间点上的财务状况.今天小编就为大家介绍一下如何使用葡萄城公司的纯前端在线表格控件SpreadJS实现一个资产负债表. 环境准备 ...

  6. 参数替换xargs

    由于很多命令不支持管道|来传递参数,xargs用于产生某个命令的参数,xargs可以读入stdin的数据,并且以空格符或回车符将stdin的数据分隔为参数 示例: 创建10个用户 echo user{ ...

  7. MongoDB的安装及启动

    下载地址 https://www.mongodb.com/try/download/community 安装步骤 自定义安装目录 配置环境 下面是你安装后的mongodb的目录 在电脑的环境变量Pat ...

  8. 360 数科实践:JanusGraph 到 NebulaGraph 迁移

    摘要:在本文中 360 数科的周鹏详细讲解了业务从 JanusGraph 迁移到 Nebula Graph 带来的性能提升,在机器资源不到之前 JanusGraph 配置三分之一的情况下,业务性能提升 ...

  9. vmware完全卸载 防止出现各种问题治标不治本

    首先打开系统盘根目录,搜索" VMware ",把搜到的都删掉,去控制面板那里卸载掉VMware 打开管理(右键"我的电脑"),管理打开设备管理器," ...

  10. 设计原则 --- SOLID

    引言 SOLID是五个常见的面向对象设计原则的缩写,其目的是帮助开发者设计易于维护和扩展的软件系统 其中包含单一职责原则(SRP),开闭原则(OCP),里氏替换原则(LSP),接口隔离原则(ISP), ...