我正在研究一些代碼優化,我會檢查我的函數的大小,而不是讀取巨大的反彙編文件。在Debug上編譯後,我使用nm命令讀取.o。我們拿到的這款:使用awk解析nm命令的輸出 - Linux Bash
nm --size-sort $OBJFILEPATH.o
000000000000000b r __PRETTY_FUNCTION__.6473
0000000000000017 t extract_h
0000000000000036 t L_mult
000000000000003a t sature32
0000000000000042 t L_mac
0000000000000048 t L_add
000000000000005c t Mac16x11
0000000000000077 t L_shl
0000000000000083 t L_shr
00000000000000df T G729Convolve
0000000000000114 T G729Residu
00000000000001bc T G729Syn_filt_L_H
00000000000001bc T G729Syn_filt_L_SUBFR
如今,走進一個bash腳本,我想解析只有第1列至極每一行代表在bash單個數組元素。
我的命令是:
read FUNCSIZE <<< $(nm --size-sort $OBJFILEPATH.o | awk '{print $1}')
併爲確保一切正常檢查我FUNCSIZE數組的大小。
SIZE=${#FUNCSIZE[@]}
echo size is $SIZE
for s in $FUNCSIZE
do
echo $s
done
我得到這個作爲輸出:
size is 1
000000000000000b
0000000000000017
0000000000000036
000000000000003a
0000000000000042
0000000000000048
000000000000005c
0000000000000077
0000000000000083
00000000000000df
0000000000000114
00000000000001bc
00000000000001bc
爲什麼大小是「1」,爲什麼我能打印每個元素就像是一個數組裏面。看起來輸出結果仍然有一個「空間」。是否有任何RegEx與awk,將避免將分隔符字段包含到數組中?
感謝您的幫助!
編輯答案
read -a FUNCSIZE <<< $(nm --size-sort $OBJFILEPATH.o | awk '{print $1}')
SIZE=${#FUNCSIZE[*]}
for((i=0; i<SIZE; i++))
do
echo ${FUNCSIZE[$i]}
done
您正在讀取標量,而不是數組。也許你打算使用'read -a'。無論如何,創建一個bash數組可能是你接下來要做的任何事情的錯誤起點 - 如果你用一個簡明,可測試的例子告訴我們,我們可以幫助你。 –
我們想製作一個工具來比較兩個不同的.o文件,並且比較任何函數是否已經及時更改。將大小解析爲變量將使腳本能夠檢查特定功能是否比以前更大。 –
這將是一個awk腳本,所以從2個shell數組開始並不會有用。一個shell只是一個環境,通過它可以調用具有語言的工具來對這些調用進行排序,而標準的通用UNIX工具來處理文本是awk。 –