格式化 du 命令输出
Formatting du command output
有没有办法格式化(在 shell 命令链中)du -s -k *
的以下输出
287720 crm-cc
21500 crm-mvh
40360 elasticsearch-5.1.2
293292 electron-quick-start
44636 hexagon
193572 jpk
132 knights
209860 pink-panther
1722104 popc
4 server-config.txt
45392 sigb-backend
47468 test
58904 um-report
164156 zeus
通过以下方式:
1,763,434,496 popc
300,331,008 electron-quick-start
294,625,280 crm-cc
214,896,640 pink-panther
198,217,728 jpk
168,095,744 zeus
60,317,696 um-report
48,607,232 test
46,481,408 sigb-backend
45,707,264 hexagon
41,328,640 elasticsearch-5.1.2
22,016,000 crm-mvh
135,168 knights
4,096 server-config.txt
我的意思是:
- 按大小降序排列files/directories。
- 每三个字符插入一个千位分隔符,从
对。
- 插入前导空格以使尺寸右对齐[=29=]
I have implemented this in PHP 但我希望有一个更通用的解决方案(并非每个基于 linux 的 OS 都安装了 PHP 解释器)。
如果相关的话,我大部分时间都在使用zsh
,所以解决方案可以限于此shell。
例如,让我们考虑一个包含这些文件的目录:
$ du -sk *
12488 big.log
200 big.pdf
4 f1
2441412 output.txt
160660 program.zip
4 smallfile
4 some.txt
根据需要重新格式化 du
:
$ du -sk * | sort -rn | sed -E ':a; s/([[:digit:]]+)([[:digit:]]{3})/,/; ta' | awk -F'\t' '{printf "%10s %s\n",,substr([=11=],length()+2)}'
2,441,412 output.txt
160,660 program.zip
12,488 big.log
200 big.pdf
4 some.txt
4 smallfile
4 f1
注意:此方法甚至适用于包含空格的文件名。
Shell 方便函数
由于上面的内容很多,我们来创建一个shell函数:
$ dusk() { du -sk "$@" | sort -rn | sed -E ':a; s/([[:digit:]]+)([[:digit:]]{3})/,/; ta' | awk -F'\t' '{printf "%10s %s\n",,substr([=12=],length()+2)}';}
我们可以使用shell函数如下:
$ dusk *
2,441,412 output.txt
160,660 program.zip
12,488 big.log
200 big.pdf
4 some.txt
4 smallfile
4 f1
工作原理
du -sk *
这是我们的du
命令。
sort -rn
这会以相反的顺序进行数字排序,以便最大的文件排在第一位。
sed -E ':a; s/([[:digit:]]+)([[:digit:]]{3})/,/; ta'
这会将逗号放在我们想要的位置。
awk -F'\t' '{printf "%10s %s\n",,substr([=22=],length()+2)}';}
这使数字右对齐。
多行版本
对于那些喜欢将命令分散到多行的用户:
du -sk * |
sort -rn |
sed -E ':a; s/([[:digit:]]+)([[:digit:]]{3})/,/; ta' |
awk -F'\t' '{printf "%10s %s\n",,substr([=14=],length()+2)}'
与 Mac OSX/BSD
的兼容性
试试看它是否适用于 OSX:
$ echo 1234567890 | sed -E -e :a -e 's/([[:digit:]]+)([[:digit:]]{3})/,/' -e ta
1,234,567,890
如果可行,那么让我们将完整的命令修改为:
du -sk * | sort -rn | sed -E -e :a -e 's/([[:digit:]]+)([[:digit:]]{3})/,/' -e ta | awk -F'\t' '{printf "%10s %s\n",,substr([=16=],length()+2)}'
使用 sort
和 GNU awk 你可以(你在 file
中的输出):
$ sort -nr file | awk '{printf "%'\''d %s\n",,}'
1,722,104 popc
293,292 electron-quick-start
287,720 crm-cc
...
如果要右对齐第一个字段,需要为printf
提供第一个字段的宽度,例如:
$ sort -nr file | awk '{printf "%'\''9d %s\n",,}'
1,722,104 popc
293,292 electron-quick-start
287,720 crm-cc
9 是带逗号的 </code> 的长度,您可以用逗号计算:<code>length()+(length()-1)/3
最长 </code> 这是第一个,所以:</p>
<pre><code>$ sort -nr file |
awk 'NR==1 { len=length() + (length()-1)/3 }
{ printf "%'\''" len "d %s\n",, }'
1,722,104 popc
293,292 electron-quick-start
287,720 crm-cc
有没有办法格式化(在 shell 命令链中)du -s -k *
287720 crm-cc
21500 crm-mvh
40360 elasticsearch-5.1.2
293292 electron-quick-start
44636 hexagon
193572 jpk
132 knights
209860 pink-panther
1722104 popc
4 server-config.txt
45392 sigb-backend
47468 test
58904 um-report
164156 zeus
通过以下方式:
1,763,434,496 popc
300,331,008 electron-quick-start
294,625,280 crm-cc
214,896,640 pink-panther
198,217,728 jpk
168,095,744 zeus
60,317,696 um-report
48,607,232 test
46,481,408 sigb-backend
45,707,264 hexagon
41,328,640 elasticsearch-5.1.2
22,016,000 crm-mvh
135,168 knights
4,096 server-config.txt
我的意思是:
- 按大小降序排列files/directories。
- 每三个字符插入一个千位分隔符,从 对。
- 插入前导空格以使尺寸右对齐[=29=]
I have implemented this in PHP 但我希望有一个更通用的解决方案(并非每个基于 linux 的 OS 都安装了 PHP 解释器)。
如果相关的话,我大部分时间都在使用zsh
,所以解决方案可以限于此shell。
例如,让我们考虑一个包含这些文件的目录:
$ du -sk *
12488 big.log
200 big.pdf
4 f1
2441412 output.txt
160660 program.zip
4 smallfile
4 some.txt
根据需要重新格式化 du
:
$ du -sk * | sort -rn | sed -E ':a; s/([[:digit:]]+)([[:digit:]]{3})/,/; ta' | awk -F'\t' '{printf "%10s %s\n",,substr([=11=],length()+2)}'
2,441,412 output.txt
160,660 program.zip
12,488 big.log
200 big.pdf
4 some.txt
4 smallfile
4 f1
注意:此方法甚至适用于包含空格的文件名。
Shell 方便函数
由于上面的内容很多,我们来创建一个shell函数:
$ dusk() { du -sk "$@" | sort -rn | sed -E ':a; s/([[:digit:]]+)([[:digit:]]{3})/,/; ta' | awk -F'\t' '{printf "%10s %s\n",,substr([=12=],length()+2)}';}
我们可以使用shell函数如下:
$ dusk *
2,441,412 output.txt
160,660 program.zip
12,488 big.log
200 big.pdf
4 some.txt
4 smallfile
4 f1
工作原理
du -sk *
这是我们的
du
命令。sort -rn
这会以相反的顺序进行数字排序,以便最大的文件排在第一位。
sed -E ':a; s/([[:digit:]]+)([[:digit:]]{3})/,/; ta'
这会将逗号放在我们想要的位置。
awk -F'\t' '{printf "%10s %s\n",,substr([=22=],length()+2)}';}
这使数字右对齐。
多行版本
对于那些喜欢将命令分散到多行的用户:
du -sk * |
sort -rn |
sed -E ':a; s/([[:digit:]]+)([[:digit:]]{3})/,/; ta' |
awk -F'\t' '{printf "%10s %s\n",,substr([=14=],length()+2)}'
与 Mac OSX/BSD
的兼容性试试看它是否适用于 OSX:
$ echo 1234567890 | sed -E -e :a -e 's/([[:digit:]]+)([[:digit:]]{3})/,/' -e ta
1,234,567,890
如果可行,那么让我们将完整的命令修改为:
du -sk * | sort -rn | sed -E -e :a -e 's/([[:digit:]]+)([[:digit:]]{3})/,/' -e ta | awk -F'\t' '{printf "%10s %s\n",,substr([=16=],length()+2)}'
使用 sort
和 GNU awk 你可以(你在 file
中的输出):
$ sort -nr file | awk '{printf "%'\''d %s\n",,}'
1,722,104 popc
293,292 electron-quick-start
287,720 crm-cc
...
如果要右对齐第一个字段,需要为printf
提供第一个字段的宽度,例如:
$ sort -nr file | awk '{printf "%'\''9d %s\n",,}'
1,722,104 popc
293,292 electron-quick-start
287,720 crm-cc
9 是带逗号的 </code> 的长度,您可以用逗号计算:<code>length()+(length()-1)/3
最长 </code> 这是第一个,所以:</p>
<pre><code>$ sort -nr file |
awk 'NR==1 { len=length() + (length()-1)/3 }
{ printf "%'\''" len "d %s\n",, }'
1,722,104 popc
293,292 electron-quick-start
287,720 crm-cc