hasil cetak menjadi 3 kolom terpisah

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)

bagaimana saya bisa dengan elegan mencetak informasi 5 file ini ke dalam kolom dengan header?

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

dan seterusnya 5 file

total files: $TOTALFILE

apakah ada cara mudah untuk mendapatkan apa yang saya inginkan?

Catatan: output ini saya dapatkan ketika gema setiap variabel

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
sumber
Anda mendapat tiga jawaban untuk pertanyaan Anda, yang semuanya membahas hal-hal yang Anda tanyakan. Anda harus lebih tepat dalam hal apa yang ingin Anda dapatkan jawaban spesifik.
Bernhard

Jawaban:

25

Anda dapat menggunakan perintah shell 'kolom' untuk itu, periksa: columnhalaman MAN .

Gabungkan ini dengan satu lingkaran dan Anda berada dalam bisnis, misalnya:

#!/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
sumber
Saya perlu kontrol lebih lanjut tentang apa yang ada di kolom mana, jadi saya membagi kolom pada '*' dan menggunakan sesuatu seperti sed 's/^/ \* \*/g'untuk memindahkan sesuatu dari kolom pertama ke kolom ketiga. Berhasil memperlakukan saya.
LOAS
28

Saya akan merekomendasikan menggunakan printf, misalnya:

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

Di mana %-30s berarti cadangan 30 karakter untuk argumen input tipe string. Yang -menunjukkan keselarasan kiri.

Bernhard
sumber
2

Saya akan pergi dengan lingkaran

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
sumber
Saya memberi Anda bagaimana bukan solusinya. Sekarang Anda perlu mengadaptasi kode Anda sehingga FILE FILENAME dan TOPLINE dirawat di dalam loop alih-alih melakukannya sebelum loop.
BitsOfNix
Anda perlu mengutip semua ekspansi Anda, atau ini akan mudah pecah.
Chris Down
2

Tidak yakin apakah ini yang Anda inginkan, "tempel" di unix dapat mengatur file dalam kolom, Anda mungkin perlu printf untuk memformat ulang sttdout. contoh:

kolom

Mereka Huyen
sumber
3
selamat datang ke U&L, tolong jangan memposting teks sebagai gambar, Anda dapat menyalin / menempel dengan mudah.
Archemar
1
Saya setuju - salin dan tempel. Saya belum bisa memilih, jadi komentar
KolonUK
1

@ qnimbus mungkin jawaban yang terbaik untuk sistem Linux tetapi pada Sun atau IBM (jika Anda tidak cukup beruntung untuk menggunakannya pada 2019) perintah ini mungkin tidak tersedia. Sebaliknya Anda bisa menggunakan prperintah untuk mendapatkan efek yang sama. Dari contoh di halaman tertaut Anda dapat menggunakan yang berikut:

pr -3 word.lst | qprt

untuk mencetak file word.lstdalam 3 kolom. Yang mengatakan, ini hanya bagian dari solusi untuk masalah Anda dan untuk sisanya saya tunduk pada jawaban @ qnimbus.

nonsensik
sumber