đầu ra in ra 3 cột riêng biệt


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)

Làm thế nào tôi có thể in trang này ra 5 thông tin tập tin thành các cột với các tiêu đề?

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

và 5 tập tin

total files: $TOTALFILE

Có cách nào dễ dàng để có được những gì tôi muốn?

lưu ý: đầu ra này tôi nhận được khi lặp lại mọi biến

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

Bạn có ba câu trả lời cho câu hỏi của bạn, tất cả đều giải quyết những điều bạn yêu cầu. Bạn nên chính xác hơn nhiều trong những gì bạn muốn nhận được một câu trả lời cụ thể.
Bernhard

Câu trả lời:


25

Bạn có thể sử dụng lệnh shell 'cột' cho điều đó, kiểm tra: columntrang MAN .

Kết hợp điều này với một vòng lặp và bạn đang kinh doanh, ví dụ:

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

Tôi cần kiểm soát thêm về những gì đã đi vào cột nào, vì vậy tôi chia các cột trên '*' và sử dụng một cái gì đó như sed 's/^/ \* \*/g'để chuyển mọi thứ từ cột đầu tiên sang cột thứ ba. Làm việc một điều trị cho tôi.
LOAS

28

Tôi muốn giới thiệu sử dụng printf, ví dụ:

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

Trong đó %-30s có nghĩa là dự trữ 30 ký tự cho đối số đầu vào của chuỗi loại. Các -biểu thị căn lề trái.


2

Tôi sẽ đi với một vòng lặp aa

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 

Tôi đã cho bạn làm thế nào không phải là giải pháp. Bây giờ bạn cần điều chỉnh mã của mình để TẬP TIN TẬP TIN và TOPLINE được chăm sóc bên trong vòng lặp thay vì thực hiện trước vòng lặp.
BitsOfNix

Bạn cần trích dẫn tất cả các mở rộng của bạn, nếu không điều này sẽ dễ dàng bị phá vỡ.
Chris Xuống

2

Không chắc chắn nếu đây là những gì bạn đang làm, "dán" trong unix có thể sắp xếp các tệp trong cột, bạn có thể cần printf để định dạng lại sttdout. thí dụ:

cột


3
Chào mừng bạn đến với U & L, vui lòng không đăng văn bản dưới dạng hình ảnh, bạn có thể sao chép / dán dễ dàng.
Archemar

1
Tôi đồng ý - sao chép và dán. Tôi chưa thể bỏ phiếu xuống, vì vậy hãy bình luận thay vào đó
KolonUK

1

Câu trả lời @qnimbus có lẽ là tốt nhất cho các hệ thống Linux nhưng trên Sun hoặc IBM (nếu bạn không đủ may mắn để sử dụng một trong năm 2019) thì lệnh này có thể không khả dụng. Thay vào đó bạn có thể sử dụng prlệnh để có được hiệu ứng tương tự. Từ các ví dụ trên trang được liên kết, bạn có thể sử dụng như sau:

pr -3 word.lst | qprt

để in tập tin word.lsttrong 3 cột. Điều đó nói rằng, đây chỉ là một phần của một giải pháp cho vấn đề của bạn và phần còn lại tôi trì hoãn câu trả lời @qnimbus.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.