linux呈现数据

Posted 小公子”

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux呈现数据相关的知识,希望对你有一定的参考价值。

文章目录

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

shell脚本中最多可以有9个打开的文件描述符。上述为0-2,剩余的为3-8,作为输入或输出重定向都可。

各种重定向

输入重定向 <

# 通过STDIN重定向符号强制cat命令接受来自另一个非STDIN文件的输入:
$ cat < test1
# cat命令会用testfile文件中的行为作为输入。

输出重定向 >

# 将ls -l 之后得到的数据输出到 test 文件中
$ ls -l > test2

通过输出重定向符号>,将通常会显示到显示器的所有输出会被shell重定向到指定的重定向文件。

数据追加 >>

# 将 - who - 命令,得到的数据追加到test2文件的末尾
who >> test2

只重定向错误 2

# 只重定向错误信息,文件描述符 - 2 - 紧贴重定向符号
$ ls -al badfile 2> test3
$ cat test3
ls:cannot access badfile:No such file or directory
$

重定向 错误 和 数据 到 不同的文件

ls -al test4 test5 badfile 2> test6 1> test7
# 解析:
# 1> 将本该输出到STDOUT的正常输出重定向到 test7 文件
# 2> 将本该输出到STDERR的错误消息重定向到 test6 文件

重定向 错误和数据 到 同一个文件 &>

ls -al test8 test9 badfile &> test10
# 命令生成的所有输出都会发送个到同一个位置 - test10 - 

bash shell会自动给错误消息分配较标准输出更高的优先级,这样便可以在一处地方查看错误消息了,不用翻遍整个输出文件。

临时重定向 &

故意在脚本中生成错误消息,可以将单独的一行输出重定向到STDERR。
所需要做的:使用输出重定向符来将输出重定向到STDERR文件描述符。
在重定向到文件描述符时,必须在文件描述符数字前加一个 - and - (&)

echo 'this is an error message.' >&2
$ cat test11
#!/bin/bash
#testing STDERR messages
echo "this is an error" >&2
echo "this is normal output"
$
$ ./test11
this is an error  #默认情况下,linux会将STDERR定向到STDOUT。
this is normal output
$ ./test11 2> test12  # 如果在运行脚本时重定向了STDERR,脚本中所有定向到STDERR的文本都会被重定向
this is normal output
$ cat test12
this is an error

永久重定向 exec 输出重定向

如果脚本中有大量的数据需要重定向,那重定向每个echo语句就很繁琐。
取而代之,可以使用exec命令告诉shell在脚本执行期间重定向某个特定文件描述符:

$ cat test13
#!/bin/bash
# redirecting all output to a file
exec 1> test14

echo "this is a test of redirecting all output"
echo "from a script to another file"
echo "without having to redirect every individual line"
$
$ ./test13
$ cat test14
this is a test of redirecting all output
from a script to another file
without having to redirect every individual line

$ cat test15
#!/bin/bash
exec 2> testerror

echo "this is the start of the script"
echo "now redirecting all output to another location"

exec 1> testout

echo "this output should go to the testout file"
echo "but this shoud go to the testerror file" >&2
$
$ ./test15
this is the start of the script
now redirecting all output to another location
$ cat testout
this output should go to the testout file
$ cat testerror
but this shoud go to the testerror file

输入重定向 exec 0< testfile

可以在脚本中重定向STDOUT和STDERR的方式来将STDIN从键盘重定向到其他位置。
具体语句:exec 0< testfile

$ cat test16
#!/bin/bash
#redirecting to the file input

exec 0< testfile #读取filetest中的数据来作为输入
count=1

while read line
do 
	echo "line #$count:$line"
	count=$[ $count + 1]
done
$ ./test16
Line #1:this is the first line
Line #2:this is the second line
Line #3:this is the third line

自定义重定向

