首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >awk:在替换字段时保留输出格式

awk:在替换字段时保留输出格式
EN

Unix & Linux用户
提问于 2020-06-18 08:15:16
回答 3查看 802关注 0票数 3

当更改awk中的字段时,整个字符串($0)将被拆分,并使用OFS (默认)重新格式化。如何抑制或更改该行为,从而保留格式?

例如,df -h输出一个表,其中字段(列)由一个或多个制表符和空格分隔(S)。我希望所有使用值(字段#5) >= 80%以粗体红色打印,并保留表的结构:

代码语言:javascript
运行
复制
df -h | awk '{ if($5 ~ /^[8-9][0-9]/) $5="\033[1;31m"$5"\033[0m"; print $0 }'

该字符串将使用OFS=' '重新格式化,从而破坏输出表的格式。使用-v OFS='\t'

代码语言:javascript
运行
复制
df -h | awk -v OFS='\t' '{ if($5 ~ /^[8-9][0-9]/) $5="\033[1;31m"$5"\033[0m"; print $0 }'

将标签放在只需要几个空格才能到达下一列的地方。强制用else {$5=$5}重新格式化每一行:

代码语言:javascript
运行
复制
df -h | awk -v OFS='\t' '{ if($5 ~ /^[8-9][0-9]/) {$5="\033[1;31m"$5"\033[0m"} else {$5=$5}; print $0 }'

在需要更多制表符和空格才能到达列的情况下,仍然会破坏表结构。

EN

回答 3

Unix & Linux用户

回答已采纳

发布于 2020-06-18 08:57:03

另一个技巧是强制awk的字段分隔符使用“单空格”作为字段分隔符,方法是将其定义为regex (类似于-F'( )' ),并对Use%列执行从行尾计数到$(NF-1)的修改,因为最后两列总是用单个空格分隔,因此很容易捕获$(NF-1) like的第二列。

代码语言:javascript
运行
复制
df -h \
| awk -F'( )' '$(NF-1) ~ /^([5-9][0-9]|100)/ { $(NF-1)="\033[1;31m"$(NF-1)"\033[0m" }1'

您还可以使用grep,如下所示:

代码语言:javascript
运行
复制
df -h |grep -P '([5-9][0-9]|100)%(?=\s+/)|' --color
票数 2
EN

Unix & Linux用户

发布于 2020-06-18 08:34:10

当使用gsub函数更改$0的内容(因此不替换特定字段)时,输出将不会被重新调整:

代码语言:javascript
运行
复制
df -h | awk '$5 ~ /[8-9][0-9]|100/ {gsub($5,"\033[1;31m"$5"\033[0m")}1'

只有当$5只在行中出现一次时,这才有效。在给定的示例中,假定是这样的。

票数 2
EN

Unix & Linux用户

发布于 2020-06-18 16:33:49

GNU有一个扩展来拆分():它将将所有字段存储在一个数组中,而所有实际的字段分隔符(与使用的RE匹配)都存储在另一个数组中。因此,您可以将值固定为包含着色,然后在循环中重新构造输出线,将字段和实际分隔符交叉起来。

https://www.gnu.org/software/gawk/manual/gawk.html#String-Functions并向下滚动到split()

票数 -1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/593603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档