日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

《Linux命令行与shell脚本编程大全》第十五章 呈现数据

發(fā)布時(shí)間:2024/8/26 linux 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《Linux命令行与shell脚本编程大全》第十五章 呈现数据 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

15.1 理解輸入和輸出

現(xiàn)在知道兩種顯示腳本輸出的方法

1)在顯示器屏幕上顯示

2)將輸出文件重定向到文件中

15.1.1 標(biāo)準(zhǔn)文件描述符

Linux系統(tǒng)將每個(gè)對象當(dāng)做文件處理。這包括輸入和數(shù)出進(jìn)程。

Linux用文件描述符來標(biāo)識每個(gè)文件對象。

它是一個(gè)非負(fù)整數(shù),可以唯一標(biāo)識會話中打開的文件。

每個(gè)進(jìn)程一次最多可以有九個(gè)文件描述符

bash shell保留的前3個(gè)文件描述符(0、 1、 2)

?

1.STDIN 標(biāo)準(zhǔn)輸入(0)

STDIN文件代表shell的標(biāo)準(zhǔn)輸入。

對終端界面來說,標(biāo)準(zhǔn)輸入是鍵盤。

shell從STDIN文件描述符對應(yīng)的鍵盤獲得輸入,在用戶輸入時(shí)處理每個(gè)字符

在使用輸入重定向符號( < )時(shí),Linux會用重定向指定的文件來替換標(biāo)準(zhǔn)輸入文件描述符。它會讀取文件并提取數(shù)據(jù),就如同它是鍵盤上鍵入的。

?

2.STDOUT 標(biāo)準(zhǔn)輸出(1)

STDOUT文件描述符代表shell的標(biāo)準(zhǔn)輸出。

對終端界面來說,標(biāo)準(zhǔn)輸出是終端顯示器。shell的所有輸出會被定向到標(biāo)準(zhǔn)輸出中。

也可以通過輸出重定向( > )來改變輸出。通過輸出重定向符號,可以將本來顯示在顯示器上的輸出重定向到指定的文件。

>>? 表示追加到文件

注意:用了輸出重定向,shell并未將錯(cuò)誤消息重定向到輸出重定向文件中。錯(cuò)誤消息仍會顯示在顯示器中。

?

3.STDERR 標(biāo)準(zhǔn)錯(cuò)誤(2)

STDERR文件描述符來處理錯(cuò)誤消息。

shell或shell中運(yùn)行的程序和腳本出錯(cuò)時(shí)生成的錯(cuò)誤消息都會發(fā)送到這個(gè)位置。

默認(rèn)情況下STROUT和STDERR指向同樣的地方(顯示器)。但是STDERR不會隨著STDOUT重定向而發(fā)生改變。

?

15.1.2 重定向錯(cuò)誤

1.只重定向錯(cuò)誤

將該文件描述符值(2)放在重定向符號(>)前面,必須挨著,不能有空格。

比如,查看一個(gè)不存在的文件:

$ls –al 2> log.txt

這種方法只會重定向錯(cuò)誤消息,普通輸出不會被重定向。

?

2. 重定向錯(cuò)誤和數(shù)據(jù)

需要用兩個(gè)重定向符號,需要在符號前面放上待重定向數(shù)據(jù)所對應(yīng)的文件描述符,然后指定用于保存數(shù)據(jù)的輸出文件。

例如:

$ls -al test1 test2 test3 badfile 2> ErrLog.txt 1> DataLog.txt

表示將錯(cuò)誤信息重定向到ErrLog.txt,正常輸出重定向到DataLog.txt。

這樣錯(cuò)誤信息和正常輸出就分開在兩文件了。

?

$ls -al test1 test2 test3 badfile &> AllLog.txt

這樣表示將STDOUT和STDERR重定向到同一個(gè)文件AllLog.txt中了。

bash shell自動賦予了錯(cuò)誤消息更高的優(yōu)先級,這樣可以集中瀏覽錯(cuò)誤信息了。

?

15.2 在腳本中重定向輸出

有兩種方法:

1)臨時(shí)重定向行輸出

2)永久重定向腳本中的所有命令

15.2.1 臨時(shí)重定向

可以單獨(dú)將一行重定向到STDERR。

比如:

echo “this is error msg” >&2

