awk 在 dumpsys 中输出特定列时遇到问题
awk trouble outputting a certain column in dumpsys
我在使用 awk 从日志文件输出特定列时遇到问题。
输入:文件中包含多个快照的 dumpsys meminfo 日志
尝试输出:PSS、堆大小、堆分配和堆空闲总计。
小旁注:我正在用 js 数组语法格式化输出。我稍后处理右括号
下面的示例输入(其中几个快照在实际文件中):
Applications Memory Usage (kB):
Uptime: 232535528 Realtime: 544103118
** MEMINFO in pid 28141 [com.test.helloworld] **
Pss Private Private Swapped Heap Heap Heap
Total Dirty Clean Dirty Size Alloc Free
------ ------ ------ ------ ------ ------ ------
Native Heap 0 0 0 0 246840 217671 648
Dalvik Heap 8327 8208 0 556 11892 10861 1031
Dalvik Other 2639 2288 124 1012
Stack 528 528 0 0
Ashmem 138 128 0 0
Other dev 89770 11540 69612 0
.so mmap 10497 2204 7836 8448
.apk mmap 280 0 140 0
.dex mmap 1219 64 444 244
Other mmap 950 576 128 736
Unknown 223484 223468 0 96
TOTAL 337832 249004 78284 11092 258732 228532 1679
Objects
Views: 9 ViewRootImpl: 1
AppContexts: 4 Activities: 1
Assets: 3 AssetManagers: 3
Local Binders: 14 Proxy Binders: 24
Death Recipients: 1
OpenSSL Sockets: 4
SQL
MEMORY_USED: 0
PAGECACHE_OVERFLOW: 0 MALLOC_SIZE: 0
这是一个奇怪的问题。我的 awk 命令可以输出除第 8 列以外的所有列。
工作示例 - 我没有尝试输出第 8 列,而是输出 $1,它按预期工作。 注意 - 为了 Whosebug 的可读性,我将 awk 命令分成几行,实际上我将它全部输入一行:
awk -v line_counter="$COUNTER" -v row_operand=0 '
BEGIN{row_operand=NR%19;
if (row_operand == 0){
print "[[\x27 frame \x27,\x27 Total_PSS_RAM_Usage \x27,\x27 Heap_Size \x27,\x27 Heap_Alloc \x27,\x27 Heap_Free \x27],"
}
}
{row_operand=NR-19;row_operand=row_operand%32;
if (row_operand == 0){
print "["line_counter","","","","" ],"
}
}' logfile.txt
And the output:
[[' frame ',' Total_PSS_RAM_Usage ',' Heap_Size ',' Heap_Alloc ',' Heap_Free '],
[0,337832,258732,228532,228532 ],
[0,338591,258732,227821,227821 ],
[0,338431,214996,202579,202579 ],
问题示例:当试图输出第 8 列 $8 时,整个输出格式中断并且 row_operand 值被完全省略。我很困惑,因为我只更改一位数字(即 1 美元到 8 美元)以获得这些不同的结果。
awk -v line_counter="$COUNTER" -v row_operand=0 '
BEGIN{row_operand=NR%19;
if (row_operand == 0){
print "[[\x27 frame \x27,\x27 Total_PSS_RAM_Usage \x27,\x27 Heap_Size \x27,\x27 Heap_Alloc \x27,\x27 Heap_Free \x27],"
}
}
{row_operand=NR-19;row_operand=row_operand%32;
if (row_operand == 0){print "["line_counter","","","","" ],"
}
}' logfile.txt
And the ouput:
[[' frame ',' Total_PSS_RAM_Usage ',' Heap_Size ',' Heap_Alloc ',' Heap_Free '],
],337832,258732,228532,1679
],338591,258732,227821,2390
],338431,214996,202579,5864
如有任何帮助,我们将不胜感激。
首先,我不认为"row_operand value is totally omitted";您的两个示例都显示了 3 行输出 - 第一行的字段值为“337832,258732,228532”。此外,果然,该行的第 8 个字段值确实显示 1679,这对于您显示的示例是正确的。
因此,所有数据都在那里,但方括号已移至输出行的开头。
所以,我将您的示例文本复制到我的 linux 系统中,并得到:
[[' frame ',' Total_PSS_RAM_Usage ',' Heap_Size ',' Heap_Alloc ',' Heap_Free '],
[,337832,258732,228532,1679 ],
然而,当我将输入文件从 Unix 格式更改为 DOS 格式时,我得到:
[[' frame ',' Total_PSS_RAM_Usage ',' Heap_Size ',' Heap_Alloc ',' Heap_Free '],
],37832,258732,228532,1679
这就是问题所在 - 您一定是在 Windows 的某个阶段保存了文件。
在不同的系统上有不同的工具来进行转换(例如 dos2unix)- 查看 How to convert DOS/Windows newline (CRLF) to Unix newline (\n) in a Bash script? - 或在互联网上搜索 "dos to unix"
我在使用 awk 从日志文件输出特定列时遇到问题。
输入:文件中包含多个快照的 dumpsys meminfo 日志
尝试输出:PSS、堆大小、堆分配和堆空闲总计。
小旁注:我正在用 js 数组语法格式化输出。我稍后处理右括号
下面的示例输入(其中几个快照在实际文件中):
Applications Memory Usage (kB):
Uptime: 232535528 Realtime: 544103118
** MEMINFO in pid 28141 [com.test.helloworld] **
Pss Private Private Swapped Heap Heap Heap
Total Dirty Clean Dirty Size Alloc Free
------ ------ ------ ------ ------ ------ ------
Native Heap 0 0 0 0 246840 217671 648
Dalvik Heap 8327 8208 0 556 11892 10861 1031
Dalvik Other 2639 2288 124 1012
Stack 528 528 0 0
Ashmem 138 128 0 0
Other dev 89770 11540 69612 0
.so mmap 10497 2204 7836 8448
.apk mmap 280 0 140 0
.dex mmap 1219 64 444 244
Other mmap 950 576 128 736
Unknown 223484 223468 0 96
TOTAL 337832 249004 78284 11092 258732 228532 1679
Objects
Views: 9 ViewRootImpl: 1
AppContexts: 4 Activities: 1
Assets: 3 AssetManagers: 3
Local Binders: 14 Proxy Binders: 24
Death Recipients: 1
OpenSSL Sockets: 4
SQL
MEMORY_USED: 0
PAGECACHE_OVERFLOW: 0 MALLOC_SIZE: 0
这是一个奇怪的问题。我的 awk 命令可以输出除第 8 列以外的所有列。
工作示例 - 我没有尝试输出第 8 列,而是输出 $1,它按预期工作。 注意 - 为了 Whosebug 的可读性,我将 awk 命令分成几行,实际上我将它全部输入一行:
awk -v line_counter="$COUNTER" -v row_operand=0 '
BEGIN{row_operand=NR%19;
if (row_operand == 0){
print "[[\x27 frame \x27,\x27 Total_PSS_RAM_Usage \x27,\x27 Heap_Size \x27,\x27 Heap_Alloc \x27,\x27 Heap_Free \x27],"
}
}
{row_operand=NR-19;row_operand=row_operand%32;
if (row_operand == 0){
print "["line_counter","","","","" ],"
}
}' logfile.txt
And the output:
[[' frame ',' Total_PSS_RAM_Usage ',' Heap_Size ',' Heap_Alloc ',' Heap_Free '],
[0,337832,258732,228532,228532 ],
[0,338591,258732,227821,227821 ],
[0,338431,214996,202579,202579 ],
问题示例:当试图输出第 8 列 $8 时,整个输出格式中断并且 row_operand 值被完全省略。我很困惑,因为我只更改一位数字(即 1 美元到 8 美元)以获得这些不同的结果。
awk -v line_counter="$COUNTER" -v row_operand=0 '
BEGIN{row_operand=NR%19;
if (row_operand == 0){
print "[[\x27 frame \x27,\x27 Total_PSS_RAM_Usage \x27,\x27 Heap_Size \x27,\x27 Heap_Alloc \x27,\x27 Heap_Free \x27],"
}
}
{row_operand=NR-19;row_operand=row_operand%32;
if (row_operand == 0){print "["line_counter","","","","" ],"
}
}' logfile.txt
And the ouput:
[[' frame ',' Total_PSS_RAM_Usage ',' Heap_Size ',' Heap_Alloc ',' Heap_Free '],
],337832,258732,228532,1679
],338591,258732,227821,2390
],338431,214996,202579,5864
如有任何帮助,我们将不胜感激。
首先,我不认为"row_operand value is totally omitted";您的两个示例都显示了 3 行输出 - 第一行的字段值为“337832,258732,228532”。此外,果然,该行的第 8 个字段值确实显示 1679,这对于您显示的示例是正确的。
因此,所有数据都在那里,但方括号已移至输出行的开头。
所以,我将您的示例文本复制到我的 linux 系统中,并得到:
[[' frame ',' Total_PSS_RAM_Usage ',' Heap_Size ',' Heap_Alloc ',' Heap_Free '],
[,337832,258732,228532,1679 ],
然而,当我将输入文件从 Unix 格式更改为 DOS 格式时,我得到:
[[' frame ',' Total_PSS_RAM_Usage ',' Heap_Size ',' Heap_Alloc ',' Heap_Free '],
],37832,258732,228532,1679
这就是问题所在 - 您一定是在 Windows 的某个阶段保存了文件。
在不同的系统上有不同的工具来进行转换(例如 dos2unix)- 查看 How to convert DOS/Windows newline (CRLF) to Unix newline (\n) in a Bash script? - 或在互联网上搜索 "dos to unix"