【问题标题】:Split results of du command by new line按新行拆分 du 命令的结果
【发布时间】:2020-03-07 17:27:03
【问题描述】:

我列出了占用硬盘空间最多的前 20 个文件/文件夹。我想将它们分成size path/to/file。以下是我到目前为止所做的。

我正在使用:var=$(du -a -g /folder/ | sort -n -r | head -n 20)。它返回以下内容:

120    /path/to/file
115    /path/to/another/file
110    /file/path/ 

等等

我已尝试使用以下代码将其拆分为单行。

for i in $(echo $var | sed "s/\n/ /g")
do
    echo "$i"
done

我想要的结果如下:

120 /path/to/file,
115 /path/to/another/file,
110 /file/path/,

等等

这是我得到的结果:

120, 
/path/to/file,
115, 
/path/to/another/file,
110, 
/file/path/,

等等

【问题讨论】:

  • var=$(cmd... ) 几乎总是有麻烦。稍微好一点的是varArr=( $(cmd ...) ),其中返回的内容存储为一个数组,您可以使用${varArr[@]}(对于整个事物)或单独使用${varArr[1]}(但从0 开始)访问该数组。更好的是(通常)是 ( cmds_that_produce_output | filters | rearrangers | etc ) | while read sz fName ; do printf "%06.2d\t%30s\n" $sz $fName ; done 排序,或者甚至用 awk 脚本替换 while 循环。 (在 `printf spec 修饰符上搜索)但是,抱歉,没有时间深入研究您的具体问题。祝你好运!
  • @shellter 不幸的是,这对我不起作用,我正在使用的服务器不支持bash。只有sh,所以我不能使用数组。
  • 如果您使用的是var=$(cmd)$(...) 部分),那不是“真实的” /bin/sh (来自 80 年代 ;-) )。你从echo SHELL="$SHELL" ; uname -srv 得到什么?祝你好运。
  • @shellter 当我运行该命令时,我得到SHELL=/usr/bin/ksh

标签: sed sh du


【解决方案1】:

我觉得awk会更简单,可以结合一个管道到原来的命令:

du -a -g /folder/ | sort -n -r | head -n 20 | awk '{ print $1, $2 "," }'

如果不能创建单个管道,必须使用$var

echo "$var" | awk '{ print $1, $2 "," }'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    相关资源
    最近更新 更多