Linux IO重定向

1.重定向概述

1.1 什么是重定向;

将原本要输出到屏幕的数据信息,重新定向到某个指定的文件中。

1.2 重定向使用的场景;

1.当屏幕输出的信息很重要,而且希望保存重要的信息时;
2.后台执行中的程序,不希望他干扰屏幕正常的输出结果时;
3.系统的例行命令, 例如定时任务的执行结果,希望可以存下来时;
4.一些执行命令,我们已经知道他可能出现错误信息, 想将他直接丢弃时;
5.错误日志与正确日志需要分别输出至不同的文件保存时;

1.3 学习重定向的基本知识;

在Linux上面打开一个程序的时候,通常会自动打开三个文件,分别是标准输入,标准输出,错误输出。

1.首先进程是无法直接访问硬件,需要借助内核来访问文件;而内核 kernel 需要利用文件描述符 (filedescriptor) 来访问文件。

2.文件标识符:文件描述符是非负整数。打开现存文件或新建文件时,内核会返回一个文件描述符。

3.总结:进程--通过-->文件描述符(非负整数)--访问-->文件名称--通过-->自身inode(存放着原始文件路径信息)读到了软链接信息--找到了--原始文件;文件标识符,本质上就是一个软链接。

ll /proc/$$/fd   #当前运行终端进程运行的信息,每打开一个文件,都会自动分配0、1、2这三个数字。

 

 

 4.进程将从标准输入中得到数据,将正常输出打印至屏幕终端,将错误的输出信息也打印至屏幕终端。

PS: 进程是使用文件描述符(file descriptors)来管理打开的文件

 

 

 

 

 

例如:

第一步:运行 tail -f /etc/passwd

第二步:通过文件描述符3 -->/etc/passwd 文件-->inode 信息--> block数据块

第三步:正确输出---> 默认情况下通过文件描述 1 ---> 当前终端 1>(改变输出的位置,指定文件、黑洞/dev/null)

第四步:错误输出--> 默认情况下通过文件描述2 --->当前终端 2>

通常程序访问一个文件至少会打开三个标准文件,分别是标准输入、标准输出、错误输出。

进程将从标准输入中得到数据,将正常输出打印至屏幕终端,将错误的输出信息也打印至屏幕终端。

 

 

2.输出重定向案例

输出重定向,改变输出内容的位置。输出重定向有如下几种方式,如表格所示。

 

 

 

 

 

 

2.1 标注输出重定向

PS:> /etc/passwd   =后面直接跟文件,这样做直接会将文件清空,是个危险的操作。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3.输入重定向案例

输入重定向:指的是 ”重新指定设备“ 来 “代替键盘” 作为新的输入设备。

3.1 通过输入重定向读入文件内容;

 

 

 3.2 通过输入重定向读入多行内容;

 

 

 3.3 脚本输入重定向

使用输入重定向打印安装服务的菜单导航栏;

 

 

 

 3.4 输入重定向使用场景

1.恢复数据的时候;

2.脚本打印菜单时会用到;

3.cat写入文件时;vim

 

4.进程管道技术

概念:管道操作符号  “ | ”,主要用来主要用来连接左右两个命令, 将左侧的命令的【标准输出】,交给右侧命令的【标准输入】。

示例1:awk -F: '{print $7}'/etc/passwd |sort |uniq -c   ==统计当前 /etc/passwd 中用户使用的shell 类型

示例2:sort -t":" -k3 -n/etc/passwd |head   ==将  /etc/passwd 中的用户按  UID 大小排序

示例3:ip addr |grep 'inet ' |awk '{print $2}' |awk -F"/" '{print $1}'   ==打印当前主机所有网卡的ip地址

PS:前者命令的标准错误输出,无法传递!!!

 

 

 

 4. 管道中使用tee

 tee:命令用于将数据重定向到文件,同时提供一份重定向数据的副本作为后续命令的标准输入。简单地说就是把数据重定向到指定文件和屏幕上(多重定向)。

-a :向文件追加内容,而不是覆盖。

范例:

 

 

 

 

5. 管道中使用xargs

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

xargs命令是向其他命令传递命令行参数的一个过滤器,能够将管道或者标准输入传递的数据转换成xargs命令后跟随的命令的命令行参数。

选项:

-n 指定每行的最大参数量n,可以将标准输入的文本划分成为多行,每行n个参数,默认空格为分隔符。

范例:将30个数字,每行10个排序。

 

 

 -i 以{}替代前面的结果

范例:将find查找到的文件,用移动到/data目录下。

 

 

  -I (大写I)指定一个符号代替前面的结果,不用-i默认的{}

范例:用“[]”代替前面的结果,然后拷贝到/root/目录下。

 

 

 -d 自定义分割符

范例:将“:”作为分割符,每行做多输出4个。

 

 

-0 (数字0)用null代替空格作为分隔符,配合find命令的-print0选项输出使用。

范例:

 

 

 

 

 

 

  

 

 

 

 

 

 

 

 

 

  

 

posted @ 2021-07-18 16:11  zhengkang  阅读(228)  评论(0)    收藏  举报