IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 七、重定向及管道 -> 正文阅读

[系统运维]七、重定向及管道

本章节介绍重定向及管道的运用。这两个要好好理解,因为工作中用得非常之多,所以一定要掌握好。

运维基本功专栏地址:https://blog.csdn.net/qq_41765918/category_11608412.html

7.1 标准输入和输出

程序:指令+数据
读入数据:Input
输出数据:Output
打开的文件都有一个fd: file descriptor (文件描述符)

文件描述符定义

文件描述符:是内核为了高效管理已被打开的文件所创建的索引,用于指向被打开的文件,所有执行I/O操作的系统调用都通过文件描述符;文件描述符是一个简单的非负整数,用以标明每一个被进程所打开的文件,程序刚刚启动的时候,第一个打开的文件是0,第二个是1,依此类推。也可以理解为是一个文件的身份ID。
用户通过操作系统处理信息的过程中,使用的交互设备文件(键盘,鼠标,显示器)

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

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

image-20220129154834347

范例:文件描述符

[root@servera ~]# ll /dev/std*
lrwxrwxrwx. 1 root root 15 Mar 25 19:21 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx. 1 root root 15 Mar 25 19:21 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx. 1 root root 15 Mar 25 19:21 /dev/stdout -> /proc/self/fd/1

7.2 I/O重定向 redirect

I/O重定向:将默认的输入,输出或错误对应的设备改变,指向新的目标

7.2.1 标准输出和错误重新定向

STDOUT和STDERR可以被重定向到指定文件,而非默认的当前终端

格式:

命令 操作符号 文件名

支持的操作符号包括:

1> 或 >  把STDOUT重定向到文件
2> 把STDERR重定向到文件
&> 把标准输出和错误都重定向
>& 把标准输出和错误都重定向,即和上面功能一样,建议使用上面方式

以上如果文件已存在,文件内容会被覆盖

set -C 禁止将内容覆盖已有文件,但可追加, 利用 >| 仍可强制覆盖
set +C 允许覆盖,默认

范例:

[root@servera ~]# ls ~ > /tmp/ls
[root@servera ~]# cat /tmp/ls
anaconda-ks.cfg
Desktop
Documents
Downloads
initial-setup-ks.cfg
Music
passwd
Pictures
Public
set
Templates
Videos

[root@servera ~]# ls xxx > /tmp/error
ls: cannot access 'xxx': No such file or directory
[root@servera ~]# cat /tmp/error

[root@servera ~]# ls xxx 2> /tmp/error 
[root@servera ~]# cat /tmp/error 
ls: cannot access 'xxx': No such file or directory

[root@servera ~]# ls ~ xxx &> all
[root@servera ~]# cat all
ls: cannot access 'xxx': No such file or directory
/root:
all
anaconda-ks.cfg
Desktop
Documents
Downloads
initial-setup-ks.cfg
Music
passwd
Pictures
Public
set
Templates
Videos

追加

>> 可以在原有内容基础上,追加内容
把输出和错误重新定向追加到文件

>> 追加标准输出重定向至文件
2>> 追加标准错误重定向至文件

范例:

[root@servera ~]# ls /opt xxx &>> all
[root@servera ~]# cat all
ls: cannot access 'xxx': No such file or directory
/root:
all
anaconda-ks.cfg
Desktop
Documents
Downloads
initial-setup-ks.cfg
Music
passwd
Pictures
Public
set
Templates
Videos
ls: cannot access 'xxx': No such file or directory
/opt:
test

7.2.2 标准输入重定向

从文件中导入STDIN,代替当前终端的输入设备,使用 < 来重定向标准输入
某些命令能够接受从文件中导入的STDIN

如bc命令

范例:

[root@servera ~]# echo 2^3 > bc.log
[root@servera ~]# cat bc.log 
2^3
[root@servera ~]# bc < bc.log 
8

7.2.3 把多行重定向

使用 “<<终止词” 命令从键盘把多行重导向给STDIN,直到终止词位置之前的所有文本都发送给
STDIN,有时被称为就地文本(here documents)
其中终止词可以是任何一个或多个符号,比如:!,@,$,EOF(End Of File)等,其中EOF
比较常用
范例:

