의 출력과 같이 사람이 읽을 수있는 형식으로 수량이있는 데이터가 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"