awk 解析maps文件中的地址

Posted 时间与精神房屋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了awk 解析maps文件中的地址相关的知识,希望对你有一定的参考价值。

maps文件一般是这个样子:

[email protected]:~ $ sudo cat /proc/1/maps
54b88000-54c8d000 r-xp 00000000 b3:07 655537     /lib/systemd/systemd
54c9c000-54cac000 r--p 00104000 b3:07 655537     /lib/systemd/systemd
54cac000-54cad000 rw-p 00114000 b3:07 655537     /lib/systemd/systemd
5628b000-56354000 rw-p 00000000 00:00 0          [heap]
75900000-75929000 rw-p 00000000 00:00 0 
75929000-75a00000 ---p 00000000 00:00 0 
75b00000-75b29000 rw-p 00000000 00:00 0 
75b29000-75c00000 ---p 00000000 00:00 0 
75c4c000-75c4d000 ---p 00000000 00:00 0 
75c4d000-7644c000 rwxp 00000000 00:00 0 
7644c000-7644d000 ---p 00000000 00:00 0 
7644d000-76c4c000 rwxp 00000000 00:00 0 
76c4c000-76c8e000 rw-p 00000000 00:00 0 
76c8e000-76c92000 r-xp 00000000 b3:07 651732     /lib/arm-linux-gnueabihf/libattr.so.1.1.0
76c92000-76ca1000 ---p 00004000 b3:07 651732     /lib/arm-linux-gnueabihf/libattr.so.1.1.0
76ca1000-76ca2000 r--p 00003000 b3:07 651732     /lib/arm-linux-gnueabihf/libattr.so.1.1.0
76ca2000-76ca3000 rw-p 00004000 b3:07 651732     /lib/arm-linux-gnueabihf/libattr.so.1.1.0
76ca3000-76ca5000 r-xp 00000000 b3:07 651591     /lib/arm-linux-gnueabihf/libdl-2.19.so
76ca5000-76cb4000 ---p 00002000 b3:07 651591     /lib/arm-linux-gnueabihf/libdl-2.19.so
76cb4000-76cb5000 r--p 00001000 b3:07 651591     /lib/arm-linux-gnueabihf/libdl-2.19.so
76cb5000-76cb6000 rw-p 00002000 b3:07 651591     /lib/arm-linux-gnueabihf/libdl-2.19.so
76cb6000-76d18000 r-xp 00000000 b3:07 651752     /lib/arm-linux-gnueabihf/libpcre.so.3.13.1
76d18000-76d27000 ---p 00062000 b3:07 651752     /lib/arm-linux-gnueabihf/libpcre.so.3.13.1
76d27000-76d28000 r--p 00061000 b3:07 651752     /lib/arm-linux-gnueabihf/libpcre.so.3.13.1
76d28000-76d29000 rw-p 00062000 b3:07 651752     /lib/arm-linux-gnueabihf/libpcre.so.3.13.1
76d29000-76d2f000 r-xp 00000000 b3:07 651761     /lib/arm-linux-gnueabihf/librt-2.19.so
76d2f000-76d3e000 ---p 00006000 b3:07 651761     /lib/arm-linux-gnueabihf/librt-2.19.so
76d3e000-76d3f000 r--p 00005000 b3:07 651761     /lib/arm-linux-gnueabihf/librt-2.19.so
76d3f000-76d40000 rw-p 00006000 b3:07 651761     /lib/arm-linux-gnueabihf/librt-2.19.so
76d40000-76d53000 r-xp 00000000 b3:07 651716     /lib/arm-linux-gnueabihf/libkmod.so.2.2.8
76d53000-76d62000 ---p 00013000 b3:07 651716     /lib/arm-linux-gnueabihf/libkmod.so.2.2.8
76d62000-76d63000 r--p 00012000 b3:07 651716     /lib/arm-linux-gnueabihf/libkmod.so.2.2.8
76d63000-76d64000 rw-p 00013000 b3:07 651716     /lib/arm-linux-gnueabihf/libkmod.so.2.2.8
76d64000-76d67000 r-xp 00000000 b3:07 651697     /lib/arm-linux-gnueabihf/libcap.so.2.24
76d67000-76d76000 ---p 00003000 b3:07 651697     /lib/arm-linux-gnueabihf/libcap.so.2.24
76d76000-76d77000 r--p 00002000 b3:07 651697     /lib/arm-linux-gnueabihf/libcap.so.2.24
76d77000-76d78000 rw-p 00003000 b3:07 651697     /lib/arm-linux-gnueabihf/libcap.so.2.24
76d78000-76d90000 r-xp 00000000 b3:07 651756     /lib/arm-linux-gnueabihf/libaudit.so.1.0.0
76d90000-76d9f000 ---p 00018000 b3:07 651756     /lib/arm-linux-gnueabihf/libaudit.so.1.0.0
76d9f000-76da0000 r--p 00017000 b3:07 651756     /lib/arm-linux-gnueabihf/libaudit.so.1.0.0
76da0000-76da1000 rw-p 00018000 b3:07 651756     /lib/arm-linux-gnueabihf/libaudit.so.1.0.0
76da1000-76dab000 rw-p 00000000 00:00 0 
76dab000-76db6000 r-xp 00000000 b3:07 651734     /lib/arm-linux-gnueabihf/libpam.so.0.83.1
76db6000-76dc5000 ---p 0000b000 b3:07 651734     /lib/arm-linux-gnueabihf/libpam.so.0.83.1
76dc5000-76dc6000 r--p 0000a000 b3:07 651734     /lib/arm-linux-gnueabihf/libpam.so.0.83.1
76dc6000-76dc7000 rw-p 0000b000 b3:07 651734     /lib/arm-linux-gnueabihf/libpam.so.0.83.1
76dc7000-76de2000 r-xp 00000000 b3:07 651657     /lib/arm-linux-gnueabihf/libselinux.so.1
76de2000-76df1000 ---p 0001b000 b3:07 651657     /lib/arm-linux-gnueabihf/libselinux.so.1
76df1000-76df2000 r--p 0001a000 b3:07 651657     /lib/arm-linux-gnueabihf/libselinux.so.1
76df2000-76df3000 rw-p 0001b000 b3:07 651657     /lib/arm-linux-gnueabihf/libselinux.so.1
76df3000-76df4000 rw-p 00000000 00:00 0 
76df4000-76f1f000 r-xp 00000000 b3:07 651612     /lib/arm-linux-gnueabihf/libc-2.19.so
76f1f000-76f2f000 ---p 0012b000 b3:07 651612     /lib/arm-linux-gnueabihf/libc-2.19.so
76f2f000-76f31000 r--p 0012b000 b3:07 651612     /lib/arm-linux-gnueabihf/libc-2.19.so
76f31000-76f32000 rw-p 0012d000 b3:07 651612     /lib/arm-linux-gnueabihf/libc-2.19.so
76f32000-76f35000 rw-p 00000000 00:00 0 
76f35000-76f49000 r-xp 00000000 b3:07 651758     /lib/arm-linux-gnueabihf/libpthread-2.19.so
76f49000-76f59000 ---p 00014000 b3:07 651758     /lib/arm-linux-gnueabihf/libpthread-2.19.so
76f59000-76f5a000 r--p 00014000 b3:07 651758     /lib/arm-linux-gnueabihf/libpthread-2.19.so
76f5a000-76f5b000 rw-p 00015000 b3:07 651758     /lib/arm-linux-gnueabihf/libpthread-2.19.so
76f5b000-76f5d000 rw-p 00000000 00:00 0 
76f6f000-76f74000 r-xp 00000000 b3:07 528562     /usr/lib/arm-linux-gnueabihf/libarmmem.so
76f74000-76f83000 ---p 00005000 b3:07 528562     /usr/lib/arm-linux-gnueabihf/libarmmem.so
76f83000-76f84000 rw-p 00004000 b3:07 528562     /usr/lib/arm-linux-gnueabihf/libarmmem.so
76f84000-76fa4000 r-xp 00000000 b3:07 651597     /lib/arm-linux-gnueabihf/ld-2.19.so
76fab000-76fb3000 rw-p 00000000 00:00 0 
76fb3000-76fb4000 r--p 0001f000 b3:07 651597     /lib/arm-linux-gnueabihf/ld-2.19.so
76fb4000-76fb5000 rw-p 00020000 b3:07 651597     /lib/arm-linux-gnueabihf/ld-2.19.so
7ef76000-7ef97000 rwxp 00000000 00:00 0          [stack]
7eff2000-7eff3000 r-xp 00000000 00:00 0          [sigpage]
7eff3000-7eff4000 r--p 00000000 00:00 0          [vvar]
7eff4000-7eff5000 r-xp 00000000 00:00 0          [vdso]
ffff0000-ffff1000 r-xp 00000000 00:00 0          [vectors]
[email protected]:~ $ 

