2011-11-02 23 views
5

I desea visualizar la salida de los comandos siguientes, que son como continuación-:Combinar de salida a partir de dos comandos en una sola mesa con shell 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 }' 

El 1er comando muestra 3 columnas con múltiples filas y el siguiente comando muestra una columna de información.

Quiero concaturar las salidas de ambos comandos y concat y mostrar como 4 columnas con múltiples filas. Por favor recomiende.

+0

proporcionan salidas de datos de muestra de 1 y 2 – bua

+0

'/ dev/sd *' coincidirá con todas las líneas que contengan '/ dev/s' seguidas de cualquier número de' d's, incluido el cero. (Cada aparición de 'dev/s' es seguida por cualquier cantidad de' d's.) –

Respuesta

2

Algunos pensamientos:

Si ya tienes AWK en su línea de comandos, que realmente no necesitan grep. Así que usted puede hacer esto:

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

Si se quiere producir una línea de salida para cada dispositivo, se puede canalizar la salida de su primera línea de comandos en un bucle y ejecute smartctl dentro del bucle, como este :

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 bandera -e hacer eco es necesario para hacerla reconocer \t como un carácter de tabulación.

+0

¡Es genial, muchas gracias! – arpita

3

Hacer una tubería con nombre para celebrar la salida del primer comando:

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

A continuación, utilice paste:

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

Tenga en cuenta que awk '{print $2 }' se puede simplificar a cut -d' ' -f2. Realización de una tubería con nombre temporal es más apropiado hacerlo con

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

continuación rm -rf "$tempd" cuando el tubo ya no es necesaria.

+0

Gracias por su respuesta. – arpita

5

Esto es lo que paste es para. process substitution utilizar para hacer la cáscara de tratar a sus órdenes como archivos:

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

me quitó los comandos grep, que awk puede hacer fácilmente.

+0

Gracias, buena respuesta .. – arpita

Cuestiones relacionadas