[root@servera ~]# cat > test << EOF
> 1
> 2
> 3
> EOF
[root@servera ~]# cat test 
1
2
3

[root@servera ~]# cat >> test << EOF
> 4
> 5
> 6
> EOF
[root@servera ~]# cat test 
1
2
3
4
5
6

小结

把上面的描述做个总结,如下:

类型语法格式作用
标准输出重定向>以覆盖的方式,把命令的正确输出,输出到指定的文件或者设备中
标准输出重定向>>以追加的方式,把命令的正确输出,输出到指定的文件或者设备中
标准错误输出重定向2>以覆盖的方式,把命令的错误输出,输出到指定的文件或者设备中
标准错误输出重定向2>>以追加的方式,把命令的错误输出,输出到指定的文件或者设备中

在工作中,使用得最多的形式:

类型语法格式作用
同时保存正确输出和错误输出命令 > 文件 2>&1以覆盖的方式,把正确输出和错误输出都保存到同一个文件中。
命令 >> 文件 2>&1以追加的方式,把正确输出和错误输出都保存到同一个文件中。
命令 &> 文件以覆盖的方式,把正确输出和错误输出都保存到同一个文件中。
命令 &>> 文件以追加的方式,把正确输出和错误输出都保存到同一个文件中。
命令 >> 文件1 2>> 文件2把正确的输出追加到文件1中,把错误的输出追加到文件2中

两个特别的操作

1>&2 把标准输出重定向到标准错误

image-20220129160132408

2>&1 把标准错误重定向到标准输出

image-20220129160202244

工作中启动脚本的运用

截取工作中 JAVA 程序的启动脚本片段:

start() {
cd ${SOFTHOME}
nohup java -server -Xms512m -Xmx1g -XX:+UseG1GC -verbose:gc -Xloggc:${GCLOG} -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${DUMPPATH} -jar ${SERVICE} --spring.config.location=${CONFIGFILE} >> ${NOHUP} 2>&1 &
}

将输出定义到指定的变量 ${NOHUP} 中。

7.3 管道

7.3.1 管道

管道(使用符号“|”表示)用来连接多个命令
格式:

命令1 | 命令2 | 命令3 | …

image-20220129173044945

功能说明:

  • 将命令1的STDOUT发送给命令2的STDIN,命令2的STDOUT发送到命令3的STDIN
  • 所有命令会在当前shell进程的子shell进程中执行
  • 组合多种工具的功能
[root@servera ~]# echo 2^3 | bc
8

ifconfig | grep ens160 -A 1 | tail -n 1 | tr -s " " | cut -d" " -f3

注意:

1、管道命令只处理前一个命令正确输出,不处理错误输出

2、管道右边的命令,必须能够接收标准输入的数据流命令才行

3、管道符可以把两条命令连起来,它可以链接多个命令使用

7.3.2 tee

利用 tee 命令可以重定向到多个目标,经常配合管道符一起使用
格式

命令1 | tee [-a ] 文件名 | 命令2 ......

以上可以把命令1的STDOUT保存在文件中,做为命令2的输入
选项:

-a, --append		内容追加到给定的文件而非覆盖
	--help  在线帮助

tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件

image-20220129173330187

功能:

  • 保存不同阶段的输出
  • 复杂管道的故障排除
  • 同时查看和记录输出
[root@servera ~]# echo 2+3 | tee -a bc.log | bc
5

[root@servera ~]# cat << EOF | tee test1
> 2
> 3
> 4
> 5
> EOF
2
3
4
5
[root@servera ~]# cat test1
2
3
4
5

总结

  • 介绍标准输入和输出的概念。
  • 介绍 I/O 重定向的运用。
  • 介绍管道的运用。
  • 若喜欢金鱼哥的文章,顺手点个赞。也可点个关注,因为后续会不断上干货。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-01-30 19:17:57  更:2022-01-30 19:19:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 7:51:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码