只有模块起始和结束地址,但是没有模块的size。有时我们需要size,要怎么来获取?比较容易的方法是写个shell脚本,大致思路是:提取第一列,再从第一列中提取出开始地址和结束地址,再两个相减得到size。

研究了一下awk的man,发现上述的几个步骤awk完全可以包办了:

sudo cat /proc/1/maps | awk {split($1,RANGE,"-"); if(RANGE[1]~/^0x/){STARTADDR=strtonum(RANGE[1])} else{STARTADDR=strtonum("0x"RANGE[1])}; if(RANGE[2]~/^0x/){ENDADDR=strtonum(RANGE[2])} else{ENDADDR=strtonum("0x"RANGE[2])};ADDRSIZE=strtonum(ENDADDR-STARTADDR);printf("0x%x 0x%x 0x%x %s\n", STARTADDR, ENDADDR, ADDRSIZE, $0)}

大致解释一下:

{split($1,RANGE,"-")

此句意思是将第一列拆分成数组,结果保存在变量RANGE中,分割符为“-”。即:RANGE[1]为起始地址,RANGE[2]为结束地址

if(RANGE[1]~/^0x/){STARTADDR=strtonum(RANGE[1])} else{STARTADDR=strtonum("0x"RANGE[1])}

对于Linux的有些发行版来说,第一列的地址可能以“0x”开头,而有些则不是(比如本人使用的树莓派Raspbian GNU/Linux),这里兼容了一下这两种情况,结果STARTADDR的值为0x????????

if(RANGE[2]~/^0x/){ENDADDR=strtonum(RANGE[2])} else{ENDADDR=strtonum("0x"RANGE[2])}

同上,这里得到的ENDADDR值也是0x????????的形式

ADDRSIZE=strtonum(ENDADDR-STARTADDR)

这里调用了awk的內建函数strtonum,该函数将一个字符串转换为十进制数字,前面的STARTADDR和ENDADDR之所以要加上“0x”前缀也是因为strtonum的要求:如果是16进制数,则必须有前缀,否则会按照十进制处理,发生错误。注意awk要求引用变量时不需要加$符号。某些较低版本的awk可能会不支持strtonum,此时需要upgrade更新,或者下载gawk的最近代码重新编译:http://mirrors.ustc.edu.cn/gnu/

printf("0x%x 0x%x 0x%x %s\n", STARTADDR, ENDADDR, ADDRSIZE, $0)

最后一步是格式化输出,这个跟C语言的printf是很相似的。这里$0表示原文件中一行的所有列。

最后得到的结果是这个样子:

0x54b88000 0x54c8d000 0x105000 54b88000-54c8d000 r-xp 00000000 b3:07 655537     /lib/systemd/systemd
0x54c9c000 0x54cac000 0x10000 54c9c000-54cac000 r--p 00104000 b3:07 655537     /lib/systemd/systemd
0x54cac000 0x54cad000 0x1000 54cac000-54cad000 rw-p 00114000 b3:07 655537     /lib/systemd/systemd
0x5628b000 0x56354000 0xc9000 5628b000-56354000 rw-p 00000000 00:00 0          [heap]
0x75900000 0x75929000 0x29000 75900000-75929000 rw-p 00000000 00:00 0 
0x75929000 0x75a00000 0xd7000 75929000-75a00000 ---p 00000000 00:00 0 
0x75b00000 0x75b29000 0x29000 75b00000-75b29000 rw-p 00000000 00:00 0 
0x75b29000 0x75c00000 0xd7000 75b29000-75c00000 ---p 00000000 00:00 0 
0x75c4c000 0x75c4d000 0x1000 75c4c000-75c4d000 ---p 00000000 00:00 0 
0x75c4d000 0x7644c000 0x7ff000 75c4d000-7644c000 rwxp 00000000 00:00 0 
0x7644c000 0x7644d000 0x1000 7644c000-7644d000 ---p 00000000 00:00 0 
0x7644d000 0x76c4c000 0x7ff000 7644d000-76c4c000 rwxp 00000000 00:00 0 
0x76c4c000 0x76c8e000 0x42000 76c4c000-76c8e000 rw-p 00000000 00:00 0 
0x76c8e000 0x76c92000 0x4000 76c8e000-76c92000 r-xp 00000000 b3:07 651732     /lib/arm-linux-gnueabihf/libattr.so.1.1.0
0x76c92000 0x76ca1000 0xf000 76c92000-76ca1000 ---p 00004000 b3:07 651732     /lib/arm-linux-gnueabihf/libattr.so.1.1.0
0x76ca1000 0x76ca2000 0x1000 76ca1000-76ca2000 r--p 00003000 b3:07 651732     /lib/arm-linux-gnueabihf/libattr.so.1.1.0
0x76ca2000 0x76ca3000 0x1000 76ca2000-76ca3000 rw-p 00004000 b3:07 651732     /lib/arm-linux-gnueabihf/libattr.so.1.1.0
0x76ca3000 0x76ca5000 0x2000 76ca3000-76ca5000 r-xp 00000000 b3:07 651591     /lib/arm-linux-gnueabihf/libdl-2.19.so
0x76ca5000 0x76cb4000 0xf000 76ca5000-76cb4000 ---p 00002000 b3:07 651591     /lib/arm-linux-gnueabihf/libdl-2.19.so
0x76cb4000 0x76cb5000 0x1000 76cb4000-76cb5000 r--p 00001000 b3:07 651591     /lib/arm-linux-gnueabihf/libdl-2.19.so
0x76cb5000 0x76cb6000 0x1000 76cb5000-76cb6000 rw-p 00002000 b3:07 651591     /lib/arm-linux-gnueabihf/libdl-2.19.so
0x76cb6000 0x76d18000 0x62000 76cb6000-76d18000 r-xp 00000000 b3:07 651752     /lib/arm-linux-gnueabihf/libpcre.so.3.13.1
0x76d18000 0x76d27000 0xf000 76d18000-76d27000 ---p 00062000 b3:07 651752     /lib/arm-linux-gnueabihf/libpcre.so.3.13.1
0x76d27000 0x76d28000 0x1000 76d27000-76d28000 r--p 00061000 b3:07 651752     /lib/arm-linux-gnueabihf/libpcre.so.3.13.1
0x76d28000 0x76d29000 0x1000 76d28000-76d29000 rw-p 00062000 b3:07 651752     /lib/arm-linux-gnueabihf/libpcre.so.3.13.1
0x76d29000 0x76d2f000 0x6000 76d29000-76d2f000 r-xp 00000000 b3:07 651761     /lib/arm-linux-gnueabihf/librt-2.19.so
0x76d2f000 0x76d3e000 0xf000 76d2f000-76d3e000 ---p 00006000 b3:07 651761     /lib/arm-linux-gnueabihf/librt-2.19.so
0x76d3e000 0x76d3f000 0x1000 76d3e000-76d3f000 r--p 00005000 b3:07 651761     /lib/arm-linux-gnueabihf/librt-2.19.so
0x76d3f000 0x76d40000 0x1000 76d3f000-76d40000 rw-p 00006000 b3:07 651761     /lib/arm-linux-gnueabihf/librt-2.19.so
0x76d40000 0x76d53000 0x13000 76d40000-76d53000 r-xp 00000000 b3:07 651716     /lib/arm-linux-gnueabihf/libkmod.so.2.2.8
0x76d53000 0x76d62000 0xf000 76d53000-76d62000 ---p 00013000 b3:07 651716     /lib/arm-linux-gnueabihf/libkmod.so.2.2.8
0x76d62000 0x76d63000 0x1000 76d62000-76d63000 r--p 00012000 b3:07 651716     /lib/arm-linux-gnueabihf/libkmod.so.2.2.8
0x76d63000 0x76d64000 0x1000 76d63000-76d64000 rw-p 00013000 b3:07 651716     /lib/arm-linux-gnueabihf/libkmod.so.2.2.8
0x76d64000 0x76d67000 0x3000 76d64000-76d67000 r-xp 00000000 b3:07 651697     /lib/arm-linux-gnueabihf/libcap.so.2.24
0x76d67000 0x76d76000 0xf000 76d67000-76d76000 ---p 00003000 b3:07 651697     /lib/arm-linux-gnueabihf/libcap.so.2.24
0x76d76000 0x76d77000 0x1000 76d76000-76d77000 r--p 00002000 b3:07 651697     /lib/arm-linux-gnueabihf/libcap.so.2.24
0x76d77000 0x76d78000 0x1000 76d77000-76d78000 rw-p 00003000 b3:07 651697     /lib/arm-linux-gnueabihf/libcap.so.2.24
0x76d78000 0x76d90000 0x18000 76d78000-76d90000 r-xp 00000000 b3:07 651756     /lib/arm-linux-gnueabihf/libaudit.so.1.0.0
0x76d90000 0x76d9f000 0xf000 76d90000-76d9f000 ---p 00018000 b3:07 651756     /lib/arm-linux-gnueabihf/libaudit.so.1.0.0
0x76d9f000 0x76da0000 0x1000 76d9f000-76da0000 r--p 00017000 b3:07 651756     /lib/arm-linux-gnueabihf/libaudit.so.1.0.0
0x76da0000 0x76da1000 0x1000 76da0000-76da1000 rw-p 00018000 b3:07 651756     /lib/arm-linux-gnueabihf/libaudit.so.1.0.0
0x76da1000 0x76dab000 0xa000 76da1000-76dab000 rw-p 00000000 00:00 0 
0x76dab000 0x76db6000 0xb000 76dab000-76db6000 r-xp 00000000 b3:07 651734     /lib/arm-linux-gnueabihf/libpam.so.0.83.1
0x76db6000 0x76dc5000 0xf000 76db6000-76dc5000 ---p 0000b000 b3:07 651734     /lib/arm-linux-gnueabihf/libpam.so.0.83.1
0x76dc5000 0x76dc6000 0x1000 76dc5000-76dc6000 r--p 0000a000 b3:07 651734     /lib/arm-linux-gnueabihf/libpam.so.0.83.1
0x76dc6000 0x76dc7000 0x1000 76dc6000-76dc7000 rw-p 0000b000 b3:07 651734     /lib/arm-linux-gnueabihf/libpam.so.0.83.1
0x76dc7000 0x76de2000 0x1b000 76dc7000-76de2000 r-xp 00000000 b3:07 651657     /lib/arm-linux-gnueabihf/libselinux.so.1
0x76de2000 0x76df1000 0xf000 76de2000-76df1000 ---p 0001b000 b3:07 651657     /lib/arm-linux-gnueabihf/libselinux.so.1
0x76df1000 0x76df2000 0x1000 76df1000-76df2000 r--p 0001a000 b3:07 651657     /lib/arm-linux-gnueabihf/libselinux.so.1
0x76df2000 0x76df3000 0x1000 76df2000-76df3000 rw-p 0001b000 b3:07 651657     /lib/arm-linux-gnueabihf/libselinux.so.1
0x76df3000 0x76df4000 0x1000 76df3000-76df4000 rw-p 00000000 00:00 0 
0x76df4000 0x76f1f000 0x12b000 76df4000-76f1f000 r-xp 00000000 b3:07 651612     /lib/arm-linux-gnueabihf/libc-2.19.so
0x76f1f000 0x76f2f000 0x10000 76f1f000-76f2f000 ---p 0012b000 b3:07 651612     /lib/arm-linux-gnueabihf/libc-2.19.so
0x76f2f000 0x76f31000 0x2000 76f2f000-76f31000 r--p 0012b000 b3:07 651612     /lib/arm-linux-gnueabihf/libc-2.19.so
0x76f31000 0x76f32000 0x1000 76f31000-76f32000 rw-p 0012d000 b3:07 651612     /lib/arm-linux-gnueabihf/libc-2.19.so
0x76f32000 0x76f35000 0x3000 76f32000-76f35000 rw-p 00000000 00:00 0 
0x76f35000 0x76f49000 0x14000 76f35000-76f49000 r-xp 00000000 b3:07 651758     /lib/arm-linux-gnueabihf/libpthread-2.19.so
0x76f49000 0x76f59000 0x10000 76f49000-76f59000 ---p 00014000 b3:07 651758     /lib/arm-linux-gnueabihf/libpthread-2.19.so
0x76f59000 0x76f5a000 0x1000 76f59000-76f5a000 r--p 00014000 b3:07 651758     /lib/arm-linux-gnueabihf/libpthread-2.19.so
0x76f5a000 0x76f5b000 0x1000 76f5a000-76f5b000 rw-p 00015000 b3:07 651758     /lib/arm-linux-gnueabihf/libpthread-2.19.so
0x76f5b000 0x76f5d000 0x2000 76f5b000-76f5d000 rw-p 00000000 00:00 0 
0x76f6f000 0x76f74000 0x5000 76f6f000-76f74000 r-xp 00000000 b3:07 528562     /usr/lib/arm-linux-gnueabihf/libarmmem.so
0x76f74000 0x76f83000 0xf000 76f74000-76f83000 ---p 00005000 b3:07 528562     /usr/lib/arm-linux-gnueabihf/libarmmem.so
0x76f83000 0x76f84000 0x1000 76f83000-76f84000 rw-p 00004000 b3:07 528562     /usr/lib/arm-linux-gnueabihf/libarmmem.so
0x76f84000 0x76fa4000 0x20000 76f84000-76fa4000 r-xp 00000000 b3:07 651597     /lib/arm-linux-gnueabihf/ld-2.19.so
0x76fab000 0x76fb3000 0x8000 76fab000-76fb3000 rw-p 00000000 00:00 0 
0x76fb3000 0x76fb4000 0x1000 76fb3000-76fb4000 r--p 0001f000 b3:07 651597     /lib/arm-linux-gnueabihf/ld-2.19.so
0x76fb4000 0x76fb5000 0x1000 76fb4000-76fb5000 rw-p 00020000 b3:07 651597     /lib/arm-linux-gnueabihf/ld-2.19.so
0x7ef76000 0x7ef97000 0x21000 7ef76000-7ef97000 rwxp 00000000 00:00 0          [stack]
0x7eff2000 0x7eff3000 0x1000 7eff2000-7eff3000 r-xp 00000000 00:00 0          [sigpage]
0x7eff3000 0x7eff4000 0x1000 7eff3000-7eff4000 r--p 00000000 00:00 0          [vvar]
0x7eff4000 0x7eff5000 0x1000 7eff4000-7eff5000 r-xp 00000000 00:00 0          [vdso]
0xffff0000 0xffff1000 0x1000 ffff0000-ffff1000 r-xp 00000000 00:00 0          [vectors]

 

以上是关于awk 解析maps文件中的地址的主要内容,如果未能解决你的问题,请参考以下文章

awk根据条件过滤文件

RecyclerView holder中的Android Google Maps动态片段

将多个输出中的hls属性设置为单独的片段代码

无法解析片段中的 findViewById [重复]

使用 awk 解析 csv 并忽略字段内的逗号

在 BeyondStudio for NXP 使用 Gawk(for JN5169)