MYPATH=/var/www/html/error_logs/
TOTALFILE=$(ls $MYPATH* | wc -l)
FILETIME=$(stat --format=%y $MYPATH* | head -5 | cut -d'.' -f1)
FILE=$(ls -1tcr $MYPATH* | head -5 | rev | cut -d/ -f1 | rev)
TOPLINE=$(head -1 $MYPATH* | grep -Po '".*?"' | head -5)
この5つの情報ファイルをヘッダー付きの列にエレガントに印刷するにはどうすればよいですか?
FILE CREATED TIME | FILE NAME | ERROR HEADER
---------------------------------------------
$FILETIME | $FILE | $TOPLINE
2012-11-29 11:27:45 | 684939947465 | "SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)"
そして5つのファイルすべてについても同様です。
total files: $TOTALFILE
私が欲しいものを簡単に得る方法はありますか?
各変数をエコーするときに得られる結果は次のとおりです。
2012-11-29 11:27:45 2012-11-29 11:27:41 2012-11-28 23:33:01 2012-11-26 10:23:37 2012-11-19 22:49:36
684939947465 1313307654813 1311411049509 1234980770182 354797376843
"SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)" "SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)" "Connection to localhost:6379 failed: Connection refused (111)" "An error occurred connecting to Redis." "SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)"
答え1
使用することをお勧めしますprintf
、例えば:
printf "%-30s | %-30s | %-30s" "$FILETIME" "$FILE" "$TOPLINE"
これは%-30s
、文字列型の入力パラメータに30文字が予約されていることを示します。左揃えを示します-
。
答え2
column
次のコマンドを使用できますLinuxの一部ですユーティリティLinuxパック。以下でも見つけることができます。FreeBSD、ネットワークBSD、オープンBSDそしてトンボBSD。
これをループと組み合わせると、作業の準備が完了します。たとえば、次のようになります。
#!/bin/sh
MYPATH=/
TOTALFILE=$(ls $MYPATH/* | wc -l)
FILE=$(ls -1tcr $MYPATH/* | head -5 | rev | cut -d/ -f1 | rev)
declare -a FILES
declare -a FILETIME
OUTPUT="FILENAME CREATED TIME ERROR_HEADER\n\n------------------------------ ----------------------------- ----------------------------------- ------$"
for i in $MYPATH/*;
do
FILES[${#FILES[@]}]="$i"
FILETIME[${#FILETIME[@]}]=$(stat --format=%y $i | head -5 | cut -d'.' -f1)
TOPLINE=$(head -1 $i | grep -Po '".*?"' | head -5)
OUTPUT="$OUTPUT\n${FILES[${#FILES[@]}-1]} ${FILETIME[${#FILETIME[@]}-1]} $TOPLINE\n"
done
echo -ne $OUTPUT | column -t
答え3
私はaaループを選択します
printf " %-20s | %-20s | %-20s\n " FILE\ CREATED\ TIME FILE\ NAME ERROR\ HEAD
for i in "$MYPATH"/*
do
printf "%-20s | %-20s | %-20s\n " $FILENAME $FILE $TOPLINE
done
printf "Total Files: %s" $TOTALFILES
答え4
@qnimbusの答えはおそらくLinuxシステムに最適ですが、SunまたはIBMでは可能です。(2019年に使用しなかったか運が良かった場合)このコマンドを使用できない可能性があります。代わりに、次のものを使用できます。pr
注文する同じ効果を得るために。リンクされたページの例では、次のものを使用できます。
pr -3 word.lst | qprt
word.lst
ファイルを3列に印刷します。つまり、これは問題に対する解決策の一部に過ぎず、残りは@qnimbusの答えに従います。