arp*_*ita 5 unix linux shell awk
我想显示以下命令的输出,如下所示:
1)
mount | grep -i "/dev/sd*" | awk '{ print NR "\t" $1 "\t" $3 }'
Run Code Online (Sandbox Code Playgroud)
2)
/usr/sbin/smartctl -a /dev/sdb | grep Device: | awk '{print $2 }'
Run Code Online (Sandbox Code Playgroud)
第一个命令显示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}')
Run Code Online (Sandbox Code Playgroud)
我删除了grep命令,awk很容易做到.
一些想法:
如果您的命令行中已经有 awk,那么您实际上并不需要 grep。所以你可以这样做:
mount | awk '/\/dev\/sd/ {print NR, $1, $3}'
smartctl -a /dev/sdb | awk '/Device:/ {print $2}'
Run Code Online (Sandbox Code Playgroud)
如果要为每个设备生成一行输出,可以将第一个命令行的输出通过管道传输到循环中,然后在循环内运行 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
Run Code Online (Sandbox Code Playgroud)
-e要使其识别为制表符,需要使用回显标志\t。