2011-11-02 16 views
5

voglio visualizzare l'output dei seguenti comandi, come sotto-:Combinare uscita di due comandi in tabella singola script

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

Il 1 ° COMAND visualizza 3 colonne con più righe e le seguente comando visualizza uno una colonna di informazioni.

voglio concat le uscite di entrambi i comandi e concat e display 4 colonne con più righe. Si prega di suggerire.

+0

forniscono uscite dati campione di 1 e 2 – bua

+0

'/ dev/sd *' corrisponderà linee contenenti '/ dev/s' seguita da un numero qualsiasi di' d's, compreso lo zero. (Ogni occorrenza di 'dev/s' è seguito da un qualsiasi numero di' d's.) –

risposta

2

Alcuni pensieri:

Se hai già awk nella riga di comando, è in realtà non hanno bisogno di grep. Così si può fare questo:

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

Se si vuole produrre una riga di output per ogni dispositivo, è possibile reindirizzare l'output della vostra prima linea di comando in un ciclo, e quindi eseguire smartctl all'interno del ciclo, come questo :

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 

La -e bandiera eco occorre farlo riconoscere \t come un carattere di tabulazione.

+0

il suo fresco, grazie mille! – arpita

3

Fai un named pipe per tenere l'uscita del primo comando:

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

Quindi utilizzare paste:

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

noti che awk '{print $2 }' può essere semplificata cut -d' ' -f2. Fare un temporanea named pipe è più propriamente fatto con

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

poi rm -rf "$tempd" quando non è più necessario il tubo.

+0

Grazie per la risposta .. – arpita

5

Questo è ciò che è per paste. Utilizzare process substitution per rendere la shell trattare i comandi come file:

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

ho rimosso i comandi grep, che awk può facilmente fare.

+0

Grazie, bella risposta .. – arpita