çıktıyı 3 ayrı sütuna yazdır


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)

Bu 5 dosya bilgisini başlıklarla birlikte sütunlara nasıl zarif bir şekilde yazdırabilirim?

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

ve benzeri 5 dosya

total files: $TOTALFILE

istediğimi elde etmenin kolay bir yolu var mı?

not: Bu çıktı her değişken yankılandığında aldım.

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

Sorunuza, sizin sorduğunuz her şeyi ele alan üç cevabınız var. Belirli bir cevap almak istediğinizde çok daha kesin olmalısınız.
Bernhard

Yanıtlar:


25

Bunun için 'column' shell komutunu kullanabilirsiniz, kontrol edin: columnMAN sayfası .

Bunu bir döngü ile birleştirin ve iştesiniz;

#!/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

Hangi sütunda ne olduğuna dair daha fazla kontrole ihtiyacım vardı, bu yüzden '*' sütunlarını sed 's/^/ \* \*/g'böldüm ve şeyleri ilk sütundan üçüncü haline kaydırmak için kullandım . Benim için bir tedavi çalıştı.
LOAS

28

printfÖrneğin kullanmanızı tavsiye ederim :

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

Nerede %-30s araçlar dize türünde giriş argüman için 30 karakter ayırmak. -O anlamına gelir hizalama ayrıldı.


2

Ben bir döngü ile giderdim

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 

Sana çözümü nasıl vermedim. Şimdi kodunuzu uyarlamak zorundasınız, böylece FILENAME FILE ve TOPLINE döngüden önce yapmak yerine döngü içinde özen gösterilecek.
BitsOfNix

Tüm genişletmelerinizden alıntı yapmanız gerekiyor, yoksa bu kolayca bozulur.
Chris Down,

2

Ne olduğundan emin değilsin, unix içindeki "paste" sütununda dosyaları düzenleyebilir, sttdout'u yeniden biçimlendirmek için printf gerekebilir. örnek:

kolon


3
U & L'ye welcomme, lütfen resim olarak metin göndermeyin, kolayca kopyala / yapıştır yapabilirsiniz.
Archemar

1
Katılıyorum - kopyala ve yapıştır. Henüz oy kullanamıyorum, bu yüzden yorum yapın
KolonUK 23:18

1

@qnimbus cevap muhtemelen Linux sistemler için en iyisidir ancak Sun veya IBM'de (2019'da birini kullanmak için yeterince şanslıysanız / şanslıysanız) bu komut kullanılamayabilir. Bunun yerine , aynı efekti elde etmek için prkomutu kullanabilirsiniz . Bağlantılı sayfadaki örneklerden aşağıdakileri kullanabilirsiniz:

pr -3 word.lst | qprt

dosyayı word.lst3 sütunda yazdırmak için . Bununla birlikte, bu sadece sorununuza ve @qnimbus cevabını ertelediğim için çözümün bir parçası.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.