배쉬 쉘 스크립트 출력 정렬


28

내 스크립트 :

date
echo -e "${YELLOW}Network check${NC}\n\n"

while read hostname
do

ping -c 1 "$hostname" > /dev/null 2>&1 &&

echo -e "Network $hostname : ${GREEN}Online${NC}" ||
echo -e "${GRAY}Network $hostname${NC} : ${RED}Offline${NC}"

done < list.txt
        sleep 30
clear
done

다음과 같은 정보를 출력하고 있습니다.

Network 10.x.xx.xxx : Online   
Network 10.x.xx.xxx : Offline   
Network 10.x.xx.xxx : Offline   
Network 10.x.xx.xxx : Offline   
Network 10.x.xx.x : Online   
Network 139.xxx.x.x : Online   
Network 208.xx.xxx.xxx : Online   
Network 193.xxx.xxx.x : Online

다음과 같은 것을 얻기 위해 정리하고 싶습니다.

Network 10.x.xx.xxx       : Online  
Network 10.x.xx.xxx       : Offline   
Network 10.x.xx.xxx       : Offline    
Network 10.x.xx.x         : Online    
Network 139.xxx.x.x       : Online  
Network 208.xx.xxx.xxx    : Online    
Network 193.xxx.xxx.x     : Online  
Network 193.xxx.xxx.xxx   : Offline

답변:


44

printf출력 형식을 지정하는 데 사용 합니다 ( 보다 이식성이 뛰어납니다echo ). 또한 색상 이스케이프 시퀀스의 실제 값을로 확장해야하는 형식으로 저장하는 대신 저장합니다 echo.

RED=$(tput setaf 1) GREEN=$(tput setaf 2) YELLOW=$(tput setaf 3)
NC=$(tput sgr0) 
online="${GREEN}online$NC" offline="${RED}offline$NC"

ping -c 1 "$hostname" > /dev/null 2>&1 && state=$online || state=$offline
printf 'Network %-15s: %s\n' "$hostname" "$state"

%-15s그래서 (문자 수의 길이와 우측 공백 문자열을 패딩하는 포맷 규격 인 zsh와 fish와 가장 다른 셸 / printf와 바이트 이상 (15)이 될).

$ printf '|%-4s|\n' a ab abc abcd abcde
|a   |
|ab  |
|abc |
|abcd|
|abcde|
 printf '|%4s|\n' a ab abc abcd abcde
|   a|
|  ab|
| abc|
|abcd|
|abcde|

잘림으로 :

$ printf '|%.4s|\n' a ab abc abcd abcde
|a|
|ab|
|abc|
|abcd|
|abcd|
$ printf '|%4.4s|\n' a ab abc abcd abcde
|   a|
|  ab|
| abc|
|abcd|
|abcd|
$ printf '|%-4.4s|\n' a ab abc abcd abcde
|a   |
|ab  |
|abc |
|abcd|
|abcd|

열에서 텍스트를 형식화하는 다른 유틸리티에는 POSIX가 있습니다expand .

printf 'Network %s\t: %s\n' "$hostname" "$state" | expand -t 30

(여기서 \t탭으로 탭 문자 ( )를 확장하면 30 열마다 중지됨)

또는 BSDcolumn 또는 POSIXpr :

printf 'Network %s\n: %s\n' "$hostname" "$state" | pr -at2

(여기서는 36 열 너비의 열 2 개로 출력 -w합니다 (페이지 너비를 기본값 72에서 변경하는 옵션 참조 )).

또는 BSDrs :

{
   while...
      printf 'Network %s\n: %s\n' "$hostname" "$state"
   done
} | rs -e 0 2

( column모든 입력을 읽을 때까지 출력을 시작하지 않습니다).

또는 GNUcolumns :

printf 'Network %s\n: %s\n' "$hostname" "$state" | columns -w 25 -c 2

zsh: 또한 문자열 패딩에 대한 몇 가지 매개 변수 확장 플래그가 ${(l:15:)hostname}대한 왼쪽 패딩 ${(r:15:)hostname}에 대한 권리 (절단 포함) 패딩을. 에서 프롬프트 확장 (프롬프트 나처럼 print -P나와 매개 변수 확장 활성화와 같은 %플래그), 또한 지원하는 %F{green}컬러 출력을 위해, 그래서 당신은 할 수 있습니다 :

online='%F{green}online%f'
printf '%s\n' "Network ${(r:15:)hostname}: ${(%)online}"

또는:

print -rP "Network ${(r:15:)hostname}: $online"

의 내용이 있지만 $hostname다음도의 내용이 경우 명령 주입 취약점을 구성하는 것입니다 확장, 메시지를 표시하는 대상이 될 것입니다 $hostname귀하의 통제하에 아니었다을 (처럼 hostname='%<a[`reboot`]<')


35

column명령으로 간단히 :

yourscript.sh | column -t

출력 :

Network  10.x.xx.xxx     :  Online
Network  10.x.xx.xxx     :  Offline
Network  10.x.xx.xxx     :  Offline
Network  10.x.xx.xxx     :  Offline
Network  10.x.xx.x       :  Online
Network  139.xxx.x.x     :  Online
Network  208.xx.xxx.xxx  :  Online
Network  193.xxx.xxx.x   :  Online

바보 같은 질문에 미안하지만, 그 명령을 어디에 두어야합니까?
— pijaaa

@pijaaa, 내 업데이트 참조, 스크립트 출력이 포함 된 파이프
— RomanPerekhrest

9
그 주 column(A BSD 명령도 리눅스로 포팅과 GNU와 혼동되지 않는 일부 배포판에 기본적으로 발견을 columns그 기반으로 열의 폭을 계산하기 위해 필요로 뭔가를 출력 시작하기 전에 전체 입력을 읽을 필요합니다) 가장 넓은 것.
— Stéphane Chazelas

3

세트 번호를 \t(탭) 에 삽입 하여 열로 탭 아웃하려는 스크립트를 업데이트하십시오 .

다음과 비슷한 것을 출력하면 필요한 정렬을 얻을 수 있습니다.

Network 10.x.xx.xxx\t: Online   
Network 10.x.xx.xxx\t: Offline   
Network 10.x.xx.xxx\t: Offline   
Network 10.x.xx.xxx\t: Offline   
Network 10.x.xx.x\t: Online   
Network 139.xxx.x.x\t: Online   
Network 208.xx.xxx.xxx\t: Online   
Network 193.xxx.xxx.x\t: Online

3
문제의 스크립트를 기반으로 간단한 예제를 추가하는 것이
— 좋습니다

@StephenKitt ty Stephen, 나는 그것을 한 줄 이상으로 만드는 방법을 알아 내려고 노력 중이었습니다.
— djsmiley2k

3
기본 탭을 사용하면 8 열마다 printf 'Network %s\t: Online\n' 8.8.8.8 192.168.122.123올바르게 정렬되지 않습니다. expand내 대답에 표시된 것처럼 다른 탭 정지로 탭을 확장 하여 문제 를 해결할 수 있습니다 .
— Stéphane Chazelas

틱 아이콘을 클릭하여 답변으로 자유롭게 수락하십시오.
— djsmiley2k

0

@Roman보다 더 잘 표시하려면

yourscript.sh | column -t -s $'\t'

그런 다음 \t각 줄을 추가 하여 열로 나눕니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.