$ cat test17
#!/bin/bash
exec 3> testfile
echo "this should display on the monitor"
echo "and this should be stored in the file" >&3
echo "then this should be back on the monitor"
$ ./test17
and this should be stored in the file
then this should be back on the monitor
$ cat testfile
and this should be stored in the file

重定向文件描述符 exec 3>&1

具体:看例子

$ cat test18
#!/bin/bash
exec 3>&1   # 将文件描述符3重定向到文件描述符1的当前位置 - STDOUT
exec 1>test18out  # 将STDOUT重定向到文件 - test18out

echo "this store in the output file"
echo "along with this line"

exec 1>&3  # 将STDOUT指向文件描述符3。
# 注意:虽然此时将stdout发送给文件描述符3,它仍会出现在显示器上,即时STDOUT已经被重定向过。
echo "now back to normal"
$
$ ./test18
now back to normal
$ ./test18out
this store in the output file
along with this line

注意:有些迷,不理解不强求。

创建输入文件描述符

$ cat test19
#!/bin/bash
exec 6<&0  #文件描述符6用来保存STDIN的位置
exec 0< testfile  # STDIN重定向到testfile

count=1
while read line
do
	echo "Line #$count:$line"
	conut=$[ $count + 1]
done

exec 0<&6  将STDIN恢复到原来的位置 - 即键盘啥的?
read -p "are you done now?" answer
case $answer in
Y|y) echo "Goodbye";;
N|n) echo "sorry,this is the end";;
esac
$
$ ./test19
Line #1:first line
Line #2:second line
Line #3:third line
are you done now?y
Goodbye

创建临时文件/目录

linux使用/tmp目录来存放不需要一直保留的文件。大多数Linux发行版配置了系统在启动时自动删除tmp目录的所有文件。

系统上的任何用户都有权限在tmp目录中读和写

创建本地临时文件

具体命令:mktemp testing.XXXXXX

mktemp命令会用6个字符码替换着这6个X

$ mktemp testting.XXXXXX
testing.1DrElv   # mktemp 命令会用6个字符码替换这6个X,从而保证文件名在目录中是唯一的。

在脚本中使用mktemp命令时,你可能要将文件名保存到变量中,这样才能在后面的脚本中引用。

$ cat test20
#!/bin/bash
tempfile=`mktemp test20.XXXXXX`
exec 3>&tempfile
echo "this script write to temp file: $tempfile
echo "this is the first line.">&3
echo "this is the second line.">&3
echo "this is the third line.">&3
exec 3>&-

echo "Done creating temp file.The contents are:"
cat $tempfile
rm -f $tempfile 2> /dev/null
$ ./test20
this script write to temp file:test20.5Df6hj
Done creating temp file.The contents are:
this is the first line.
this is the second line.
this is the third line.

在/tmp目录创建临时文件

-t选项会强制mktemp命令在系统的临时目录下创建该文件。用这个特性,mktemp命令会返回用来创建临时文件的全路径,而不是只有文件名。

$ mktemp -t test21.XXXXXX

创建临时目录

-d命令来创建临时目录。

$ mktemp -d dir.XXXXXX

记录消息

有时将输出一边发送到显示器一边发送到日志文件。
这会有一些好处,不用将输出重定向两次,只要用特殊的tee命令就行。


tee相当于管道的一个T型接头,它将从STDIN 过来的数据同时发给两个目的地。
一个目的地时STDOUT;
另一个目的地是tee命令行所指定的文件名

tee filename
$ date | tee test22

注意:tee命令会在每次使用时覆盖输出文件的内容。
如果想要追加数据,必须使用-a选项。

$ date | tee -a test23

以上是关于linux呈现数据的主要内容,如果未能解决你的问题,请参考以下文章

shell初级-----数据呈现方式

Shell编程—呈现数据

linux虚拟机突然打不开,呈现如下界面???求解

Linux内核中数据包的传输过程

Linux内核中数据包的传输过程

linux呈现数据