2011-11-02 34 views
5

Tôi muốn hiển thị đầu ra của các lệnh sau đó như liệt kê dưới đây:Kết hợp đầu ra từ hai lệnh vào bảng duy nhất với kịch bản shell

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

Comand thứ nhất hiển thị 3 cột có nhiều hàng và lệnh tiếp theo sẽ hiển thị một cột thông tin.

Tôi muốn concat đầu ra của cả lệnh và concat và hiển thị dưới dạng 4 cột có nhiều hàng. Xin đề nghị.

+0

cung cấp đầu ra dữ liệu mẫu của 1 và 2 – bua

+0

'/ dev/sd *' sẽ khớp với tất cả các dòng chứa '/ dev/s' theo sau là bất kỳ số' d ', bao gồm 0. (Mỗi lần xuất hiện 'dev/s' được theo sau bởi bất kỳ số' d'.) –

Trả lời

2

Một số suy nghĩ:

Nếu bạn đã gặp khó khăn trong dòng lệnh, bạn không thực sự cần grep. Vì vậy, bạn có thể làm điều này:

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

Nếu bạn muốn tạo ra một dòng đầu ra cho từng thiết bị, bạn có thể đường ống đầu ra của dòng lệnh đầu tiên của bạn thành một vòng lặp, và sau đó chạy smartctl bên trong vòng lặp, như thế này :

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 

Cờ -e để echo là cần thiết để nhận ra \t làm ký tự tab.

+0

Thật tuyệt vời, cảm ơn rất nhiều! – arpita

3

Thực hiện một đường ống đặt tên để giữ đầu ra lệnh đầu tiên của:

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

Sau đó sử dụng paste:

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

Lưu ý rằng awk '{print $2 }' có thể được đơn giản hóa để cut -d' ' -f2. Tạo đường ống được đặt tên tạm thời được thực hiện đúng cách hơn với

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

sau đó là đường ống không còn cần thiết nữa.

+0

Cảm ơn bạn đã trả lời .. – arpita

5

Đây là những gì paste dành cho. Sử dụng process substitution để làm cho vỏ điều trị các lệnh của bạn như tập tin:

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

Tôi đã gỡ bỏ các lệnh grep, awk mà có thể dễ dàng làm được.

+0

Cảm ơn, câu trả lời hay .. – arpita

Các vấn đề liên quan