forked from kobe1941/shell
-
Notifications
You must be signed in to change notification settings - Fork 0
/
calClassSize.sh
122 lines (79 loc) · 4.69 KB
/
calClassSize.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
##################
# 使用方法:传入一个类似linkmap.txt的文件,脚本会把每个类及其占用的size提取出来保存成文件,供统计使用
# 该脚本运行过后才能运行ProjectStatistic.sh脚本
######################
export LC_CTYPE=C
export LANG=C
filePath=$1;
echo $filePath;
#######这里主要把所有的类和其编号提取出来########
LANG=C sed -n '/# Object files:/,/# Sections:/p' $filePath > Object.txt; #找出指定的一段文本,并存储为文本
line_count=`cat Object.txt | wc -l`; #计算文件行数
echo "line_count=${line_count}";
end_line=$[line_count-1]; #做数字运算
sed -n "3,$[line_count-1]p" Object.txt > tempClassList.txt; #去掉前两行和最后一行
grep "\.o\|\.d" tempClassList.txt > ObjectCleanFile.txt; #把没有包含.o和.d的行去掉
#这里需要补上虽然没有.o或.d但是有.framework的数据
grep -v "\.o\|\.d" tempClassList.txt | grep "framework" >> ObjectCleanFile.txt;
sed "s/\/.*\///g" ObjectCleanFile.txt > ObjectClassList.txt; #用于把两个斜杠之间的字符删除,连同斜杠本身一起删除
#gsed "s/\/.\+\///g" ObjectCleanFile.txt > ObjectClassList.txt; #gsed是GUN版本的sed,各个版本的工具有些不一样
#分别去掉两个中括号
sed -e "s/\[//g" -e "s/\]//g" ObjectClassList.txt > ObjectClassListTest.txt; #-e命令可以一个线程执行多个操作
sort -n -k1 ObjectClassListTest.txt > ObjectClassListTemp.txt; #按照第一列排序
echo "class get done.";
#########################################
#######这里主要把每个类所占的大小计算出来########
sed -n '/# Symbols:/,$p' $filePath > SymbolsTest.txt; #提取从匹配的一行直到最后
sed -n '/\[.*\]/p' SymbolsTest.txt > Symbols.txt;
echo "Symbols get done.";
gsed -i '1,2d' Symbols.txt; #去掉前两行,此处由于兼容问题,要使用gsed,如果未安装,执行brew install gnu-sed安装即可
#跟上方使用-e是一样的效果,只不过是两个线程,速度慢一些,另替换操作斜杠/也可以用#代替
sed "s#\[##g" Symbols.txt | sed "s#\]##g" > SymbolsTemp.txt;
# cat SymbolsTemp.txt | parallel --pipe | sort -n -k3 > SymbolsTempSort.txt; #按照第三列排序
sort -n -k3 SymbolsTemp.txt > SymbolsTempSort.txt; #按照第三列排序
# sed "s#\[##g" Symbols.txt | sed "s#\]##g" | LC_ALL='C' sort -n -k3 > SymbolsTemp.txt;
#排序输出然后保存到文件里
awk '{sum[$3]+=$2} END{
len=length(sum);
for (i = 1; i < len; i++){
print i, " ",sum[i];
}
}' SymbolsTempSort.txt > classResultSize.txt;
########################################
############合并两个文件方便比较############
awk 'NR==FNR{a[i]=$0;i++}NR>FNR{printf "%-85s %-15s\n",a[j],$0;j++}' ObjectClassListTemp.txt classResultSize.txt > finalClassSizeList.txt;
#######################################
################计算每个静态库和动态库所占的size###################
#把静态库和动态库的数据抽出来,用来计算静态库和动态库的大小
############第一种放方法#############
#计算静态库
grep "\.a" finalClassSizeList.txt > libFinalMethod2.txt;
sed "s/(/ (/g" libFinalMethod2.txt > libFinalMethod3.txt; #在左括号前插入空格,方便统计
awk '{sum[$2]+=$5} END{
for (i in sum){
print i, " ", sum[i]/1024 " kb";
}
}' libFinalMethod3.txt > libFinalSizeList.txt;
sort -n -r -k2 libFinalSizeList.txt > libFinalSizeListSort.txt;
#计算动态库
grep -v "\.a" finalClassSizeList.txt > frameworkFinalMehod2.txt;
sed "s/(/ (/g" frameworkFinalMehod2.txt > frameworkFinalMehod3.txt; #在左括号前插入空格,方便统计
awk '{sum[$2]+=$5} END{
for (i in sum){
print i, " ", sum[i]/1024 " kb";
}
}' frameworkFinalMehod3.txt > frameworkFinalSizeList.txt;
sort -n -r -k2 frameworkFinalSizeList.txt > frameworkFinalSizeListSort.txt;
##################################
###########第二种方法计算未果###########
# grep "\.a\|\.framework" tempClassList.txt > libFramework.txt;
# sed "s/\/.*\///g" libFramework.txt > libFrameworkNOSlash.txt; #用于把两个斜杠之间的字符删除,连同斜杠本身一起删除
# #先统计静态库
# grep "\.a" libFrameworkNOSlash.txt > libPure.txt; #纯粹的静态库文件
# sed -e "s/\[//g" -e "s/\]//g" libPure.txt > libNoBrackets.txt; #去掉左右两个中括号
# sed "s/(/ (/g" libNoBrackets.txt > libFinal.txt; #在左括号前插入空格,方便统计
# #接着统计framework
# grep -v "\.a\|.dylib" libFrameworkNOSlash.txt > frameworkPure.txt; #纯粹的动态库
# sed -e "s/\[//g" -e "s/\]//g" frameworkPure.txt > frameworkNoBrackets.txt; #去掉左右两个中括号
# sed "s/(/ (/g" frameworkNoBrackets.txt > frameworkFinal.txt; #在左括号前插入空格,方便统计
##################################