echo “this is normal msg”

?

正常運(yùn)行不會看出什么,但是假如運(yùn)行時(shí)重定向了STDERR就有意思了。

$./test 2> Error.txt

就可以看到第一行輸出到了 Error.txt。而正常輸出還是在屏幕上。

?

15.2.2 永久重定向

如果有大量數(shù)據(jù)需要重定向,那么就會比較麻煩。

新方法:用exec命令告訴shell在腳本執(zhí)行期間重定向某個(gè)特定文件描述符

直接上例子:

1 #!/bin/bash

? 2 echo "this is error msg step1" >&2

? 3 echo "this is normal msg step1"

? 4 # 上面沒有重定向,所以還是在屏幕輸出。下面才開始重定向到需要的文件中

? 5 exec 1>test2log.txt

? 6 exec 2>test2Error.txt

? 7 echo "this is error msg step2" >&2

? 8 echo "this is normal msg step2"

這樣一旦重定向了就很難改回去了。

?

15.3 在腳本中重定向輸入

exec 命令允許你將STDIN重定向到Linux系統(tǒng)上的文件中。

例子:查看test2中的數(shù)據(jù)

? 1 #!/bin/bash

? 2 exec 0< test2 # 輸入重定向到test2中

? 3 echo "test2:"

? 4 count=1

? 5 while read line

? 6 do

? 7???????? echo "? $line"

? 8???????? count=$[ $count + 1 ]

? 9 done

?

15.4 創(chuàng)建自己的重定向

之前說一個(gè)進(jìn)程最多可以與9個(gè)打開的文件描述符。其他6個(gè)(3 ~ 8)的文件描述符均可用作輸入或輸出重定向。

可以將這些文件描述符中的任意一個(gè)分配給文件。

15.4.1 創(chuàng)建輸出文件描述符

用exec命令給輸出分配文件描述符。

和標(biāo)準(zhǔn)的文件描述符一樣,一旦將另一個(gè)文件描述符分配給了一個(gè)文件,這個(gè)重定向就會一直有效,直到你重新分配。

例子:

? 1 #!/bin/bash

? 2 exec 3>test4log.txt # exec 3>>test4log.txt 這個(gè)是將輸出追加到現(xiàn)有文件

? 3 echo "This is Normal msg"

? 4 echo "This is fd:3 msg" >&3

?

15.4.2 重定向文件描述符

現(xiàn)在介紹怎么恢復(fù)已重定向的文件描述符。

可以分配另外一個(gè)文件描述符給標(biāo)準(zhǔn)文件描述符,反之亦然。

可以將STDOUT重定向到另外一個(gè)文件描述符,然后再利用該文件描述符重定向回STDOUT

例子:

? 1 #!/bin/bash

? 2 # storing STDOUT, then coming back to it

? 3 exec 3>&1 # 3重定向到STDOUT。意味著給3的數(shù)據(jù)都將出現(xiàn)再顯示器上

? 4 exec 1>test5log.txt # 將STDOUT重定向到文件。但是3仍然指向STDOUT原來的位置,也就是顯示器。這時(shí)給3發(fā)會顯示在顯示器中。給STDOUT發(fā)會顯示在文件中

? 5 echo "This should store in the output file"

? 6 echo "alone with this line."

? 7

? 8 exec 1>&3 # 將STDOUT重定向到3的當(dāng)前位置(也就是顯示器)

? 9 echo "now things should be back to normal"

?

15.4.3 創(chuàng)建輸入文件描述符

跟上面類似,先將STDIN保存到另外一個(gè)文件描述符,然后讀取完文件在將STDIN恢復(fù)

例子:

? 1 #!/bin/bash

? 2 exec 6<&0 # 6先保存STDIN的位置

? 3 exec 0<test5 # 將STDIN重定向到 test5

? 4 count=1

? 5 while read line

? 6 do

? 7???????? echo "? $line"

? 8???????? count=$[ $count +1 ]

? 9 done

?10

?11 exec 0<&6 # 讀取完成后將STDIN重定向到文件描述符6,從而恢復(fù)之前的位置

?12 read -p "Are you done now?" answer

?13 case $answer in

?14 Y|y) echo "GoodBye!!!";;

?15 N|n) echo "Sorry, this is the end";;

?16 *) echo "Error End";;

