上此文章說到看別人沒有用腳本處理文件,今天輪到我干處理文件的活兒了,忙了很久終於算是搞出來了。看這個文章的首先要懂得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(,)函數也可以,要還沒有進一步研究。