【问题标题】:Self-contained awk script: Saving to file, calling file自包含的awk脚本:保存到文件,调用文件
【发布时间】:2014-02-19 02:15:18
【问题描述】:

对于一个实验室,我编写了一个使用 awk 来做一些事情的 shell 脚本。重读实验室的指示,似乎我应该编写一个独立的 awk 脚本。我正在将我的 bash 脚本翻译成 awk,但我现在遇到了问题:

我想将 awk 命令的输出保存到一个新文件中,然后我想将该输出用作另一个 awk 命令的输入。

在我的 bash 脚本中,我有这个:

awk '/Blocked SPAM/' maillog > spamlog
cat spamlog | awk '{print $0}' RS=' '

它从 maillog 中获取所有包含字符串“Blocked SPAM”的行,并将其保存到名为 spamlog 的新文件中。然后它会打开 spamlog 并将每个空格字符 ' ' 替换为新行。

对于我的 awk 脚本,maillog 是从 shell 传递给脚本的文件。我尝试编写类似的代码:

/Blocked SPAM/ > spamlog`
-f spamlog {print $0} RS=' '

我真的不知道我在用我的 awk 脚本做什么,因为我很难为独立的 awk 脚本找到有用的资源。

【问题讨论】:

  • 考虑编辑您上面的问题以包括 1. 示例输入(简化以涵盖基本要求),2. 基于该输入的所需输出,3. 您当前的输出。然后,您试图实现的大部分/所有模糊性都将被消除。祝你好运。
  • awk 并不适合这样的自动驾驶。我想你可能在这里遇到了 XY 问题。我认为您可能需要重新考虑您的方法,以获得一个可以执行您想要的操作的单一 awk 流程(请记住,您可以多次将同一个文件提供给 awk 并使用 NR==FNR 匹配来操作第一个(但不是第二)通过它)。
  • {print $0} 的常用 awk 习语是 1。也就是说,您的第二个命令通常会写成awk 1 RS=' ' spamlog,尽管大多数人可能会写成awk '1' RS=' ' spamlog

标签: bash input awk io output


【解决方案1】:
awk '/Blocked SPAM/{ print > "spamlog"; gsub( " ","\n"); print }' maillog

就我个人而言,我更喜欢直接从 shell 脚本调用它,但您可以通过以下方式轻松地将其变成 awk 脚本:

#!/usr/bin/awk -f

/Blocked SPAM/{ print > "spamlog"; gsub( " ","\n"); print }

使用“maillog”作为参数调用该脚本。

【讨论】:

  • 谢谢威廉。我有指示仅在一个脚本中编写代码。如何在已经调用 maillog 作为参数的 awk 脚本中调用 spamlog?
  • 什么意思? spamlog 是一个数据文件,为什么要“调用”它?我给出的答案会生成spamlog,也会产生处理它的结果。
  • 我想在创建它的同一脚本中对垃圾邮件日志使用 awk 的搜索功能。当我使用 bash 时,我会在 awk 搜索中将 maillog 替换为 spamlog,但我不知道如何在这里做同样的事情。您的代码似乎将输出保存到文件 spamlog,然后也将其打印出来。
  • 您可以将数据写入 spamlog,然后读取 spam log 进行处理,或者更高效地将数据写入 spamlog,然后立即处理(这就是此解决方案的作用)。为什么要读取文件而不是仅仅处理数据?据我所知,此解决方案完全符合您的要求。
  • 抱歉,William,当我尝试您的解决方案时,它只是保存并打印出垃圾邮件日志。在创建和打印垃圾邮件日志后,我不知道如何使用您的解决方案进行搜索。也许我应该用我想在 spamlog 上执行的任何命令替换你拥有的最后一个 print?
猜你喜欢
  • 1970-01-01
  • 2020-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多