태그 보관물: utility

utility

단위 접미사가있는 숫자에 대한 편리한 구문 분석? 대한 접미사 변환을 원합니다. 파이프 라인 내에서

의 출력과 같이 사람이 읽을 수있는 형식으로 수량이있는 데이터가 du -h있고 해당 숫자에 대해 추가로 작업하려고 한다고 가정하겠습니다 . grep을 통해 데이터를 파이프하여 해당 데이터의 하위 세트를 합산한다고 가정 해 봅시다. 지금까지 본 적이없는 많은 시스템에서이 임시 작업을 수행하며 최소한의 유틸리티 만 가지고 있습니다. 모든 표준 10 ^ n 접미사에 대한 접미사 변환을 원합니다.

파이프 라인 내에서 접미사 숫자를 실수로 변환하는 gnu-linux 유틸리티가 있습니까? 이 작업을 수행하기 위해 작성된 bash 함수가 있습니까, 아니면 정규식 대체 또는 여러 sed 단계 대신 기억하기 쉬운 펄이 있습니까?

38M     /var/crazyface/courses/200909-90147
2.7M    /var/crazyface/courses/200909-90157
1.1M    /var/crazyface/courses/200909-90159
385M    /var/crazyface/courses/200909-90161
1.3M    /var/crazyface/courses/200909-90169
376M    /var/crazyface/courses/200907-90171
8.0K    /var/crazyface/courses/200907-90173
668K    /var/crazyface/courses/200907-90175
564M    /var/crazyface/courses/200907-90178
4.0K    /var/crazyface/courses/200907-90179

| grep 200907 | <amazing suffix conversion> | awk '{s+=$1} END {print s}'


관련 참조 :



답변

귀하가 연결 한 질문 중 하나에 대한 나의 답변을 바탕으로 :

awk '{
    ex = index("KMGTPEZY", substr($1, length($1)))
    val = substr($1, 0, length($1) - 1)

    prod = val * 10^(ex * 3)

    sum += prod
}
END {print sum}'

사용되는 다른 방법 :

sed 's/G/ * 1000 M/;s/M/ * 1000 K/;s/K/ * 1000/; s/$/ +\\/; $a0' | bc

답변

이를 위해 perl 정규 표현식을 사용할 수 있습니다. 예를 들어

$value = 0;
if($line =~ /(\d+\.?\d*)(\D+)\s+/) {
   $amplifier = 1024 if ($2 eq 'K');
   $amplifier = 1024 * 1024 if ($2 eq 'M');
   $amplifier = 1024 * 1024 * 1024 if ($2 eq 'G');
   $value = $1 * $amplifier;
}

이것은 간단한 스크립트입니다. 시작점으로 생각할 수 있습니다. 그것이 도움이되기를 바랍니다!


답변

개인적으로, 나는 -h 플래그를 처음에는 사용하지 않을 것입니다. “사람이 읽을 수있는”버전은 숫자를 반올림하여 다시 변환 할 때 다시 반올림해야하므로 정확도가 떨어집니다. (예를 들어, 2.7MiB는 2831155.2 바이트입니다. 다른 0.8 바이트로 무엇을 했습니까 ??!)

그렇지 않으면, 당신은 요청할 수 있습니다 units(그렇지 않으면 출력이 탭되어 가정 그냥 “B”에 MiB 크기 / 지브 / 킬로바이트로 변환하고는이 문제를 해결할 수 있습니다,하지만 당신은 뭔가를해야 할 것 cut적절하게)

{your output} | cut -f1 '-d{tab}' | xargs -L 1 -I {} units -1t {}iB B | awk '{s+=$1}END{printf "%d\n",s}'

답변

VALUE=$1

for i in "g G m M k K"; do
        VALUE=${VALUE//[gG]/*1024m}
        VALUE=${VALUE//[mM]/*1024k}
        VALUE=${VALUE//[kK]/*1024}
done

[ ${VALUE//\*/} -gt 0 ] && echo VALUE=$((VALUE)) || echo "ERROR: size invalid, pls enter correct size"

답변