Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用shell脚本将两个命令的输出合并到单个表中_Linux_Shell_Unix_Awk - Fatal编程技术网

Linux 使用shell脚本将两个命令的输出合并到单个表中

Linux 使用shell脚本将两个命令的输出合并到单个表中,linux,shell,unix,awk,Linux,Shell,Unix,Awk,我想显示以下命令的输出,如下-: (一) (二) 第一个命令命令显示3列多行,下一个命令显示一列信息 我希望concat命令和concat的输出,并显示为4列多行。请建议。一些想法: 如果您的命令行中已经有了awk,那么就不需要grep了。所以你可以这样做: mount | awk '/\/dev\/sd/ {print NR, $1, $3}' smartctl -a /dev/sdb | awk '/Device:/ {print $2}' 如果要为每个设备生成一行输出,可以将第一个命令行

我想显示以下命令的输出,如下-:

(一)

(二)

第一个命令命令显示3列多行,下一个命令显示一列信息

我希望concat命令和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

要使echo将
\t
识别为制表符,必须使用
-e
标志。制作一个命名管道以保存第一个命令的输出:

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

/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”

这就是粘贴的目的。用于使shell将命令视为文件:

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

paste提供1和2的样本数据输出
/dev/sd*
将匹配包含
/dev/s
的所有行,后跟任意数量的
d
s,包括零。(每次出现
dev/s
后都会出现任意数量的
d
s。)
tempd=`mktemp -d`
mkfifo ${tempd}/mount_output
paste <(mount | awk 'tolower($0) ~ /\/dev\/sd*/ {print NR "\t" $1 "\t" $3}') \
      <(/usr/sbin/smartctl -a /dev/sdb | awk '/Device:/ {print $2}')