如何使用 printf 对齐字段

如何使用 printf 对齐字段

以下语法打印输出1

echo "$status" 

输出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

如何添加 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

答案1

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

会产生

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

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


在这个问题的前一个版本中,您使用sed和过滤进行了各种转换grep。这些很可能也可以在同一awk脚本中直接从源文件完成。或者,如果该文件是 JSON 文件(如您在注释中所述),则直接来自jq同一文件。

答案2

拘萨罗南达的回答比我想象的要好得多。不过,我的构造中有一件事是,如果列太长,则截断列。我能够用他的解决方案来实现这一点:

输入

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
component_name : ZOOKEEPER_SERVER_1234567890                      recovery_enabled : true

脚本

# /bin/bash -
#
INPUT_FILE=$HOME/Documents/scripts/shell/testing/input
IFS= mapfile -t STATUS_ARRAY < <(cat "$INPUT_FILE" | tr -s " ")
for line in "${STATUS_ARRAY[@]}"; do
    COMPONENT_NAME=$(echo "$line" | awk '{print $3}')
    if [[ "${#COMPONENT_NAME}" -gt "16" ]]; then
        echo "$line" | sed "s/${COMPONENT_NAME}/${COMPONENT_NAME:0:16}../" | awk '{printf("%s %s %-20s %20s %s %s\n", $1, $2, $3, $4, $5, $6)}'
    else
        echo "$line" | awk '{printf("%s %s %-20s %20s %s %s\n", $1, $2, $3, $4, $5, $6)}'
    fi
done

我的脚本从文件中提取输入,但您也可以通过echo $status | grep..或设置您的地图文件echo $status | jq..

输出

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
component_name : ZOOKEEPER_SERVER..       recovery_enabled : true

相关内容