Linux呈现数据

2024-05-10 06:36
文章标签 数据 linux 呈现

本文主要是介绍Linux呈现数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、理解输入和输出

1.1 标准文件描述符

 1.1.1 STDIN

 1.1.2 STDOUT

1.1.3 STDERR

1.2 重定向错误

二、在脚本中重定向输出

2.1 临时重定向

2.2 永久重定向 

三、在脚本中重定向输入

四、创建自己的重定向

4.1 创建输出文件描述符 

 4.2 重定向文件描述符

4.3 关闭文件描述符 


一、理解输入和输出

1.1 标准文件描述符

Linux系统会将每个对象作为文件来处理,这包括输入和输出。Linxu用文件描述符来标识每个文件对象。文件描述符是一个非负整数,每个进程一次最多可以打开9个文件描述符。出于特殊目的,bash shell保留了前3个文件描述符(0、1和2)

Linux标准文件描述符
文件描述符缩写描述
0STDIN标准输入
1STDOUT标准输出
2STDERR标准错误

 1.1.1 STDIN

STDIN文件描述符代表shell的标准输入。对终端界面来说,标准输入是键盘。在使用输入重定向符(<)时,Linux会用重定向指定的文件替换标准输入文件描述符(即0),命令就会从文件中读取数据,就像从键盘中输入的一样

