別の単語から始まる単語のインスタンス数を計算する方法

別の単語から始まる単語のインスタンス数を計算する方法

grep今日から、次の形式のMySQLエラーログが必要です。

`date +"%y%m%d"` (140710) 

その単語のすべてのインスタンスを見つけますpartitioned

私はいろいろな方法を試しましたが、役に立たなかった。これはうまくいくようです:

more +/"`date +"%y%m%d"`" mysql-error.log | grep -c partitioned

ただし、ログファイルに今日のエントリが含まれていない場合は、ゼロを返すのではなく、ファイル全体を検索してファイル全体の番号を返します。

今日のエントリがない場合は、ファイル全体ではなくgrep0を返し、結果を計算する必要があります。

sedこれを行うより良い方法はありますかawk


技術的に計算すべき内容} partitioned {の後には英数字の文字列が続きます。分割された{(文字列なし)}がある可能性があるため、計算しないでください。

しかし、これは厳しい要件ではありません。私は単語の発生回数を数えるだけで幸せですpartitioned

以下はログファイルの例です。

140109 12:25:07 [Note] WSREP: view(view_id(PRIM,c4819ddf-7952-11e3-89fc-4f9f1bfa267f,3) memb {
    c4819ddf-7952-11e3-89fc-4f9f1bfa267f,
} joined {
} left {
} partitioned {
    f85c2e70-7952-11e3-a759-aa8332246e85,
})
140109 12:25:07 [Note] WSREP: Shifting JOINED -> SYNCED (TO: 85)

答え1

GNU sedanhd を使用すると、grep次のことを試すことができます。

sed -n "/$(date +%y%m%d)/,\$p" file | grep -c partitioned

/pattern/,$最初のパターンをファイルの終わりに合わせます。

あなたの意見に基づいて:

$ sed -n "/$(date +%y%m%d)/,\$p" 1.txt | grep -c partitioned
1

一致する日付はありません:

$ sed -n "/$(date +%y%m%d)/,\$p" 1.txt | grep -c partitioned
0

答え2

2つのgrepを一緒に接続してみることができます。

grep `date +"%y%m%d"` mysql-error.log | grep -c partitioned

それとももっと簡単です:

grep -c "`date +%y%m%d`.*partitioned" mysql-error.log

編集する

日付と「partitioned」という単語が異なる行にあるので、

d=$(date +"%y%m%d"); awk '/'$d'/,EOF {print $0}' mysql-error.log | grep -c partitioned

または:

awk '/'$(date +%y%m%d)'/,EOF {print $0}' mysql-error.log | grep -c partitioned

関連情報