следующий синтаксис print the output1 down
echo "$status"
output1:
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
Ответ Кусалананды намного лучше, чем я думал. Одна вещь, которую я имел в своей конструкции, — это условие для усечения столбца, если он слишком длинный. Я смог реализовать это с помощью его решения :
.ВХОД
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
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
из того же файла.