如何将多个指令的输出合并到一行输出?

本文介绍如何使用Shell中的join命令将来自不同命令的输出按列合并,特别是将ls和file命令的输出合并为一行,展示文件名、类型和详细属性。通过实例演示,包括使用sed和awk进行文本处理,以及column命令保持输出整洁。

有时候为了清晰会将多个指令的结果合并在一行中显示,比如查看文件及属性的命令 lsfile,

单独使用时
ls --full-time -h explain shell

-rwxr-xr-x 1 lufei www 7.5M 2019-07-09 14:23:48.041432487 +0800 1.mp4
-rw-r--r-- 1 lufei www 3.1M 2019-07-09 14:24:17.872506355 +0800 2.mp4
-rw-r-xr-- 1 lufei www 905K 2019-07-09 14:23:17.672339243 +0800 3.mp4

file *explain shell

1.mp4: ISO Media, MPEG v4 system, version 2
2.mp4: ISO Media, MPEG v4 system, version 1
3.mp4: ISO Media, MPEG v4 system, version 1

如何将两个指令合并一行显示那?

这时候 join 指令就排上用场了。用法参考 man joinjoin --helpjoin command

下面继续使用上面的例子来说明:

join -1 1 -2 5 <(file * | sed 's/[:,]//g') <(ls --full-time -h | awk '{print $5" "$6" "$7" "$8" "$9}') | column -texplain shell

1.mp4  ISO  Media  MPEG  v4  system  version  2  7.5M  2019-07-09  14:23:48.041432487  +0800
2.mp4  ISO  Media  MPEG  v4  system  version  1  3.1M  2019-07-09  14:24:17.872506355  +0800
3.mp4  ISO  Media  MPEG  v4  system  version  1  905K  2019-07-09  14:23:17.672339243  +0800

shell 命令解释可以使用在线工具 explainshell

file * | sed 's/[:,]//g'explain shellfile输出中的 :, 去除。

ls --full-time -h | awk '{print $5" "$6" "$7" "$8" "$9}'explain shell 仅保留ls输出中的 5~9 列。

column -texplain shell 保证列对齐。

join -1 1 -2 5 <(stream 1) <(stream2) 根据 stream 11 列作为 key(file name) 和 stream 25 列作为 key(file name) 来进行合并(文件名相同的合并为一列)。


Refer to Concatenate in bash the output of two commands without newline character

Combine two command output, refer to How to create a clean zip archive of a PHP git project without development files and folders?
{ git ls-tree -r master --name-only; find /vendor /node_modules -type f; }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值