вивести друк у 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)"

Ви отримали три відповіді на своє запитання, в яких усі стосуються запитань. Ви повинні бути набагато точнішими в тому, що ви хочете отримати конкретну відповідь.
Бернхард

Відповіді:


25

Для цього можна скористатися командою оболонки «стовпець», перевірте: 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

Мені потрібен був подальший контроль того, що було в якому стовпчику, тому я розділив стовпці на "*" і використав щось на зразок sed 's/^/ \* \*/g'для переміщення речей з першого стовпця в третій. Працював для мене частування.
ЗОБРАЖЕННЯ

28

Я рекомендую використовувати printf, наприклад:

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

Де %-30s означає резервувати 30 символів для вхідного аргументу рядка типу. В -позначає вирівнювання по лівому краю.


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 

Я дав тобі як не рішення. Тепер вам потрібно адаптувати свій код, щоб 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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.