사람이 읽을 수있는 크기를 바이트로 변환해야합니다. 불행히도 numfmt 함수에 액세스 할 수 없습니다. 다른 대안이 있습니까? sh 스크립트 내부에서 호출하려면 셸 / bash 함수가 필요합니다.
1K는 1000으로, 1M은 1000 000으로 변환해야합니다.
Perl을 사용할 수있는 경우 :
echo your_string | perl -ne '
BEGIN{ %suffixes=( K => 3, M => 6, G => 9, T => 12, P => 15, E => 18 );
$suffix_regex = join "|", keys %suffixes;
}
s/([0-9][0-9]*(?:\.[0-9]+)?)($suffix_regex)/$1e$suffixes{$2}/g;
printf "%d\n", $_;
'
이것은 텍스트 필터로 사용되기 때문에 perl
스크립트 로 정의하고 입력을 파이프 하는 것이 더 적절 합니다. 다음을 추가하여 쉘 함수 내에 임베드 할 수 있습니다 .bashrc
(Bash를 사용한다고 가정).
myconvert() {
cat <<'EOF' >/dev/null
#!--perl-- -n
BEGIN{ %suffixes=( K => 3, M => 6, G => 9, T => 12, P => 15, E => 18 );
$suffix_regex = join "|", keys %suffixes;
}
s/([0-9][0-9]*(?:\.[0-9]+)?)($suffix_regex)/$1e$suffixes{$2}/g;
printf "%d\n", $_;
__END__
EOF
exec perl -x "/path/to/your/.bashrc"
}
sed
및 사용하는 솔루션 bc
:
myconvert(){
sed '
s/\([0-9][0-9]*\(\.[0-9]\+\)\?\)K/\1*1000/g;
s/\([0-9][0-9]*\(\.[0-9]\+\)\?\)M/\1*1000000/g;
s/\([0-9][0-9]*\(\.[0-9]\+\)\?\)G/\1*1000000000/g;
s/\([0-9][0-9]*\(\.[0-9]\+\)\?\)T/\1*1000000000000/g;
s/\([0-9][0-9]*\(\.[0-9]\+\)\?\)P/\1*1000000000000000/g;
s/\([0-9][0-9]*\(\.[0-9]\+\)\?\)E/\1*1000000000000000000/g
' </dev/stdin | bc | sed 's/\..*$//' # Final sed to remove decimal point
}
사용법 (두 솔루션 모두 동일) :
$ echo '5.23K' | myconvert
5230
$ echo '6.27G' | myconvert
6270000000
이 솔루션은 입력이 형식의 문자열로만 구성되어 있다고 가정합니다 5.23K
(분수 부분은 선택 사항). 그렇지 않으면 bc
어떻게해야할지 알 수 없습니다.
노트
Perl 원 라이너 < /dev/stdin
는 sed
솔루션 과 마찬가지로 쉘 기능에있는 그대로 삽입 될 수 있습니다 . 답변의 첫 번째 버전을 작성할 때 이것은 내 마음을 건너지 않았습니다. perl -x
하지만 다른 사람에게 도움이 될 수있는 경우를 대비 하여 속임수를 남겨 두겠습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다