выберите самый новый файл и используйте getline, чтобы прочитать его - PullRequest
1 голос
/ 26 июня 2009

Возникли проблемы с небольшим скриптом 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
}
}

Ответы [ 2 ]

1 голос
/ 26 июня 2009

Ваша проблема в том, что, пока ваша программа выбирает 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`" 

Опять же, это может быть немного грязно. Мы будем ждать лучшего ответа. : -)

0 голосов
/ 26 июня 2009

Никогда не разбирать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...