[英]Using a command's output as `paste` input without temporary files
我是bash脚本的新手,我有一个非常新手的问题。
如何将以下3条命令的输出串联到一行代码中?
下面的行获取当前系统日期减去1天(24小时),大于当前日期-1天的任何文件都将写入redir_bbtrm_files.txt
awk -v date="$(date -d "-1 day" +"%Y-%m-%d %H:%M")" '$3$4<date' sftp_bbtrm_files.txt \
> redir_bbtrm_files.txt
下面的行从redir_bbtrm_files.txt打印日期,时间和文件名,并将输出重定向到bbtrm_filenames_n_time.txt
awk '{print $3,$4,$5}' redir_bbtrm_files.txt > bbtrm_filenames_n_time.txt
下面的行附加了文件名,时间和参考号。 email_final_bbtrm_output.txt是通知中的输出
paste -d ' ' bbtrm_filenames_n_time.txt bbtrm_ref.txt > email_final_bbtrm_output.txt
基本上,我使用上面的命令将每个命令的输出保存到文件中,然后将结果附加到末尾。 但是我想这不是执行此操作的好方法,并且必须有其他方法来更有效地处理这种情况。
可以在1行代码中完成上述操作,并且可以将输出保存到单个文件中吗?
假设您的shell是bash,则只需一个命令即可轻松完成。 假设我正确阅读了您的问题:
#!/bin/bash
# ^^^^- NOT /bin/sh; also must not be run with "sh yourscript" (use "bash yourscript")
paste -d ' ' \
<(awk -v date="$(date -d "-1 day" +"%Y-%m-%d %H:%M")" '$3$4<date' sftp_bbtrm_files.txt \
| awk '{print $3,$4,$5}') \
bbtrm_ref.txt \
>email_final_bbtrm_output.txt
解释:
foo | bar
foo | bar
将foo
的stdout连接到bar
的stdin; 因此,它可以用于将第一个awk
的输出发送到第二个awk
(尽管为什么在那里需要两个单独的awk命令,而不是只有一个不清楚)。 <(...)
是一个扩展,被文件名(命名管道或/dev/fd
引用)替换,该文件名在读取时返回命令的输出...
因此,我们将bbtrm_ref.txt
和通过两个awk
命令发送sftp_bbtrm_files.txt
的结果paste
在一起,以获得单个输出文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.