1

小 awk 脚本出现问题,我尝试选择一些日志文件中的最新文件,然后使用 getline 读取它。问题是,如果我不先将任何输入发送到脚本,它就不起作用。

这有效

echo | myprog.awk

这不

myprog.awk

我的程序

BEGIN{
#find the newest file
command="ls -alrt | tail -1 | cut -c59-100"
command | getline logfile
close(command)
}
{
while((getline<logfile)>0){
    #do the magic 
    print $0
}
}
4

2 回答 2

1

您的问题是,当您的程序选择 OK 日志文件时,将为输入文件的每一行执行块 {},并且您没有输入文件,因此它默认为标准输入。我自己不太了解 awk,所以我不知道如何从 awk 脚本中更改输入(如果可能),所以我会:

#! /bin/awk -f

BEGIN{
    # find the newest file
    command = "ls -1rt | tail -1 "
    command | getline logfile
    close(command)
    while((getline<logfile)>0){
    getline<logfile
        # do the magic
        print $0
    }
}

或许

alias myprog.awk="awk '{print $0}'  `ls -1rt | tail -1`" 

同样,这可能有点脏。我们将等待更好的答案。:-)

于 2009-06-26T12:19:03.137 回答
0

从不解析ls原因见此。

为什么需要使用getline?让我们awk为您完成工作。

#!/bin/bash
# get the newest file
files=(*) newest=${f[0]}
for f in "${files[@]}"; do
  if [[ $f -nt $newest ]]; then
    newest=$f
  fi
done

# process it with awk
awk '{
    # do the magic
    print $0
}' $newest
于 2009-06-26T18:10:33.807 回答