Linux Bash awk sed 处理文件


上此文章说到看别人没有用脚本处理文件,今天轮到我干处理文件的活儿了,忙了很久终于算是搞出来了。看这个文章的首先要懂得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(,)函数也可以,要还没有进一步研究。

  • 1
  • 2
  • 下一页

相关内容