?17 esac

?

15.4.4 創(chuàng)建讀寫文件描述符

可以打開單個(gè)文件描述符作為輸入和輸出。可以利用同一個(gè)文件描述符對同一個(gè)文件進(jìn)行讀寫。

用起來要小心:由于是對同一個(gè)文件進(jìn)行數(shù)據(jù)讀寫,shell會維護(hù)一個(gè)內(nèi)部指針,指明在文件中的當(dāng)前位置。任何讀或?qū)懚际菑奈募羔樕洗蔚奈恢瞄_始。

例子:

1 #!/bin/bash

? 2 exec 3<> testfile

? 3 read line <&3

? 4 echo "Read:$line" #注意這里寫是從文件指針上次的位置開始,也就是讀了一行之后的位置

? 5 echo "Write: This is test line" >&3

?

15.4.5 關(guān)閉文件描述符

如果你創(chuàng)建了新的輸入或輸出文件描述符,shell會在腳本退出時(shí)自動關(guān)閉它們。

但是某些時(shí)候還是要自己去關(guān)閉。

如何關(guān)閉: 將要關(guān)閉的文件描述符重定向到特殊符號 &-

一旦關(guān)閉后,就不能在腳本中向他寫入數(shù)據(jù),否則shell會產(chǎn)生錯(cuò)誤信息。

例子:

? 1 #!/bin/bash

? 2 # close fd test

? 3 exec 3>test8log.txt

? 4 echo "This is normal to fd:3" >&3

? 5 exec 3>&-

? 6 echo "after close write:his is normal to fd:3" >&3 # 關(guān)閉后再往里面寫會出錯(cuò)

? 7

? 8 exec 3>test8log.txt # 這里相當(dāng)于重新打開了

? 9 echo "This is bad normal to fd:3" >&3 # 會覆蓋原來的

?

15.5 列出打開的文件描述符

lsof命令會列出整個(gè)linux系統(tǒng)打開的所有的文件描述符。會產(chǎn)生大量輸出。

還可以接選項(xiàng)和參數(shù):

-p 后面接要查看的進(jìn)程。? $$ 表示當(dāng)前進(jìn)程

-d 后面指定要顯示的文件描述符編號。

例子:

? 1 #!/bin/bash

? 2 exec 3> testfile

? 3 lsof -a -p $$ -d 0,1,2,3,4

?

15.6 阻止命令輸出

有時(shí)不想顯示腳本的輸出。可以將輸出重定向到一個(gè)叫做null文件的特殊文件中去。

比如:

$ls –al > /dev/null

還可以這樣清空日志文件

$ cat /dev/null > TestLog.txt

?

?

15.7 創(chuàng)建臨時(shí)文件

linux使用/tmp目錄來存放不需要永久保留的文件。大部分linux發(fā)行版配置了系統(tǒng)在啟動時(shí)自動刪除/tmp目錄下的所有文件。

系統(tǒng)上的任何用戶賬戶都有權(quán)限在讀寫/tmp目錄中的文件。

mktemp可以在/tmp目錄中創(chuàng)建一個(gè)唯一的臨時(shí)文件。一旦創(chuàng)建了文件,你就在腳本中有了完整的讀寫權(quán)限,別人無法訪問它。

15.7.1 創(chuàng)建本地臨時(shí)文件

只需要指定一個(gè)文件名模板就行了,在文件末尾加上6個(gè)X。

$mktemp testing.XXXXXX

注意:這里一定要有大寫的X。這里的X有點(diǎn)通配符的意思。還可以寫不是X的

mktemp命令的輸出是它所創(chuàng)建的文件的名字。在腳本中保存起來,就能在后面的腳本里引用了。

例子:

? 1 #!/bin/bash

? 2 # create and using temp file

? 3 tempfile=$(mktemp test10.XXXXXX)

? 4 echo "tempfile = $tempfile"

? 5 exec 3>$tempfile

? 6 echo "This script writes to tmp file $tempfile"

? 7 echo "this is first line" >&3

? 8 echo "this is second line" >&3

? 9 echo "this is third line" >&3

?10 exec 3>&-

?11

?12 echo? "Now delete file $tempfile"

?13 rm -f $tempfile > /dev/null

?

15.7.2 在/tmp目錄創(chuàng)建臨時(shí)文件

