web-dev-qa-db-ja.com

Bashシェルスクリプトの出力の配置

私のスクリプト:

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
31
pijaaa

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および 他のほとんどのバイト数)として文字列の右側にスペースを埋め込む形式指定ですshells/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
_

(ここでは、30文字ごとにタブストップでタブ文字(_\t_)を展開しています)

または BSD column または POSIX pr

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

(ここでは、2つの36列幅の列に出力します(ページ幅をデフォルトの72から変更するには、_-w_オプションを参照してください))。

または BSD rs

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

columnと同様に、すべての入力を読み取るまで出力を開始しません)。

または GNU columns

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

zshには、文字列パディング用のいくつかのパラメーター展開フラグもあります。${(l:15:)hostname} forleftpaddingおよび${(r:15:)hostname} forrightpadding(with truncation)。 プロンプト展開(プロンプトまたは_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`]<'_のように)、コマンドインジェクションの脆弱性を構成します

47

単に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
37
RomanPerekhrest

スクリプトを更新して、列にタブ移動する\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

@Romanよりも優れた表示

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

それから加えて \t各行でそれを列に分割します。

0
Emidomenge