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

आप इसके लिए शेल कमांड 'कॉलम' का उपयोग कर सकते हैं: चेक करें: columnMAN पेज

इसे एक लूप के साथ मिलाएं और आप व्यवसाय में हैं, जैसे:

#!/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'पहले कॉलम से तीसरे में चीजों को स्थानांतरित करने के लिए कुछ का उपयोग किया । मेरे लिए एक इलाज का काम किया।
LOAS

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 को लूप के अंदर रखा जाए।
बिट्सऑफनिक्स

आपको अपने सभी विस्तार को उद्धृत करने की आवश्यकता है, या यह आसानी से टूट जाएगा।
क्रिस डाउन

2

निश्चित नहीं है कि यह क्या है, आप "पेस्ट" कर सकते हैं, यूनिक्स में "कॉलम" फाइल को कॉलम में व्यवस्थित कर सकता है, स्टैडआउट को सुधारने के लिए आपको प्रिंटफ की आवश्यकता हो सकती है। उदाहरण:

स्तंभ


3
U & L के लिए welcomme, कृपया छवि के रूप में पाठ पोस्ट न करें, आप आसानी से कॉपी / पेस्ट कर सकते हैं।
hem१17

1
मैं सहमत हूं - कॉपी और पेस्ट। मैं अभी तक वोट नहीं कर सकता, इसलिए इसके बजाय टिप्पणी करें
KolonUK

1

@qnimbus का उत्तर शायद लिनक्स सिस्टम के लिए सबसे अच्छा है, लेकिन सन या आईबीएम पर (यदि आप 2019 में एक का उपयोग करने के लिए पर्याप्त / भाग्यशाली हैं) तो यह कमांड उपलब्ध नहीं हो सकता है। इसके बजाय आप समान प्रभाव प्राप्त करने के लिए prकमांड का उपयोग कर सकते हैं । लिंक किए गए पृष्ठ के उदाहरणों से आप निम्नलिखित का उपयोग कर सकते हैं:

pr -3 word.lst | qprt

फ़ाइल word.lstको 3 कॉलम में प्रिंट करने के लिए । उस ने कहा, यह आपकी समस्या के समाधान का एक हिस्सा है और बाकी के लिए मैं @qnimbus जवाब देना चाहता हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.