imprima a saída para 3 colunas separadas

26
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)

como posso imprimir elegantemente essas informações de 5 arquivos em colunas com cabeçalhos?

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)"

e assim por diante 5 arquivos

total files: $TOTALFILE

Existe alguma maneira fácil de conseguir o que eu quero?

nota: esta saída recebi quando eco todas as variáveis

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)"
ADM
fonte
Você tem três respostas para a sua pergunta, que abordam tudo o que você faz. Você deve ser muito mais preciso no que deseja obter uma resposta específica.
Bernhard

Respostas:

25

Você pode usar o comando shell 'coluna' para isso, verifique: columnpágina MAN .

Combine isso com um loop e você estará no negócio, por exemplo:

#!/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
QNimbus
fonte
Eu precisava de mais controle sobre o que havia em qual coluna, então dividi as colunas em '*' e usei algo como sed 's/^/ \* \*/g'mudar as coisas da primeira coluna para a terceira. Trabalhou um prazer para mim.
LOAS
28

Eu recomendaria o uso printf, por exemplo:

printf "%-30s | %-30s | %-30s" "$FILETIME" "$FILE" "$TOPLINE"

Onde %-30s significa reservar 30 caracteres para o argumento de entrada do tipo string. Os -denota esquerda alinhamento.

Bernhard
fonte
2

Eu iria com um loop

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 
BitsOfNix
fonte
Eu dei a você como não a solução. Agora você precisa adaptar seu código para que o FILENAME FILE e TOPLINE sejam tratados dentro do loop, em vez de fazê-lo antes do loop.
BitsOfNix
Você precisa citar todas as suas expansões, ou isso será interrompido facilmente.
Chris Baixo
2

Não tenho certeza se é isso que você está fazendo, "colar" no unix pode organizar os arquivos na coluna; você pode precisar de printf para reformatar o sttdout. exemplo:

coluna

Eles Huyen
fonte
3
Bem-vindo ao U&L, por favor, não poste texto como imagem, você pode copiar / colar facilmente.
Archemar
11
Eu concordo - copie e cole. Não posso votar para baixo ainda, então comentar vez
KolonUK
1

A resposta do @qnimbus é provavelmente a melhor para sistemas Linux, mas na Sun ou IBM (se você não tiver a sorte de usar um em 2019), este comando pode não estar disponível. Em vez disso, você pode usar o prcomando para obter o mesmo efeito. Nos exemplos da página vinculada, você pode usar o seguinte:

pr -3 word.lst | qprt

para imprimir o arquivo word.lstem 3 colunas. Dito isto, isso é apenas parte de uma solução para o seu problema e, quanto ao resto, adiar para a resposta @qnimbus.

sem sentido
fonte