Linuxにテキストファイル(基本的にはログファイル)があり、2つの単語(アルファ、ベータ)があります。
今、これらの 2 つの単語を 1 行で検索し、その行と次の 15 行を一時ファイルに出力しようとしています。alpha と beta には多くの行がありますが、最後の "alpha" と "beta" と次の 15 行だけが必要です。
同じ行で検索する単語が 3 つまたは 4 つ、アルファ、ベータ、ガンマなど、単語が増える場合のコマンドも教えていただけるとありがたいです。
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
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 を使用して必要な範囲を出力します。
これはうまくいくかもしれません(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
次のコードを参照してください。
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
アルゴリズムは次のとおりです。
sed も使用できます。
sed -n '/alpha.*beta|beta.*alpha/,+15p' file | tail -n 16
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".