以下语法打印输出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 个字符。调整20
s 以适合您所需的格式。
在这个问题的前一个版本中,您使用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