我正在研究一些代码优化,我会检查我的函数的大小,而不是读取巨大的反汇编文件。在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。 –