2011-11-02 6 views
5

मैं निम्न कमांड के रूप में below- हैं के उत्पादन में प्रदर्शित करना चाहते हैं:खोल स्क्रिप्ट के साथ एकल तालिका में दो आदेशों से उत्पादन कम्बाइन

1)

mount | grep -i "/dev/sd*" | awk '{ print NR "\t" $1 "\t" $3 }' 

2)

/usr/sbin/smartctl -a /dev/sdb | grep Device: | awk '{print $2 }' 

पहला कॉमांड एकाधिक पंक्तियों के साथ 3 कॉलम प्रदर्शित करता है और अगला कमांड जानकारी के एक कॉलम को प्रदर्शित करता है।

मैं दोनों आदेशों और संगत दोनों के आउटपुट को जोड़ना चाहता हूं और एकाधिक पंक्तियों के साथ 4 कॉलम के रूप में प्रदर्शित करना चाहता हूं। कृपया सुझाव दे।

+0

1 और 2 – bua

+0

'/ dev/sd *' के नमूना डेटा आउटपुट प्रदान करते हैं, जिसमें '/ dev/s' वाली सभी पंक्तियों का मिलान होता है, इसके बाद शून्य सहित किसी भी संख्या में' d 'होता है। ('Dev/s' की प्रत्येक घटना के बाद किसी भी संख्या में' d'।) –

उत्तर

2

कुछ विचार:

आप पहले से ही अपने आदेश पंक्ति में AWK गया है, तो आप वास्तव में ग्रेप जरूरत नहीं है। आपको प्रत्येक डिवाइस के लिए उत्पादन की एक पंक्ति का उत्पादन करना चाहते हैं

mount | awk '/\/dev\/sd/ {print NR, $1, $3}' 
smartctl -a /dev/sdb | awk '/Device:/ {print $2}' 

, आप पाइप एक पाश में अपने पहले आदेश पंक्ति का उत्पादन कर सकते हैं, और उसके बाद इस तरह पाश अंदर smartctl चलाने के लिए,: तो आप ऐसा कर सकते हैं :

mount | awk '/\/dev\/sd/ {print NR, $1, $3}' | while read nr dev mntpt; do 
    echo -e "$nr\t$dev\t$mntpt\t$(smartctl -a $dev | awk '/Device:/ {print $2}')" 
done 

-e झंडा प्रतिध्वनित करने के लिए यह एक टैब वर्ण के रूप में \t पहचान बनाने के लिए आवश्यक है।

+0

इसका ठंडा, बहुत बहुत धन्यवाद! – arpita

3

पहले आदेश के उत्पादन धारण करने के लिए एक नामित पाइप बनाओ:

mkfifo mount_output 
mount | grep -i "/dev/sd.*" | awk '{ print NR "\t" $1 "\t" $3 }' > mount_output & 

फिर paste का उपयोग करें:

/usr/sbin/smartctl -a /dev/sdb | grep Device: | awk '{print $2 }' | paste foo - 

ध्यान दें कि awk '{print $2 }'cut -d' ' -f2 को सरल किया जा सकता। बनाना एक अस्थायी नामित पाइप अधिक ठीक से पाइप अब जरूरत है, जब

tempd=`mktemp -d` 
mkfifo ${tempd}/mount_output 

तो rm -rf "$tempd" साथ किया जाता है।

+0

आपके उत्तर के लिए धन्यवाद .. – arpita

5

यह paste है। खोल फ़ाइलों की तरह अपने आदेशों का इलाज कराने के लिए process substitution का उपयोग करें:

paste <(mount | awk 'tolower($0) ~ /\/dev\/sd*/ {print NR "\t" $1 "\t" $3}') \ 
     <(/usr/sbin/smartctl -a /dev/sdb | awk '/Device:/ {print $2}') 

मैं ग्रेप आदेशों, जो AWK आसानी से कर सकते हटा दिया।

+0

धन्यवाद, अच्छा जवाब .. – arpita

संबंधित मुद्दे