2011-11-02 42 views
5

我想要顯示的以下命令,其是作爲如下─的輸出:從兩個命令合併輸出到單個表與外殼腳本

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列多行,下一個命令顯示一列信息。

我想連接命令和concat的輸出,並顯示爲4列與多行。請建議。

+0

提供1和2的樣本數據輸出 – bua

+0

'/ dev/sd *'將匹配包含'/ dev/s'的所有行,後跟任意數目的'd',包括零。 (每次出現'dev/s'後面跟着任意數量的'd's。) –

回答

2

的幾點思考:

如果你已經得到了你的命令行awk的,你並不真正需要的grep。如果你想產生一行輸出爲每個設備

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}') 

我刪除了的grep命令,在awk可以很容易做到。

+0

謝謝,不錯的答案.. – arpita