使用命令输出作为“粘贴”输入而不使用临时文件

时间:2016-08-30 17:03:35

标签: linux bash

我是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 个答案:

答案 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 | barfoo的标准输出连接到bar的标准输出;因此,它可以用来将你的第一个awk的输出发送到你的第二个(虽然为什么你需要两个单独的awk命令,而不是只有一个有点不清楚)。< / LI>
  • <(...)是一个扩展名,用文件名(命名管道或/dev/fd引用)替换,当读取时,返回命令...

因此,我们pastebbtrm_ref.txt与通过您的两个sftp_bbtrm_files.txt命令发送awk的结果{{}}放在一起,以获取单个输出文件。