çı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.