接到個任務,需要批量處理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 日誌...