字符串分隔符正在影响其各个字符的某些实例

时间:2017-06-07 15:46:23

标签: linux bash shell awk

所以基本上,我试图用以下代码打印出一个人类可读的文件和目录大小列表(没有列出当前目录)

du -arh | sort -nr | tail -n +2 | awk -F"./" '{print $1 $2 $3}' | head -n $NUM

NUM变量只是列出的项目数量的参数。

没有awk delimiter命令的上述输出是

  

4.0K ./url-list
  4.0K ./testurl.sh
  4.0K ./diskhogger.sh
  4.0K ./backup/url-list
  4.0K ./backup.sh

但是,添加awk命令输出

  

4.0K url-list
  4.0K testurl.sh
  4.0K diskhogger.sh
  4.0K backuurl-list
  4.0K backup.sh

只要有一个值得注意的子目录,就会出现类似的输出。

  

./ Library / Cache - LibrarCache等

要清楚,我试图删除" ./"在文件名的开头,不影响其他正斜杠。我的首选输出是:

  

4.0K url-list
  4.0K testurl.sh
  4.0K diskhogger.sh
  4.0K备份/网址列表
  4.0K backup.sh

其中" backup / url-list"没有受到影响。

是'。'在我的分界符中,我不知道一个特殊的角色?如果不是,这到底发生了什么?

我是shell的新手,所以关于此的任何信息都会很棒。

谢谢!

为了清晰而编辑。

3 个答案:

答案 0 :(得分:2)

如果您使用的是awk

,则可以删除其他一些命令
du -arh | sort -nr | awk -v len="$NUM" 'NR>1{gsub("\\.\\/",""); print} NR==len{exit}'

或只是使用

... | sed 's_\./__' | head ...

答案 1 :(得分:1)

-F"./" - 被视为"任何字符后跟正斜杠"
它被视为正则表达式模式{{1意味着"任何角色"在正则表达式方面。
要使用" dot后跟斜杠" .作为分隔符,请使用以下方法之一:

    字符类

    中的
  • ./

    .
  • awk -F"[.]/" '{print $1,$2,$3}' 已转义

    .

答案 2 :(得分:1)

是。 awk将分隔符视为正则表达式。一个 ”。”在正则表达式中匹配任何字符。因此,awk会在“/”前面的字符处分割你的行。 如果你想匹配文字“。”,最简单的方法是把它放在方括号中,使它成为一个字符类,只匹配字符“。”

你最终得到了

du -arh | sort -nr | tail -n +2 | awk -F"[.]/" '{print $1 $2}' | head -n $NUM

但请注意,这不是您唯一的问题。如果您有一个名称以“。”结尾的目录。并且该目录包含文件,在“du”的结果中的某些行上将有多个“./”条目。 (例如,名为“foo。”的目录中名为“bar”的文件为您提供“foo./bar”。)因此,更好的解决方案是使用awk中的sub()函数替换“./”的第一个实例。用“”。

du -arh | sort -nr | tail -n +2 | awk '{sub("./",""); print}' | head -n $NUM