次の構文は出力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
Kosalonandaの答えは、私が予想したものよりはるかに良かったです。しかし、私の構成の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
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