2014-10-29 2 views
5

Итак, я пытаюсь проанализировать очень большие файлы журналов в linux, и я видел множество решений для этого, но программа, которая записывает данные, не позволяет форматировать вывод, поэтому он выводится только в читаемом человеком формате (я знаю, какая боль). Таким образом, вопрос: Как я могу преобразовать читаемым человеком в байты, используя что-то вроде AWK:Преобразование человека, читаемого в байты в bash

Так превращаю-:

937 
1.43K 
120.3M 

к:

937 
1464 
126143693 

я могу себе позволить, и я ожидаю некоторое закругление ошибки.

Заранее спасибо.

P.S. Не обязательно быть awk, если он может обеспечить конверсии в режиме «онлайн».

Я нашел this, но данная команда awk не работает должным образом. Он выводит что-то вроде 534K «0».

Я также нашел решение с использованием sed и bc, но поскольку он использует bc, он имеет ограниченную эффективность, означая, что он может использовать только один столбец за раз, и все данные должны быть подходящими для bc, иначе он не сработает.

sed -e 's/K/\*1024/g' -e 's/M/\*1048576/g' -e 's/G/\*1073741824/g' | bc

+1

Заканчивать этот ответ http://stackoverflow.com/questions/4399475/unformat-disk-size-strings/ – amdn

+0

@amdn, спасибо, я действительно нашел что-то подобное и сделал редактирование. Единственная проблема с этим решением заключается в том, что он использует bc, поэтому он не может слишком хорошо анализировать полный файл журнала. Он может работать с одним столбцом данных, который является одним и тем же типом. – Devon

+0

В нижней части этого ответа есть «один лайнер», который не использует bc – amdn

ответ

3
cat dehumanise 
937 
1.43K 
120.3M 
awk '/[0-9]$/{print $1;next};/[mM]$/{printf "%u\n", $1*(1024*1024);next};/[kK]$/{printf "%u\n", $1*1024;next}' dehumanise 
937 
1464 
126143692 
+0

Спасибо! Это работает только с одним столбцом, но кажется гораздо более надежным, чем использование метода bc. – Devon

+0

@Devon: Хех. Представьте некоторые фактические данные, и вы можете получить фактическое решение? :) – tink

+0

Я принял это, так как он работает хорошо. Я должен был протестировать его еще немного, прежде чем принимать его. Все, что мне нужно было сделать, это добавить 'awk {'print $ 2'} |' (в зависимости от столбца) перед началом работы над другим столбцом, и для моего анализа анализ одного столбца за раз отлично работает. – Devon

8

Вот функция, которая понимает двоичные и десятичные префиксы и легко расширяемой для больших блоков должно там быть потребность:

dehumanise() { 
    for v in "${@:-$(</dev/stdin)}" 
    do 
    echo $v | awk \ 
     'BEGIN{IGNORECASE = 1} 
     function printpower(n,b,p) {printf "%u\n", n*b^p; next} 
     /[0-9]$/{print $1;next}; 
     /K(iB)?$/{printpower($1, 2, 10)}; 
     /M(iB)?$/{printpower($1, 2, 20)}; 
     /G(iB)?$/{printpower($1, 2, 30)}; 
     /T(iB)?$/{printpower($1, 2, 40)}; 
     /KB$/{ printpower($1, 10, 3)}; 
     /MB$/{ printpower($1, 10, 6)}; 
     /GB$/{ printpower($1, 10, 9)}; 
     /TB$/{ printpower($1, 10, 12)}' 
    done 
} 

пример:

$ dehumanise 2K 2k 2KiB 2KB 
2048 
2048 
2048 
2000 

$ dehumanise 2G 2g 2GiB 2GB 
2147483648 
2147483648 
2147483648 
2000000000 

Суффиксы не чувствительны к регистру.

+0

Отредактировал функцию немного для работы с stdin. – Tgr

1

инструменты Python существуют

$pip install humanfriendly # Also available as a --user install in ~/.local/bin 

$humanfriendly --parse-size="2 KB" 
2000 
$humanfriendly --parse-size="2 KiB" 
2048