我是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
基本上,我使用上面的命令来保存文件中每个命令的输出,然后在结尾附加结果。但我认为这不是一个好方法,并且必须有其他方法以更有效的方式处理这种情况。
上述内容可以在一行代码中完成,也可以将输出保存到单个文件中吗?
答案 0 :(得分: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
的标准输出;因此,它可以用来将你的第一个awk
的输出发送到你的第二个(虽然为什么你需要两个单独的awk命令,而不是只有一个有点不清楚)。< / LI>
<(...)
是一个扩展名,用文件名(命名管道或/dev/fd
引用)替换,当读取时,返回命令...
因此,我们paste
将bbtrm_ref.txt
与通过您的两个sftp_bbtrm_files.txt
命令发送awk
的结果{{}}放在一起,以获取单个输出文件。