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"