如何将字段与 printf 对齐

yae*_*ael -1 linux awk printf

以下语法将 output1 打印下来

echo "$status" 
Run Code Online (Sandbox Code Playgroud)

输出 1:

    component_name : TEZ_CLIENT     recovery_enabled : true
    component_name : WEBHCAT_SERVER         recovery_enabled : true
    component_name : YARN_CLIENT            recovery_enabled : true
    component_name : ZKFC           recovery_enabled : true
    component_name : ZOOKEEPER_CLIENT             recovery_enabled : true
    component_name : ZOOKEEPER_SERVER                      recovery_enabled : true
Run Code Online (Sandbox Code Playgroud)

如何添加 printf 语法以获得以下几行:

预期产出

    component_name : TEZ_CLIENT             recovery_enabled : true
    component_name : WEBHCAT_SERVER         recovery_enabled : true
    component_name : YARN_CLIENT            recovery_enabled : true
    component_name : ZKFC                   recovery_enabled : true
    component_name : ZOOKEEPER_CLIENT       recovery_enabled : true
    component_name : ZOOKEEPER_SERVER       recovery_enabled : true
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 5

echo "$status" | awk '{printf("%s %s %-20s %20s %s %s\n", $1, $2, $3, $4, $5, $6)}'
Run Code Online (Sandbox Code Playgroud)

会产生

component_name : TEZ_CLIENT               recovery_enabled : true
component_name : WEBHCAT_SERVER           recovery_enabled : true
component_name : YARN_CLIENT              recovery_enabled : true
component_name : ZKFC                     recovery_enabled : true
component_name : ZOOKEEPER_CLIENT         recovery_enabled : true
component_name : ZOOKEEPER_SERVER         recovery_enabled : true
Run Code Online (Sandbox Code Playgroud)

%-20s格式将为左对齐字符串%20s保留 20 个字符,而为右对齐字符串保留 20 个字符。调整20s 以适合您所需的格式。


在这个问题的前世,你不得不使用各种转换sed和滤波用grep。这些很可能也可以在同一个awk脚本中直接从源文件中完成。或者,如果文件是 JSON 文件(如您在评论中所说),则直接jq来自同一个文件。