我有一个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保持不变,因为服务器列在同一类型上)
执行完脚本后,应该说&#34;键入ID&#34;或类似的东西。
如果不能在awk脚本中完成,请不要努力编写shell脚本(一般来说我只是想知道如何做到这一点,但我对每个答案都感激不尽)
提前致谢
答案 0 :(得分:1)
这不是你的问题的直接答案,但可能是你的问题。 我假设你生成了一些数据,然后你需要处理它。 当你需要保留数据中的某些逻辑时,通过shell使用sqlite而不是生成平面文件然后使用像awk这样的工具进行解析和处理可能是值得的。
如果您担心地理数据的性能(经常执行INSERT而不是简单的echo to file),您可以将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
答案 1 :(得分:1)
当你说:
时,我认为你有正确的想法编写执行此操作并执行awk脚本的shell脚本
有一百万种方法可以做到这一点,但我会编写一个调用你的awk脚本的bash脚本。
处理那里的用户交互和文件系统操作。
您还可以使用此处的文档从bash程序中生成awk文件。我会在今天晚些时候告诉你。
Linux的一大优势是“手持小程序”。 Windows最大的弱点是一个整体程序的概念,可以完成所有工作。