-t 選項(xiàng)會強(qiáng)制mktemp在系統(tǒng)的臨時(shí)目錄來創(chuàng)建該文件。

這個(gè)時(shí)候返回用來創(chuàng)建臨時(shí)文件的全路徑,而不是只有文件名。

就上面的例子加上 –t就好了。

。。。

tempfile=$(mktemp -t test10.XXXXXX)

。。。

?

15.7.3 創(chuàng)建臨時(shí)目錄

-d選項(xiàng)用來創(chuàng)建臨時(shí)目錄。這樣就能用改目錄進(jìn)行任何需要的操作了。

例子:

? 1 #!/bin/bash

? 2 # create and using temp dir

? 3 tempdir=$(mktemp -d test12dir.12XXXX)

? 4 cd $tempdir

? 5 echo This in Dir:$(pwd)

? 6 tempfile=$(mktemp test12.XXXXXX)

? 7 echo "tempfile = $tempfile"

? 8 exec 3>$tempfile

? 9 echo "This script writes to tmp file $tempfile"

?10 echo "this is first line" >&3

?11 echo "this is second line" >&3

?12 echo "this is third line" >&3

?

15.8 記錄消息

將輸出同時(shí)發(fā)送到顯示器和日志文件,需要特殊命令tee就可以了。

tee命令相當(dāng)于管道第一個(gè)T型接頭。它將STDIN過來的數(shù)據(jù)同時(shí)發(fā)往兩處,一處是STDOUT,一處是指定的文件。

比如:

$date | tee log.txt

$date | tee –a log.txt?? # 這個(gè)是將數(shù)據(jù)追加到文件中

例子:

? 1 #!/bin/bash

? 2 # tee test

? 3 echo "This is 1 msg" | tee test13log.txt

? 4 echo "This is 2 msg" | tee -a test13log.txt

? 5 echo "This is 3 msg" | tee -a test13log.txt

?

15.9 實(shí)例

文件重定向常見于腳本需要讀入文件和輸出文件時(shí)。

需求:把數(shù)據(jù)數(shù)據(jù)放入電子表格中(.csv文件),讀取文件,創(chuàng)建INSERT語句。

例子:

? 1 #!/bin/bash

? 2 outfile='members.sql'

? 3 IFS=,

? 4 while read name age sex num

? 5 do

? 6???????? cat >> $outfile << EOF

? 7???????? insert into members (name, age, sex, num) values('$name', '$age', '$sex', '$num');

? 8 EOF

? 9 done <${1}

1)${1}代表第一個(gè)命令行參數(shù)。它指明了待讀取數(shù)據(jù)的文件

2)read會用IFS字符解析讀入的文本,我們在這里將IFS指定為逗號。

?

cat >> $outfile << EOF? // 這一段還是不大理解

這個(gè)包含一個(gè)輸出追加重定向(>>)和一個(gè)輸入追加重定向(<<)。

>> 將cat命令的輸出追加到由$outfile變量指定的文件中。

cat命令的輸入不在取自標(biāo)準(zhǔn)輸入,而是被重定向到腳本中存儲的數(shù)據(jù)。

EOF符號標(biāo)記了追加到文件中的數(shù)據(jù)的起止。

?

輸入文件 + 運(yùn)行 + 結(jié)果:

?

說明:

特殊重定向(here document):

command << delimiter

???????? document

delimiter

作用是將兩個(gè)delimiter之間的內(nèi)容(document)作為輸入傳給command

注意:結(jié)尾的delimiter一定要頂格寫,不能有空格

(1)

? 6???????? cat >> $outfile << EOF

? 7???????? insert into members (name, age, sex, num) values('$name', '$age', '$sex', '$num');

? 8 EOF

(2)

? 6???????? cat << EOF

? 7???????? insert into members (name, age, sex, num) values('$name', '$age', '$sex', '$num');

? 8 EOF

?

黃色高亮部分作為輸入傳給cat。(1)重定向到outfile去了,(2)仍然是標(biāo)準(zhǔn)輸出(屏幕)

轉(zhuǎn)載于:https://www.cnblogs.com/xcywt/p/7912037.html

總結(jié)

以上是生活随笔為你收集整理的《Linux命令行与shell脚本编程大全》第十五章 呈现数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。