вывод на печать в 3 отдельных столбца

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)

Как я могу элегантно распечатать эту информацию 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)"
ADM
источник
У вас есть три ответа на ваш вопрос, все из которых касаются того, что вы спрашиваете. Вы должны быть намного точнее в том, что вы хотите получить конкретный ответ.
Бернхард

Ответы:

25

Для этого вы можете использовать команду оболочки 'column', проверьте columnстраницу MAN .

Объедините это с циклом, и вы в бизнесе, например:

#!/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
источник
Мне нужен был дальнейший контроль над тем, что входит в какой столбец, поэтому я разделил столбцы на «*» и использовал что-то вроде sed 's/^/ \* \*/g'перемещения столбцов из первого столбца в третий. Получил удовольствие для меня.
LOAS
28

Я бы порекомендовал использовать printf, например:

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

Где %-30s означает зарезервировать 30 символов для входного аргумента типа string. В -обозначает выравнивание по левому краю.

Бернхард
источник
2

Я бы пошел с петлей

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
источник
Я дал вам, как не решение. Теперь вам нужно адаптировать свой код так, чтобы FILENAME FILE и TOPLINE выполнялись внутри цикла, а не перед циклом.
BitsOfNix
Вам нужно процитировать все ваши расширения, или это легко сломается.
Крис Даун
2

Если вы не уверены, что это то, что вам нужно, «вставка» в unix может упорядочить файлы в столбце, вам может понадобиться printf для переформатирования sttdout. пример:

колонка

Их хуен
источник
3
добро пожаловать в U & L, пожалуйста, не размещайте текст в виде изображения, вы можете легко скопировать / вставить.
Архемар
1
Я согласен - скопируйте и вставьте. Я пока не могу голосовать, так что комментируйте
KolonUK
1

Ответ @qnimbus, вероятно, лучше всего подходит для систем Linux, но в Sun или IBM (если вам не повезло использовать его в 2019 году) эта команда может быть недоступна. Вместо этого вы можете использовать prкоманду, чтобы получить тот же эффект. Из примеров на связанной странице вы можете использовать следующее:

pr -3 word.lst | qprt

распечатать файл word.lstв 3 столбца. Тем не менее, это только часть решения вашей проблемы, а в остальном я откладываю ответ @qnimbus.

nonsensickle
источник