使用shell和awk批量處理二進位制資料

2021-07-08 18:44:04 字數 2108 閱讀 5565

接到個任務,需要批量處理10萬個hdcp key的二進位制檔案,需要把前320個位元組的十六進製制的和相加,並且用65536減去和,然後將所得結果寫到二進位制檔案特定的位置(具體是0x140h和0x141h),高位在前,低位在後

如下圖1紅色部分所示。

圖1得到需求後,我在思考用什麼方式來實現批量處理,感覺linux裡面的shell正非常適合處理這種批量資料。由於需要累加這些二進位制檔案裡面的資料

不太好直接處理,我就先把他們從二進位制轉化為ascii的文字形式,然後把資料轉化為十進位制方便一些(要不然直接類似於ff+10這種會出問題,用awk

把這些資料切割好,然後累加

#change to ascii txt

od -an -v -tx1 $filename  > $file_txt

awk  'begin } }' $file_txt > $file_txt"_1"

awk --non-decimal-data   -f, '' $file_txt"_1" >> $file_txt"_2"

接著計算校驗和

#calculate the checksum

awk  'begin } }end' $file_txt"_2"

checksum=`awk  'begin } }end' $file_txt"_2"`

然後把得到的校驗和分為高位低位

#在$string中從位置$position開始提取$length長度的子串.

checksum_l=`echo $`;

echo $checksum_l;

checksum_h=`echo $`;

echo $checksum_h;

最後就是寫回二進位制檔案了

#write back to the original files

printf "\x""$checksum_l" | dd of=$filename  bs=1 count=1 conv=notrunc bs=1 count=1 seek=321

printf "\x""$checksum_h" | dd of=$filename  bs=1 count=1 conv=notrunc bs=1  count=1 seek=320

基本的功能是實現了,剩下的一些小的細節,批量處理,由於hdcp key的檔名是從hdcpkey000001.bin到hdcpkey999999.bin

那麼我們直接用for迴圈搞定吧,如下

count=$1;

i=1;

filename_start="hdcpkey";

filename_end=".bin";

for i in `seq $i $count`

doif [ $i -lt 0 ];then

echo "input $i error!\n";

exit 1; 

elif [   $i -ge 1 ]  && [  $i -lt 9  ];then

filename_start="hdcpkey00000";   

elif [ $i -ge 10  ]  && [ $i -lt 99 ];then

filename_start="hdcpkey0000";

elif [ $i -ge 100 ]  && [ $i -lt 999 ];then

filename_start="hdcpkey000";

elif [ $i -ge 1000 ] && [ $i -lt 9999 ];then

filename_start="hdcpkey00";

elif [ $i -ge 10000 ] && [ $i -lt 99999 ];then

filename_start="hdcpkey0";

elif [ $i -ge 100000 ] && [ $i -lt 999999 ];then

filename_start="hdcpkey";

fifilename=$$"$";

file_txt=$$;

..................  //這裡省略部分語句

done

這樣做完之後,我測試了下竟然花了十幾分鐘才全部處理完所有的資料,

後面我自己又加了個多執行緒的方式,只要幾分鐘就能處理好,已經上傳了,請自行查閱。

shell批量處理

一 將以下字串 fat110 abcca fat136 bcdfg fat123 hell0 fat122 world1 轉為如下形式 fat110 abcca fat136 bcdfg fat123 hell0 fat122 world1 方法如下 二 將下面內容 1 12 3 283785415...

awk使用詳解(shell)

一 基本介紹 1.awk awk是乙個強大的文字分析工具,在對文字檔案的處理以及生成報表,awk是無可替代的。awk認為文字檔案都是結構化的,它將每乙個輸入行定義為乙個記錄,行中的每個字串定義為乙個域 段 域和域之間使用分割符分割。2.功能 流控制 數 算 程序控制 內建的變數和函式 迴圈和判斷 3...

awk使用shell變數,shell獲取awk中

這裡提到awk,相信寫shell的朋友都會接觸到。awk 是一種用於處理文字的程式語言工具。awk 提供了極其強大的功能 可以進行正規表示式的匹配 樣式裝入 流控制數 算符 程序控制語句 內建的變數和函式 可以把awk看作一門完全的程式語言,它處理文字的速度是快得驚人的。現在很多基於shell 日誌...