将输出打印到 3 个单独的列

ADM*_*ADM 36 bash filenames columns printf

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)
Run Code Online (Sandbox Code Playgroud)

我如何优雅地将这 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)"
Run Code Online (Sandbox Code Playgroud)

等等 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)"
Run Code Online (Sandbox Code Playgroud)

Ber*_*ard 39

我建议使用printf,例如:

printf "%-30s | %-30s | %-30s" "$FILETIME" "$FILE" "$TOPLINE"
Run Code Online (Sandbox Code Playgroud)

where%-30s 表示为字符串类型的输入参数保留 30 个字符。的-表示左对齐。


QNi*_*bus 31

您可以使用column命令 which 在Linux 上util-linux包的一部分。它也可以在FreeBSDNetBSDOpenBSDDragonFly 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
Run Code Online (Sandbox Code Playgroud)