awk: 필드 교체 시 출력 형식 유지

awk: 필드 교체 시 출력 형식 유지

awk에서 필드를 변경하면 전체 문자열($0)이 분할되어 OFS(기본값 <space>)를 사용하여 다시 형식화됩니다. 서식이 유지되도록 이 동작을 억제하거나 변경하려면 어떻게 해야 합니까?

예를 들어 df -h필드(열)가 하나 이상의 탭과 공백으로 구분된 테이블을 출력합니다. 모든 사용 값(필드 #5) >= 80%를 굵은 빨간색으로 인쇄하고 테이블 구조를 유지하고 싶습니다.

df -h | awk '{ if($5 ~ /^[8-9][0-9]/) $5="\033[1;31m"$5"\033[0m"; print $0 }'

문자열의 형식이 다시 지정되어 OFS=' '출력 테이블의 형식이 손상됩니다. 사용-v OFS='\t'

df -h | awk -v OFS='\t' '{ if($5 ~ /^[8-9][0-9]/) $5="\033[1;31m"$5"\033[0m"; print $0 }'

다음 열이 몇 칸 떨어진 곳에 탭 문자가 배치됩니다. 다음을 사용하여 각 줄의 형식을 강제로 변경합니다 else {$5=$5}.

df -h | awk -v OFS='\t' '{ if($5 ~ /^[8-9][0-9]/) {$5="\033[1;31m"$5"\033[0m"} else {$5=$5}; print $0 }'

열에 도달하기 위해 더 많은 탭과 공백이 필요한 경우 테이블 구조는 여전히 손상됩니다.

답변1

또 다른 트릭은 awk의 필드 구분자가 "단일 공백"을 필드 구분자로 사용하도록 하는 것입니다. 이를 정규식과 같은 정규식으로 정의하고 -F'( )'줄 끝에서 카운트다운되는 열에 대한 수정을 수행합니다. 단일 공백으로 구분되므로 끝에서 두 번째 열을 좋아요로 쉽게 잡을 수 있습니다.Use%$(NF-1)$(NF-1)

df -h \
| awk -F'( )' '$(NF-1) ~ /^([5-9][0-9]|100)/ { $(NF-1)="\033[1;31m"$(NF-1)"\033[0m" }1'

음, 다음과 같이 사용할 수도 있습니다 grep.

df -h |grep -P '([5-9][0-9]|100)%(?=\s+/)|' --color

답변2

gsub 함수를 사용하여 $0의 내용을 변경하면(특정 필드를 바꾸지 않음) 출력 형식이 다시 지정되지 않습니다.

df -h | awk '$5 ~ /[8-9][0-9]|100/ {gsub($5,"\033[1;31m"$5"\033[0m")}1'

이는 주어진 예에서 $5가 행에 정확히 한 번 나타나는 경우에만 작동합니다.

답변3

GNU awk에는 Split()에 대한 확장이 있습니다. 모든 필드를 하나의 배열에 저장하고 모든 실제 필드 구분 기호(사용된 RE와 일치)를 다른 배열에 저장합니다. 따라서 색상을 포함하도록 value[5]를 수정한 다음 루프에서 출력 행, 인터리브된 필드 및 실제 구분 기호를 재구성할 수 있습니다.

https://www.gnu.org/software/gawk/manual/gawk.html#String-Functions그리고 아래로 스크롤하여split()

관련 정보