[英]Combine output from two commands into single table with 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 }'
第一个命令显示3列多行,下一个命令显示一列信息。
我想连接命令和concat的输出,并显示为4列多行。 请建议。
这就是paste
的用途。 使用进程替换使shell将命令视为文件:
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很容易做到。
创建一个命名管道来保存第一个命令的输出:
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"
。
一些想法:
如果你已经在命令行中使用了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
标志要使echo识别\\t
作为制表符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.