繁体   English   中英

使用命令的输出作为“ paste”输入,而没有临时文件

[英]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 | barfoo的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM