4

Linuxにテキストファイル(基本的にはログファイル)があり、2つの単語(アルファ、ベータ)があります。

今、これらの 2 つの単語を 1 行で検索し、その行と次の 15 行を一時ファイルに出力しようとしています。alpha と beta には多くの行がありますが、最後の "alpha" と "beta" と次の 15 行だけが必要です。

同じ行で検索する単語が 3 つまたは 4 つ、アルファ、ベータ、ガンマなど、単語が増える場合のコマンドも教えていただけるとありがたいです。

4

6 に答える 6

5

Your wording was a bit ambiguous, did you want a line with both alpha AND beta or alpha OR beta. If the first:

grep -EA15 'alpha.*beta|beta.*alpha' | tail -16

if the second:

grep -wA15 'alpha|beta' | tail -16
于 2012-04-23T20:51:34.407 に答える
1

OmnipotentEntity は、1 行あたり 2 語に固執する限り、間違いなく最適な方法です。ただし、正規表現の組み合わせ爆発のため、実際にはそれを超えて拡張することはできません。1 行に 4 つまたは 5 つの単語を一致させる必要がある場合は、以下のようなものが調整なしで機能すると思います (これは部分的にしかテストしていません)。


#!/bin/bash 

context=15
file=$1
shift

cmd="cat -n $file"
for s in $@
do
   cmd="$cmd | grep $s"
done

begin=$(eval $cmd | tail -1 | cut -f1)
(( end=$begin + $context ))

sed -n $begin,${end}p $file

入力ファイルに行番号を付けてから、一連の grep フィルターを作成するという考え方です。すべてのフィルターを通過した最後の行の行番号を抽出し、sed を使用して必要な範囲を出力します。

于 2012-04-23T22:09:40.833 に答える
1

これはうまくいくかもしれません(GNU sed):

sed '/alpha.*beta\|beta.*alpha/,+15{//{h;d};H};$!d;g;/^$/d' file

またはこれ(すべてのsed):

sed '/alpha.*beta\|beta.*alpha/{:a;$bb;N;s/\n/&/15;tb;ba;:b;$q;x};$!d;g;/^$/d' file

2 つの単語の場合、正規表現/alpha.*beta\|beta.*alpha/は受け入れられますが、それ以降は、さまざまな組み合わせをすべて覚えるのが難しくなります。より良い方法は、行に現在の正規表現が含まれていない場合に救済するために、任意の時点で単語を個別の正規表現としてリストすることです。

sed '/alpha/!bc;/beta/!bc;/gamma/!bc;/delta/!bc;:a;$bb;N;s/\n/&/15;tb;ba;:b;$q;x;d;:c;$!d;g;/^$/d' file
于 2012-04-23T22:39:40.970 に答える
0

次のコードを参照してください。

awk '
    {
        file[NR]=$0
    }
    END{
        for (i=NR; i>0; i--) {
            if (file[i] ~ /^alpha, beta/)  {
                for (j=i; j<=i+15; j++) {
                    print file[j]
                }
                exit
            }
        }
    }
' FILE

アルゴリズムは次のとおりです。

  • ファイルの各行に対して、現在の行番号をキーとしてフィードして配列します
  • ファイルの最後で、「アルファ、ベータ」の最初の出現を逆順で検索します
  • 行が一致すると、これを出力し、配列キーを 15 回インクリメントできる間、各値を ASC 順に出力します
于 2012-04-23T21:14:18.267 に答える
0

sed も使用できます。

sed -n '/alpha.*beta|beta.*alpha/,+15p' file | tail -n 16
于 2012-04-23T22:25:19.097 に答える
-2

to get the last occurrence of a specific word: "tail"

grep myword myfile.txt| tail -1

For multiple words,

grep -w 'word1|word2' myfile.txt| tail -1

For the last 15 instances of either word,

grep -w 'word1|word2' myfile.txt| tail -15

for more complex scenarios: "sed" or "awk".

于 2012-04-23T20:50:54.510 に答える