使用 sed 和多个 awk 调用简化单行代码

使用 sed 和多个 awk 调用简化单行代码

我想简化这一行代码,只有当分区利用率大于或等于 60% 时才会打印。我还想在利用率值上附加一个百分号。

df -h | sed 's/%//g' | awk '{print $6,$5 }' | awk '{ if($2 >=60 ) print}' | column -t

我正在使用 BSD 变体并且我确实这样做不是安装了通用的 GNU 工具。

答案1

使用简单的 grep 会更容易一些。只有两列不会交换。

$ df -h|egrep -o "(100|[6-9].)% /.*$"
65% /
93% /home

答案2

既然这个已经被标记了awk,那么我们就来解决这个问题。第一个awk只是用于将第 6 列和第 5 列移动到第 1 列和第 2 列,因此我们可以摆脱它,只在第二个 awk 中使用第 6 列和第 5 列。

df -h | sed 's/%//g' | awk '{ if($5 >=60 ) print $6, $5 }' | column -t

我们也可以添加百分号

df -h | sed 's/%//g' | awk '{ if($5 >=60 ) print $6, $5 "%"}' | column -t

我们可以删除sed并在 awk 中执行此操作

df -h | awk '{gsub(/%/,""); if($5 >=60) print $6, $5 "%"}' | column -t

我们可以column -t通过让 awk 将值存储在数组中,然后在END数组上的语句循环中找出最长的名称并相应地打印来删除 a,但one liner在我看来,这不再是 a 了。

答案3

您可以将 替换sed为 并将tr -d "%"的两个调用合并awk为一个:

$ df -h | tr -d "%" | awk '$5 >= 60 { print $6, $5 }' | column -t

要获取百分比登录:

$ df -h | tr -d "%" | awk '$5 >= 60 { printf("%s %s%s\n", $6, $5, (NR>1?"%":"")) }' | column -t

Awk 脚本的第二个版本根据是否大于 1 有条件地将 a 添加%到第二个输出列。NR如果NR是 1,我们不添加 a,%因为那是标题行。

答案4

如果我们可以使用 Perl:

df | perl -nE 'say "$2\t$1"   if /(\d+)% (.*)/ and $1>60'

或者

df | perl -nE '/(\d+)% (.*)/ and $1>60 and  say "$2\t$1"'

相关内容