【问题标题】:awk Removing space from outputawk 从输出中删除空间
【发布时间】:2012-11-23 00:35:05
【问题描述】:

我使用@"df -lH | grep \"/Volumes/*\" | awk '{$1=$2=$3=$4=$5=$6=$7=$8\"\"; print $0 }'" 获取本地安装的卷路径。但如果卷名包含两个或更多空格(Leopard 1)。 its(awk) 从输出中删除空间。

输出:

$df -lH

Filesystem     Size   Used  Avail Capacity  Mounted on
/dev/disk0s3    81G    61G    19G    77%    /
/dev/disk0s2    81G    72G   8.2G    90%    /Volumes/Leopard  1  2     3
/dev/disk0s4   158G    47G   111G    30%    /Volumes/Backup  

$ df -lH | grep "/Volumes/*"
/dev/disk0s2    81G    72G   8.2G    90%    /Volumes/Leopard  1  2     3
/dev/disk0s4   158G    47G   111G    30%    /Volumes/Backup  

$ df -lH | grep "/Volumes/*" | awk '{$1=$2=$3=$4=$5=""; print $0}'
     /Volumes/Leopard 1 2 3
     /Volumes/Backup

谁能帮帮我?

【问题讨论】:

  • 如果您可以发布df -lh的输出,这个问题会更容易

标签: objective-c macos unix awk


【解决方案1】:

默认情况下awk 的输出字段分隔符是一个空格。因此,您的 awk 命令的输出完全符合预期。要获得您想要的结果,您需要使用某种正则表达式,因此请尝试使用GNU awk

df -lH | awk '/Volumes/ { sub(/^(\S+\s+){5}/, ""); print }'

或者如果你有GNU sed:

df -lH | sed -nr '/Volumes/s/^(\S+\s+){5}//p'

结果:

/Volumes/Leopard  1  2     3
/Volumes/Backup  

编辑:

不幸的是,我看到了BSD/OSX awk doesn't support interval expressions。因此,最安全的方法是使用awk

df -lH | awk '/Volumes/ { sub(/^[^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +/, ""); print }'

sed:

df -lH | sed -n '/Volumes/s/^[^ ]\+ \+[^ ]\+ \+[^ ]\+ \+[^ ]\+ \+[^ ]\+ \+[^ ]\+ \+[^ ]\+ \+//p'

这也应该是高度便携的! HTH。

编辑:

对于 8 列的 Mac OSX 10.8,只需扩展正则表达式:

df -lH | awk '/Volumes/ { sub(/^[^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +/, ""); print }'

sed:

df -lH | sed -n '/Volumes/s/^[^ ]\+ \+[^ ]\+ \+[^ ]\+ \+[^ ]\+ \+[^ ]\+ \+//p'

【讨论】:

  • 第一个命令是给我 /dev/disk0s2 81G 72G 8.2G 90% /Volumes/Leopard 3 4 4 /dev/disk0s4 158G 47G 111G 30% /Volumes/Backup 输出
  • @ParagBafna:没问题;我也添加了sed 解决方案。祝你好运!
  • 您的解决方案适用于 10.5 到 10.7 Mac osx,但在 10.8 df 输出中包含 8 列。
  • @ParagBafna:为您添加了更新,希望它对您有用。祝你好运!
【解决方案2】:

使用mount 命令更容易,它的输出比df 和支持非贪婪匹配的perl 更简单:

:; mount | perl -pe 's/.*? on //;s/ \([^\)]*\)$//'
/
/dev
/Volumes/pro Time Machine 2
/Volumes/b
/Volumes/p
/net
/home

请注意,我确实在安装点安装了一个带有空格的卷。

【讨论】:

    【解决方案3】:
    df -lH | grep "/Volumes/*" | perl -pe 's/[^\%]*\%//g'
    

    如果你想在 awk 中做:

    df -lH | grep "/Volumes/*"|awk '{gsub(/[^\%]*\%/,"");print}'
    

    【讨论】:

    • 你永远不需要 grep 和 awk。 df -lH | awk '/\/Volumes\//{gsub(/[^%]*%/,"");print}'。我还删除了对您的 RE 没有任何作用的“*”,并去掉了 %s 之前的反斜杠,因为它们不是 RE 元字符,因此不需要转义。
    【解决方案4】:

    检查此命令的输出,可能会帮助您解析和获取信息

    mount | column -t
    

    【讨论】:

    • 不幸的是,column -t 没有多大帮助,因为最大的问题是如何处理包含空格的挂载点。
    猜你喜欢
    • 1970-01-01
    • 2013-06-09
    • 2017-03-25
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多