主頁(yè) > 知識(shí)庫(kù) > Shell腳本逐行讀取文本文件(不改變文本格式)

Shell腳本逐行讀取文本文件(不改變文本格式)

熱門(mén)標(biāo)簽:地圖標(biāo)注輻射圖案 申請(qǐng)公司400電話(huà)要注意什么 寧波智能外呼系統(tǒng)公司 聯(lián)通電話(huà)機(jī)器人怎么接 安裝外呼系統(tǒng)費(fèi)用 曲阜400電話(huà)辦理 衛(wèi)星地圖標(biāo)注地名 奧維互動(dòng)地圖標(biāo)注參數(shù) 電銷(xiāo)機(jī)器人 劍魚(yú)

網(wǎng)上有很多 shell script 讀文本文件的例子,但是都沒(méi)有講出故事的全部,只說(shuō)了一半。舉個(gè)例子,比如從一個(gè) testfile 文件中讀取如下格式的文本行:

復(fù)制代碼 代碼如下:

$ vi testfile
ls      -a -l /bin |  sort
ls      -a -l /bin |  sort | wc
ls      -a -l |  grep sh | wc
ls      -a -l
ls      -a -l |       sort      |    wc

最常見(jiàn)的一個(gè) line by line 讀取文件內(nèi)容的例子就是:
復(fù)制代碼 代碼如下:

$ vi readfile
#!/bin/sh

testfile=$1
while read -r line
do
    echo $line
done $testfile

$ chmod +x readfile
$ ./readfile testfile
ls -a -l /bin | sort
ls -a -l /bin | sort | wc
ls -a -l | grep sh | wc
ls -a -l
ls -a -l | sort | wc


這個(gè)例子的問(wèn)題是讀取文本行后,文本格式發(fā)生了變化,和原來(lái) testfile 文件的內(nèi)容不完全一致,空格字符自動(dòng)被刪除了一些。為什么會(huì)這樣呢?因?yàn)?IFS,如果在 shell script 里沒(méi)有明確指定 IFS 的話(huà),IFS 會(huì)默認(rèn)用來(lái)分割空格、制表、換行等,所以上面文本行里多余的空格和換行都被自動(dòng)縮進(jìn)了。

如果想要輸出 testfile 文件原有的格式,把每行(作為整體)原封不動(dòng)的打印出來(lái)怎么辦?這時(shí)需要指定 IFS 變量,告訴 shell 以 "行" 為單位讀取。

復(fù)制代碼 代碼如下:

$ vi readfile
#!/bin/sh

IFS=""

testfile=$1
while read -r line
do
    echo $line
done $testfile

$ ./readfile testfile
ls      -a -l /bin |  sort
ls      -a -l /bin |  sort | wc
ls      -a -l |  grep sh | wc
ls      -a -l
ls      -a -l |       sort      |    wc    


上面兩種方法的輸出不是差不多嗎,有什么關(guān)系呢,第一種還美觀一些?關(guān)系重大,VPSee 昨天寫(xiě)了一個(gè)模擬 shell 的 C 程序,然后又寫(xiě)了一個(gè) shell script 來(lái)測(cè)試這個(gè) C 程序,這個(gè) script 需要從上面的 testfile 里讀取完整一行傳給 C 程序,如果按照上面的兩種方法會(huì)得到兩種不同的輸入格式,意義完全不同:
復(fù)制代碼 代碼如下:

$./mypipe ls -a -l | sort | wc
$./mypipe "ls -a -l | sort | wc "

顯然我要的是第2種輸入,把 "ls -a -l | sort | wc " 作為整體傳給我的 mypipe,來(lái)測(cè)試我的 mypipe 能不能正確識(shí)別出字符串里面的各種命令。

如果不用 IFS 的話(huà),還有一種方法可以得到上面第二種方法的效果:

復(fù)制代碼 代碼如下:

#!/bin/sh

testfile=$1
x=`wc -l $testfile |awk '{print $1}'`

i=1
while [ $i -le $x ]
do
    echo "`head -$i  $testfile | tail -1`"
    i=`expr $i + 1`
done

您可能感興趣的文章:
  • shell文件處理筆記之插入文本到文件的方法
  • Shell腳本學(xué)習(xí)指南之文本處理工具
  • Shell文本處理三劍客之sed的使用
  • Shell腳本對(duì)比兩個(gè)文本文件找出不同行的2個(gè)方法分享
  • Shell實(shí)現(xiàn)文本去重并操持原有順序
  • Shell中如何刪除文本比較長(zhǎng)的行的實(shí)現(xiàn)方法
  • Shell腳本如何逐行處理文本文件

標(biāo)簽:仙桃 三門(mén)峽 遵義 上饒 江西 安康 大興安嶺 大慶

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Shell腳本逐行讀取文本文件(不改變文本格式)》,本文關(guān)鍵詞  Shell,腳本,逐行,讀取,文本,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Shell腳本逐行讀取文本文件(不改變文本格式)》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于Shell腳本逐行讀取文本文件(不改變文本格式)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章