歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux Bash awk sed 處理文件

Linux Bash awk sed 處理文件

日期:2017/2/28 16:32:50   编辑:Linux教程

上此文章說到看別人沒有用腳本處理文件,今天輪到我干處理文件的活兒了,忙了很久終於算是搞出來了。看這個文章的首先要懂得Shell,否則很費勁。

事情的緣由是這樣的,我們產品有個單獨的小模塊MCU,軟件是單獨通過Keil編譯的,但是這個軟件的代碼還是和Linux代碼的主程序放在一起,我想在主程序中獲得MCU的編譯時間,然後寫到主程序的一個配置文件裡邊。想起來簡單,但是要用腳本自動執行起來就顯得比較棘手,廢話少說,下面來真的:

第一步:
首先是獲得Keil編譯時間的文件,這個時間應該是在*.map裡邊:


打開TK880_SubMCU_Release.map,內容:


所以說這個時間是可以拿到,我們通過awk來拿時間:

awk 'NR==1{print$4,$5}' TK880_SubMCU_Release.map >tempfile.txt

這句話是說把文件TK880_SubMCU_Release.map的第一行的低四和第五個域變量拿到,NR是awk的內建變量,NR==1表示第一行,$4和$5就表示這個域的內容,>表示定向輸出 ,awk中的域默認是按照空格分的。現在你要是:

$ cat tempfile.txt

08/03/2010 15:16:06

其實,awk '{count=$4$5; print count}' 這個命令也是可以拿到的,只不過此時值賦給了變量count而已。

問題:難道這個時間只能寫到一個文件中麼?非也!

$ newTime=$(cat tempfile.txt)

$ echo $newTime

08/03/2010 15:16:06

就是將tempfile.txt的內容賦給了newTime;其實更神奇的還有:

newTime=$(awk 'NR==1{print$4,$5}' TK880_SubMCU_Release.map),這樣一步到位拿到時間。

還有更神的newTime=`awk 'END{print$0}' tempfile.txt`,真是弄不懂awk 'END{print$0}' tempfile.txt這個命令是被啥樣一個東西包裹著的,缺了這個還不行,注意,這可是從shell從awk往外引用變量,一遍見到的都是awk使用Shell變量哦。絕對不是單引號,看到沒?想右斜,知道的告訴我下。 " ` "他娘,我用軟鍵才能盤輸出 `。

第二步:

我們要將這個時間信息寫到一個文件system.cfg中,下面繼續:


想辦法找到這一行,然後將時間替換了就行了。就這麼簡單哈。

一想到替換和搜索,自然想起來sed,我試了試 sed 's/^CompileTime.*/CompileTime = $newTime;/' 但是貌似不行。

後來在請教網上一位高手後,sed "s|^CompileTime.*|CompileTime = ${newTime};|" 一下就搞定了。好像還有個sub(,)函數也可以,要還沒有進一步研究。

Copyright © Linux教程網 All Rights Reserved