[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat < testfile
hello world
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#

 1.1.2 STDOUT

STDOUT文件描述符代表shell的标准输出。在终端界面上,标准输出就是终端显示器。在默认情况下,大多数bash命令会将输出送往STDOUT文件描述符。可以用输出重定向来更改此设置。

[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# ls > test_stdout.txt
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat test_stdout.txt
script
testfile
test_stdout.txt
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#

1.1.3 STDERR

在默认情况下,STDOUT和STDERR指向同一个地方(尽管二者的文件描述符索引值不同) ,也就是说都会显示在屏幕上。STDERR并不会随着STDOUT的重定向发生改变,STDERR文件描述符是2。

[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# ls bb.txt
ls: cannot access bb.txt: No such file or directory
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# ls bb.txt 2> test_stderr.txt
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat test_stderr.txt
ls: cannot access bb.txt: No such file or directory
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#

1.2 重定向错误

如果想重定向错误信息和正常输出,则必须指定两个重定向符号

[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# ls script bbfile
ls: cannot access bbfile: No such file or directory
script:
aa.exp
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# ls script bbfile 2> test1 1> test2
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat  test1
ls: cannot access bbfile: No such file or directory
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat test2
script:
aa.exp
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#

 上例中,ls命令的正常输出本该送往STDOUT,shell使用 1> 将其重定向到了文件test2,而本该送往STDERR的错误信息则通过 2> 被重定向到了文件test1中。

另外你还可以将STDOUT和STDERR的输出重定向到同一个文件,重定向符 &>

二、在脚本中重定向输出

2.1 临时重定向

如果你有意在脚本中生成错误信息,可以将单独的一行重定向到STDERR。这只需要使用输出重定向符号将输出重定向到STDERR 文件描述符。在重定向到文件描述符时,必须在文件描述索引值之前加一个&

[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat test8
#! /bin/bashecho "This is an error" >&2
echo "This is normal output"
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# ./test8
This is an error
This is normal output
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#

如果单独运行脚本看不出任何区别,因为,默认情况下,STDOUT和STDERR指向的位置是一样的。但是如果在运行脚本时重定向了STDERR,那么脚本中所有送往STDERR的文本就会被重定向 

[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# ./test8 2> test9
This is normal output
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat test9
This is an error
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#

2.2 永久重定向 

如果脚本中有大量数据需要重定向,那么逐条重定向就会很麻烦,这时可以用 exec 命令,它会告诉shell在脚本执行期间重定向某个特定文件描述符:

[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat test10
#! /bin/bashexec 1>testoutecho "nihao"
echo "zhongguo"
echo "hahah"
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# ./test10
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat testout
nihao
zhongguo
hahah
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#

 exec会启动一个新的shell并将STDOUT文件描述符重定向到指定文件。脚本中送往STDOUT的所有输出都会被重定向。

也可以在脚本执行过程中重定向STDERR

[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat test11
#! /bin/bashexec 2>testerrecho "这是标准输出1"
echo "这是标准输出2"
echo "这是标准输出3"exec 1>testoutecho "这里的输出将会重定向到指定文件"
echo "这行将会重定向到标准错误" >&2
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# ./test11
这是标准输出1
这是标准输出2
这是标准输出3
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat testout
这里的输出将会重定向到指定文件
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat testerr
这行将会重定向到标准错误
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#

该脚本使用 exec 命令 将送往STDERR的输出重定向到了文件testerr。接下来,脚本用echo语句向STDOUT显示了几行文本。随后再次使用 exec 将STDOUT重定向到文件testout。注意,尽管STDOUT被重定向了。然然可以将echo语句的输出发送给STDERR,本例中仍是被重定向到了testerr文件。

一旦重定向了STDOUT或STDERR,就不太容易将其恢复到原来的位置,如果需要再重定向中来回切换,那么就要用到后面介绍的创建自己的重定向

三、在脚本中重定向输入

相同的方法,可以使用重定向将STDIN从键盘重定向到其他位置。在Linux系统中允许将STDIN重定向为文件:

exec 0< testfile

 该命令会告诉shell,他应该从文件testfile中而不是键盘上获取输入。

[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat testfile
this is the first line
this is the second line
this is the third line
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat test12
#! /bin/bashexec 0< testfilecount=1while read line
doecho "Line #$count: $line"count=$[ $count + 1 ]
done
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# ./test12
Line #1: this is the first line
Line #2: this is the second line
Line #3: this is the third line
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#

 将STDIN重定向为文件后,当read命令试图冲STDIN读入数据时,就会到文件而不是键盘上检索数据。

这是一种在脚本中从待处理的文件中读取数据的绝妙技术。Linux管理员的日常任务之一就是从日志文件中读取并处理数据,这是完成该任务的最简单的办法。

四、创建自己的重定向

在脚本中重定向输入和输出时,并不局限于这3个默认的文件描述符。在shell中最多可以打开9个文件描述符。替代性文件描述符从3到8共6个,均可以用作输入或输出重定向。 

4.1 创建输出文件描述符 

可以用 exec  命令用于分配输出的文件描述符。和标准文件描述符一样,一旦将替代性文件描述符指向文件,此定向就会一直有效,直至重新分配。

[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat test13
#! /bin/bashexec 3> test13outecho "输出到显示器"
echo "输出到指定文件" >&3
echo "也是输出到屏幕"
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# ./test13
输出到显示器
也是输出到屏幕
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat test13out
输出到指定文件
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#

 4.2 重定向文件描述符

有一个技巧能帮助你恢复到已重定向的文件描述符。你可以将另一个文件描述符分配给标准文件描述符,反之亦可。这意味着可以将STDOUT的原先位置重定向到另一个文件描述符,然后再利用该文件描述符恢复STDOUT。

[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat test14
#! /bin/bashexec 3>&1
exec 1> test14outecho "改行内容将会重定向到test14out中"exec 1>&3echo "这行内容将正常显示在屏幕上"
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# ./test14
这行内容将正常显示在屏幕上
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]# cat test14out
改行内容将会重定向到test14out中
[root@iZbp1ir1vzqwzkdy7mvjthZ ~]#

 该脚本中,第一个 exec 命令将文件描述符3重定向到文件描述符1(STDOUT)的当前位置,也就是显示器。

第二个 exec 命令将STDOUT重定向到了文件。但是,文件描述符 3 扔指向显示器。如果此时将输出数据发送给文件描述符 3 ,他仍然会显示在屏幕上,即使STDOUT已经被重定向了。

向STDOUT(现在指向一个文件)发送一些输出之后,第三个 exec 命令将STDOUT重定向了文件描述符 3 的当前位置(现在仍然是显示器)。这意味着现在STDOUT又恢复如初了。

4.3 关闭文件描述符 

如果创建了新的输入文件描述符或输出文件描述符,那么shell会在脚本退出时自动将其关闭。然而在一些情况下,需要在脚本结束前手动关闭文件描述符。

要关闭文件描述符,只需将其重定向到特殊符号 &- 即可

exec 3>&-

这篇关于Linux呈现数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/975704

相关文章

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

Python实现将实体类列表数据导出到Excel文件

《Python实现将实体类列表数据导出到Excel文件》在数据处理和报告生成中,将实体类的列表数据导出到Excel文件是一项常见任务,Python提供了多种库来实现这一目标,下面就来跟随小编一起学习一... 目录一、环境准备二、定义实体类三、创建实体类列表四、将实体类列表转换为DataFrame五、导出Da

Python实现数据清洗的18种方法

《Python实现数据清洗的18种方法》本文主要介绍了Python实现数据清洗的18种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录1. 去除字符串两边空格2. 转换数据类型3. 大小写转换4. 移除列表中的重复元素5. 快速统

Python数据处理之导入导出Excel数据方式

《Python数据处理之导入导出Excel数据方式》Python是Excel数据处理的绝佳工具,通过Pandas和Openpyxl等库可以实现数据的导入、导出和自动化处理,从基础的数据读取和清洗到复杂... 目录python导入导出Excel数据开启数据之旅:为什么Python是Excel数据处理的最佳拍档

Linux Mint Xia 22.1重磅发布: 重要更新一览

《LinuxMintXia22.1重磅发布:重要更新一览》Beta版LinuxMint“Xia”22.1发布,新版本基于Ubuntu24.04,内核版本为Linux6.8,这... linux Mint 22.1「Xia」正式发布啦!这次更新带来了诸多优化和改进,进一步巩固了 Mint 在 Linux 桌面

LinuxMint怎么安装? Linux Mint22下载安装图文教程

《LinuxMint怎么安装?LinuxMint22下载安装图文教程》LinuxMint22发布以后,有很多新功能,很多朋友想要下载并安装,该怎么操作呢?下面我们就来看看详细安装指南... linux Mint 是一款基于 Ubuntu 的流行发行版,凭借其现代、精致、易于使用的特性,深受小伙伴们所喜爱。对