选择最新的文件并使用 getline 读取它

发布于 2024-07-25 08:11:20 字数 427 浏览 5 评论 0原文

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

这行得通

echo | myprog.awk

不行

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
}
}

Having problems with a small awk script, Im trying to choose the newest of some log files and then use getline to read it. The problem is that it dosent work if I dont send it any input first to the script.

This works

echo | myprog.awk

this do not

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
}
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

烟花易冷人易散 2024-08-01 08:11:20

您的问题是,当您的程序选择“确定”日志文件时,将针对输入文件的每一行执行块 {},并且您没有输入文件,因此它默认为标准输入。 我自己不太了解 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`" 

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

Your problem is that while your program selects OK the logfile the block {} is to be executed for every line of the input file and you have not input file so it defaults to standard input. I don't know awk very well myself so I don't know how to change the input (if possible) from within an awk script, so I would:

#! /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
    }
}

or maybe

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

Again, this maybe a little dirty. We'll wait for a better answer. :-)

你好,陌生人 2024-08-01 08:11:20

永远不要解析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

Never parse ls. See this for the reason.

Why do you need to use getline? Let awk do the work for you.

#!/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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文