2009-06-26 16 views
1

小さなawkスクリプトで問題が発生しました。私はいくつかのログファイルの中から最新のファイルを選択してgetlineを使って読み込もうとしています。問題は、スクリプトに入力を最初に送信しないとうまくいかないことです。最新のファイルを選択して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 
} 
} 

答えて

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`" 

を再び、これは少し汚いかもしれません。私たちはより良い答えを待つでしょう。 :-)

0

lsを解析しないでください。その理由は、thisを参照してください。

なぜ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 
+0

私はawkですべてのことをしたいと思っていました。しかし、チップのおかげでありがとう。 –

+0

あなたのコマンド= "..."はすでにawkの外に届いています。 Oreが述べたように、awkは入力ファイル(または標準入力)を必要とします。そのため、エコーをawkにパイプする必要があります。 –

+0

コマンドについての真実= ""でもまだ:) これは、私がBEGINセクションから抜け出すためには、awkがある種の入力データを必要とするのを見てみましょう。悪い印Oresは答えとして答えます。 –

関連する問題