我想將此命令輸出中的第 5 列轉換為人類可讀的格式。例如,如果這是我的輸入:
-rw-rw-r-- 1 bhagyaraj bhagyaraj 280000 Jun 17 18:34 demo1
-rw-rw-r-- 1 bhagyaraj bhagyaraj 2800000 Jun 17 18:34 demo2
-rw-rw-r-- 1 bhagyaraj bhagyaraj 28000000 Jun 17 18:35 demo3
對于這樣的事情:
-rw-rw-r-- 280K demo1
-rw-rw-r-- 2.8M demo2
-rw-rw-r-- 28M demo3
我試過這個命令,但這只會回傳檔案大小列。
ls -l | tail -n 2 |awk '{print $5 | "numfmt --to=si"}'
ls只是例如我的用例非常龐大,必須避免重復執行
任何幫助,將不勝感激 :)
uj5u.com熱心網友回復:
只需使用-h --si
-h, --human-readable with -l and -s, print sizes like 1K 234M 2G etc.
--si likewise, but use powers of 1000 not 1024
所以命令是
ls -lh --si | tail -n 2
如果您不使用ls并且您打算運行的命令沒有類似于-h --siin的選項,ls那么您numfmt已經可以--field選擇指定要格式化的列。例如
$ df | LC_ALL=en_US.UTF-8 numfmt --header --field 2-4 --to=si 檔案系統 1K-blocks Used Available Use% Mounted on udev 66M 0 66M 0% /dev tmpfs 14M 7.2K 14M 1%/運行 /dev/mapper/vg0-lv--0 4.1G 3.7G 416M 90% / tmpfs 5.2K 4 5.2K 1% /運行/鎖定 /dev/nvme2n1p1 524K 5.4K 518K 2% /boot/efi
不幸的是,盡管numfmt確實嘗試保留分欄,但如果在插入組分隔符后行長度有一些較大的變化,如您在上面看到的,它會失敗。所以有時你可能仍然需要重新格式化表格column
df | LC_ALL=en_US.UTF-8 numfmt --header --field 2-4 --to=si | column -t -R 2,3,4,5
該-R 2,3,4,5選項用于右對齊,但某些column版本(如 Ubuntu 中的默認版本)不支持它,因此您需要將其洗掉
或者,您也可以使用awk僅格式化您想要的列,例如第 5 列,以防ls
$ ls -l 演示* | awk -v K=1e3 -v M=1e6 -v G=1e9 'func 格式(v) {
如果 (v > G) 回傳 v/G "G"; 否則如果 (v > M) 回傳 v/M "M";
否則如果 (v > K) 回傳 v/K "K"; 否則回傳 v
} { $5 = 格式($5); 列印 $0 }' | 列-t
-rw-rw-r-- 1 ph ph 280K Jun 18 09:23 demo1
-rw-rw-r-- 1 ph ph 2.8M Jun 18 09:24 demo2
-rw-rw-r-- 1 ph ph 28M Jun 18 09:23 demo3
-rw-rw-r-- 1 ph ph 2.8G Jun 18 09:30 demo4
如果是第 2、3、4 列df
# M=1000 和 G=1000000 因為 df 輸出是 1K 塊,而不是位元組
$ df | awk -v M=1000 -v G=1000000 'func 格式(v) {
如果 (v > G) 回傳 v/G "G"; 否則如果 (v > M) 回傳 v/M "M"; 否則回傳 v
}
{
# 僅格式化第 2、3 和 4 列,忽略標題
如果 (NR > 1) { $2 = 格式($2); $3 = 格式($3); $4 = 格式($4) }
列印 $0
}' OFS="\t" | column -t
Filesystem 1K-blocks Used Available Use% Mounted on
udev 65.8273G 0 65.8273G 0% /dev
tmpfs 13.1772G 7M 13.1702G 1%/運行
/dev/mapper/vg0-lv--0 4073.78G 3619.05G 415.651G 90% /
tmpfs 65.8861G 0 65.8861G 0% /dev/shm
tmpfs 5.12M 4 5.116M 1% /運行/鎖定
tmpfs 65.8861G 0 65.8861G 0% /sys/fs/cgroup
/dev/nvme2n1p2 999.32M 363.412M 567.096M 40% /boot
uj5u.com熱心網友回復:
使用awk
$ ls -l | awk '{if($5 > 1000000) size=$5/1000000"M"; else if ($5 < 1000) size=$5"B"; else if(length($5) <= 4) size=sprintf("%.1fK", $5/1000);else size=$5/1000"K"}{print $1,size,$NF}'
-rw-rw-r-- 280K demo1
-rw-rw-r-- 2.8M demo2
-rw-rw-r-- 28M demo3
$ cat script.awk
{
if ($5 > 1000000)
size=$5/1000000"M"
else
if ($5 < 1000)
size=$5"B"
else
if (length($5) <= 4)
size=sprintf("%.1fK", $5/1000)
else
size=$5/1000"K"
} {
print $1,size,$NF
}
$ ls -l | awk -f script.awk
-rw-rw-r-- 280K demo1
-rw-rw-r-- 2.8M demo2
-rw-rw-r-- 28M demo3
uj5u.com熱心網友回復:
這可能有點矯枉過正,但我??前段時間寫了它,它可以計算人類可讀的值,以及原始位元組值的逗號格式,支持從kilo-bit到yotta-byte
選項:
base 2或base 10(輸入10或"M/m"為公制)bytes(B) 或bits(b)
唯一需要硬編碼的是字母本身,因為它們在任何一個上線性增長
- 每 10 (
1,000) 的 3 次方,或 - 每 4 (
1,024)的 5 次方
.
{m,g}awk '
BEGIN {
1 FS = OFS = "="
}
2302812 $!NF = substr(bytesformat($2, 10, "B"), 1, 15)\
substr(bytesformat($2, 2, "B"), 1, 15)\
bytesformat($2, 2, "b")'
# Functions, listed alphabetically
6908436 function bytesformat(_,_______,________,__, ___, ____, _____, ______)
{
6908436 _____=__=(____^=___*=((____=___ =___^= "")/___) ___ ___)
6908436 ___/=___
6908436 sub("^0 ","",_)
6908436 ____=_____-= substr(_____,index(_____,index(_____,!__))) * (_______~"^(10|[Mm])$")
6908436 _______=length((____)____)^(________~"^b(it)?$")
6908436 if ((____*__) < (_______*_)) { # 6906267
24438981 do {
24438981 ____*=_____
24438981 ___
} while ((____*__) < (_______*_))
}
6908436 __=_
6908436 sub("(...) $", ",&", __)
6908436 gsub("[^#-.][^#-.][^#-.]", "&,", __)
6908436 gsub("[,]*$|^[,] ", "", __)
6908436 sub("^[.]", "0&", __)
6908436 return \
sprintf(".4f %s%s | %s byte%.*s",
_=="" ? _:_/(_____^___)*_______,
substr("KMGTPEZY", ___, _^(_<_)),
--_______?"b":"B",__==""? __:__,(_^(_<_))<_,"s")
}
|
在此示例中,它顯示了公制位元組、二進制位元組、二進制位和原始輸入位元組值:
180.0430 KB | 175.8232 KB | 1.3736 Mb | 180,043 bytes
232.8190 KB | 227.3623 KB | 1.7763 Mb | 232,819 bytes
421.5484 MB | 402.0199 MB | 3.1408 Gb | 421,548,373 bytes
838.5938 MB | 799.7454 MB | 6.2480 Gb | 838,593,829 bytes
3.7394 GB | 3.4826 GB | 27.8606 Gb | 3,739,382,399 bytes
116.6017 GB | 108.5938 GB | 868.7502 Gb | 116,601,682,159 bytes
147.4800 GB | 137.3515 GB | 1.0731 Tb | 147,480,014,471 bytes
11.0100 TB | 10.0136 TB | 80.1085 Tb | 11,010,032,230,111 bytes
19.8307 TB | 18.0359 TB | 144.2873 Tb | 19,830,700,070,261 bytes
111.1207 TB | 101.0637 TB | 808.5093 Tb | 111,120,670,776,601 bytes
15.0233 PB | 13.3434 PB | 106.7471 Pb | 15,023,323,323,323,321 bytes
85.2555 PB | 75.7221 PB | 605.7771 Pb | 85,255,542,224,555,233 bytes
444.4447 PB | 394.7462 PB | 3.0840 Eb | 444,444,666,677,766,611 bytes
106.9419 EB | 92.7573 EB | 742.0586 Eb | 106,941,916,666,944,416,909 bytes
111.9200 EB | 97.0751 EB | 776.6010 Eb | 111,919,999,919,911,191,991 bytes
767.7778 ZB | 650.3331 ZB | 5.0807 Yb | 767,777,766,776,776,776,777,767 bytes
5.5589 YB | 4.5982 YB | 36.7856 Yb | 5,558,888,858,993,555,888,686,669 bytes
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/492668.html
下一篇:如何根據輸出過濾資料并執行命令
