2016-06-01 13 views
0

行番号が異なる複数のログファイルから1行目と2行目を最後の行に取得しようとしています。同時に、コンテンツを表示する前にログファイル名を示すことを示しています。以下のようなサンプルファイルコンテンツ。1行目と2行目を複数のファイルの最後の行に印刷

Process started 
log entries here... 
........... 
........... 
Process successful 
Process ended 

私が達成しようとしている出力は以下のとおりです。

05302016.log 
Process started 
Process successful 
05312016.log 
Process started 
Process successful 

どのようにawk、sed、head、tail、またはこれらのコマンドの任意の組み合わせを使用してこれを行うことができますか?迅速かつ汚い

+1

空のファイルはどうすればよいですか? 1行または2行しかないファイルはどうですか? –

答えて

1
for file in *.log 
    do 
echo "$file" 
head -1 "$file" 
tail -2 "$file" |head -1 


    done 

結果:

05302016.log 
Process started1 
Process successful1 
05312016.log 
Process started2 
Process successful2 
+0

これは、さまざまなファイル名では失敗します。常に変数を引用してください。 –

0

awk '{a[FNR]=$0} 
    END{print FILENAME;print a[1];print a[FNR-1];print a[FNR]}' /path/*.log 
1

これは、あなたがより少ない3行で空のファイルやファイルを処理するための要件に応じて、欲しいものを行うことができます。他のawksで

awk ' 
FNR==1 { first=$0 } 
{ secondLast=prevLine; prevLine=$0 } 
ENDFILE { print FILENAME ORS first ORS secondLast } 
' * 

:ENDFILE用のGNU AWKで

awk ' 
FNR==1 { 
    if (NR>1) { 
     print prevFname ORS first ORS secondLast 
    } 
    prevFname = FILENAME 
    first = $0 
} 
{ secondLast=prevLine; prevLine=$0 } 
END { 
    print FILENAME ORS first ORS secondLast 
} 
' * 
0

それはsedよりedと容易であろう。すべてのファイルは、少なくとも2行がある場合:

#!/bin/sh 
nl=$'\n' 
for i in * 
do 
    echo "$i" 
    ed -s <<EOF 
r $i 
1p 
\$-p 
Q 
EOF 
done 

を(ヒアドキュメントで、私は最後から二番目の行を選択するために使用$を脱出しなければならなかったことに注意してください - それ以外のシェルがアクティブシェルフラグを$-を代用します。 )

関連する問題