2015-02-28 2 views
2

У меня возникли проблемы с awk, выводящим определенный столбец из моего файла журнала.Ошибка awk вывод определенного столбца в dumpsys

Ввод: журнал хранения dumpsys с несколькими моментальными снимками в файле Попытка вывода: размер PSS, кучи, кучи Alloc и кучи свободных сумм.
Маленький боковой я: форматирование вывода в синтаксисе массива 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, и он работает по назначению. Примечание - я рассталась команду AWK на несколько строк для StackOverflow читаемости, я на самом деле ввода его в одной строке:

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","$2","$6","$7","$1" ]," 
    } 
}' 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, весь формат вывода breaks и значение 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","$2","$6","$7","$8" ]," 
    } 
}' 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 

Любая помощь будет оценена по достоинству.

ответ

3

Во-первых, я не думаю, что значение «row_operand полностью опущено»; оба примера показывают 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? - или сделать интернет-поиск для «ДОС UNIX»

+0

Great слежки; простой способ удалить CR со стандартными инструментами в bash - это 'sed $ 's/\ r $ //''. – mklement0

+0

Это ответ. Мне просто нужно было запустить команду sed в вашей предоставленной ссылке и комментарий mklement «sed $ 's/\ r $ //». Вся эта ситуация нечетна, так как я никогда не сохранял файл в среде Windows. Файл был сгенерирован командой dumpsys в оболочке Android. В любом случае, очень хорошо. Спасибо, ракраман –

Смежные вопросы