我想要顯示的以下命令,其是作爲如下─的輸出:從兩個命令合併輸出到單個表與外殼腳本
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列與多行。請建議。
我想要顯示的以下命令,其是作爲如下─的輸出:從兩個命令合併輸出到單個表與外殼腳本
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列與多行。請建議。
的幾點思考:
如果你已經得到了你的命令行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
作爲製表符。
它很酷,非常感謝! – arpita
做一個命名管道舉行的第一個命令的輸出:
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"
完成後不再需要管道。
感謝您的回覆.. – arpita
這是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可以很容易做到。
謝謝,不錯的答案.. – arpita
提供1和2的樣本數據輸出 – bua
'/ dev/sd *'將匹配包含'/ dev/s'的所有行,後跟任意數目的'd',包括零。 (每次出現'dev/s'後面跟着任意數量的'd's。) –