배쉬 쉘 스크립트 출력 정렬


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그래서 (문자 수의 길이와 우측 공백 문자열을 패딩하는 포맷 규격 인 zshfish가장 다른 셸 / 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.