![使用 sed 和多个 awk 调用简化单行代码](https://linux22.com/image/101890/%E4%BD%BF%E7%94%A8%20sed%20%E5%92%8C%E5%A4%9A%E4%B8%AA%20awk%20%E8%B0%83%E7%94%A8%E7%AE%80%E5%8C%96%E5%8D%95%E8%A1%8C%E4%BB%A3%E7%A0%81.png)
我想简化这一行代码,只有当分区利用率大于或等于 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"'