当更改awk中的字段时,整个字符串($0)将被拆分,并使用OFS (默认)重新格式化。如何抑制或更改该行为,从而保留格式?
例如,df -h
输出一个表,其中字段(列)由一个或多个制表符和空格分隔(S)。我希望所有使用值(字段#5) >= 80%以粗体红色打印,并保留表的结构:
df -h | awk '{ if($5 ~ /^[8-9][0-9]/) $5="\033[1;31m"$5"\033[0m"; print $0 }'
该字符串将使用OFS=' '
重新格式化,从而破坏输出表的格式。使用-v OFS='\t'
df -h | awk -v OFS='\t' '{ if($5 ~ /^[8-9][0-9]/) $5="\033[1;31m"$5"\033[0m"; print $0 }'
将标签放在只需要几个空格才能到达下一列的地方。强制用else {$5=$5}
重新格式化每一行:
df -h | awk -v OFS='\t' '{ if($5 ~ /^[8-9][0-9]/) {$5="\033[1;31m"$5"\033[0m"} else {$5=$5}; print $0 }'
在需要更多制表符和空格才能到达列的情况下,仍然会破坏表结构。
发布于 2020-06-18 08:57:03
另一个技巧是强制awk的字段分隔符使用“单空格”作为字段分隔符,方法是将其定义为regex (类似于-F'( )'
),并对Use%
列执行从行尾计数到$(NF-1)
的修改,因为最后两列总是用单个空格分隔,因此很容易捕获$(NF-1)
like的第二列。
df -h \
| awk -F'( )' '$(NF-1) ~ /^([5-9][0-9]|100)/ { $(NF-1)="\033[1;31m"$(NF-1)"\033[0m" }1'
您还可以使用grep
,如下所示:
df -h |grep -P '([5-9][0-9]|100)%(?=\s+/)|' --color
发布于 2020-06-18 08:34:10
当使用gsub函数更改$0的内容(因此不替换特定字段)时,输出将不会被重新调整:
df -h | awk '$5 ~ /[8-9][0-9]|100/ {gsub($5,"\033[1;31m"$5"\033[0m")}1'
只有当$5只在行中出现一次时,这才有效。在给定的示例中,假定是这样的。
发布于 2020-06-18 16:33:49
GNU有一个扩展来拆分():它将将所有字段存储在一个数组中,而所有实际的字段分隔符(与使用的RE匹配)都存储在另一个数组中。因此,您可以将值固定为包含着色,然后在循环中重新构造输出线,将字段和实际分隔符交叉起来。
https://www.gnu.org/software/gawk/manual/gawk.html#String-Functions并向下滚动到split()
https://unix.stackexchange.com/questions/593603
复制相似问题