【问题标题】:Command line input in awk script?awk脚本中的命令行输入?
【发布时间】:2014-10-28 10:51:00
【问题描述】:

我有一个解析日志文件的 awk 脚本 脚本:

BEGIN{
    print "ID", "vFiler", "Type", "host"
}
/=====/{
    vFiler=$2
    next
}
match($0,/root=[^,]*/){
    n=split(substr($0,RSTART+5,RLENGTH-5),N,/:/)
    for(i=1; i<=n; i++)print vFiler,$1,N[i];
}

现在我的问题是,正如您所看到的,在开始时设置了一个 ID,这应该意味着在脚本运行之前每次都输入,因为文件每次都有不同的 ID。所以我想知道我应该如何做到这一点,是否编写一个执行此操作并执行 awk 脚本的 shell 脚本。或者有没有办法在 awk 脚本中写这个(也许用 getLine ?!)?

我想要实现的输出是:

ID,vFiler,Type,host
1,vfiler0,/vol/vol0,fapra8.net
4,vfiler1,/vol/lnxpjmmorena,fcvapd10.net
4,vfiler1,/vol/CSArchive,fcvapd11.net

(在第二种情况下,ID 保持不变,因为服务器列在相同的类型上)

执行脚本后,它应该会说“输入 ID”之类的内容。

如果这不能在 awk 脚本中完成,请不要努力编写 shell 脚本(一般我只是想知道我该怎么做,但我很感激每一个答案)

提前致谢

【问题讨论】:

  • 如果这是一个独立的 awk 脚本,将最后一个传递给 awk 的 args/文件作为您要搜索的内容。将变量设置为 argv[N] 然后从 argc 中删除它

标签: linux shell awk


【解决方案1】:

我认为你说的很对:

编写一个执行此操作并执行 awk 脚本的 shell 脚本

有一百万种方法可以做到这一点,但我会编写一个调用您的 awk 脚本的 bash 脚本。

在那里处理任何用户交互和文件系统操作。

您还可以使用此处的文档从 bash 程序中生成 awk 文件。今天晚些时候我会告诉你的。

Linux 的一大优势是“牵手的小程序”。 Windows 最大的弱点是一个可以做所有事情的整体程序的概念。

【讨论】:

  • 是的,已经编写了一个 shell 脚本来执行此操作并且效果非常好
  • 为了完整起见,请在原始问题中发布您的解决方案,然后将其标记为已回答。这将有助于你的程序员同行在你后面寻找相同的答案。
【解决方案2】:

这不是直接回答您的问题,而是可能回答您的问题。 我假设您生成了一些数据,然后您需要对其进行处理。 当您需要保留数据中的某些逻辑时,可能值得通过 shell 使用 sqlite,而不是生成平面文件,然后使用 awk 等工具进行解析和处理。

如果您担心生成数据的性能(经常执行 INSERT 而不是简单的回显到文件),您可以将 SQL 命令回显到文件,然后在处理它们之前在单个事务中加载一堆数据。

更新

怎么样:

read MYVAR && awk -v MYVAR="$MYVAR" '{print MYVAR $0}' in.log

另一个不太便携的版本(gawk 扩展):

awk 'BEGIN{ "head -1" | getline MYVAR; print MYVAR }{print MYVAR $0}' in.log

【讨论】:

  • 我基本上只想手动输入第一列的数字,剩下的只是通过日志解析
  • 所以你想从日志文件和交互式用户的标准输入中读取数据,对吧?
  • 是的,我想在开始读取之前得到一个输入,输入应该设置为一个变量,然后与解析的结果一起列出
猜你喜欢
  • 2020-08-28
  • 2018-08-28
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-06
相关资源
最近更新 更多