【问题标题】:Getting the output of a shell command in awk with command containing text from a field使用包含字段文本的命令在 awk 中获取 shell 命令的输出
【发布时间】:2022-08-14 06:26:33
【问题描述】:

我正在尝试以特定格式解析某些日期的文件并获取“自纪元以来的秒数”以计算日期与当前日期之间的绝对差异。我需要使用第 4 个字段在每一行上执行此操作,因此我尝试执行以下操作:

\"date --date=$4 +%s\" | getline DUE
close(\"date --date=$4 +%s\")
\"date +%s\" | getline CURR
close(\"date +%s\")

当然这并不完全有效,因为awk 将 $4 解释为文字 \"$4\"。所以我不能在该语句中使用变量。

我还尝试在命令字符串的前面创建 2 个变量,并以第三个变量结尾,即在中间与 $4 连接的变量。那也没有用。

我有一种感觉,你应该能够做这样的事情。我知道 date 可以很好地解析日期。格式类似于Thu Aug 11 11:40:00 UTC 2023

awk 有没有办法做到这一点?我浏览了很多文档,却没有看到在 shell 命令中处理字段的示例。

    标签: linux bash shell awk


    【解决方案1】:

    使用字符串连接。

    您还需要在 --date 参数周围加上引号,因为它包含空格。

    command = "date --date=\"" $4 "\" +%s"
    command | getline DUE
    close(command)
    command2 = "date +%s"
    command2 | getline CURR
    close(command2)
    

    【讨论】:

    • 正如我指出的那样,我已经尝试过了。它只是使 DUE 变量为空。
    • 这个对我有用。 $4 中有空格吗?如果是这样,您需要在 --date 参数周围加上引号。
    • 我刚刚在问题中看到了示例日期。我更新了答案。
    • 嗯,是的,也许这就是问题所在。我会试试 command = "date --date=\"" $4 "\" +%s"
    • 是的,工作,感谢指针。虽然我无法让单引号版本工作。你能编辑答案吗?
    【解决方案2】:

    关于date实用程序的旁注:::语法是真的gnu/linux one 和 BSD one 之间的区别:

    • gnu 一个允许输入和输出的小数时期
    • @ 是 epoch 的强制要求
    gdate -d '@16602518201915245'    # GNU-date (GNU coreutils 9.1)
    
    Mon Nov  8 22:07:25 EST 526114827
    
    • BSD 不接受@ 或非整数
     date -r 16602518201915245       # BSD-date (from FreeBSD 12.0)
    
    Mon Nov  8 22:07:25 EST 526114827
    

    他们确实有一个共同的特点:

    • 一年的上限-1 + 2 ^ ( 3 ^ 3 + 4 )

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多