다음 구문은 출력 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의 대답은 내가 예상했던 것보다 훨씬 좋았습니다. 하지만 내 구성 중 한 가지는 열이 너무 길면 자르는 것입니다. 나는 그의 솔루션을 사용하여 이를 달성할 수 있었습니다.
입력하다
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