したがって、cat
を使用してファイルをプルオープンします 次に、grep
を使用します 一致する行を取得することは、私が扱っている特定のログセットで作業しているときにのみ私を取得します。行をパターンに一致させる方法が必要ですが、一致後に行の一部を返すだけです。試合の前後の部分は一貫して変化します。 sed
を使って遊んだことがあります またはawk
、しかし、一致前にパーツを削除するか、一致後にパーツを返すために行をフィルタリングする方法を理解できていません。どちらも機能します。
これは私が必要とする行の例です。フィルタリングするには:
2011-11-07T05:37:43-08:00 <0.4> isi-udb5-ash4-1(id1) /boot/kernel.amd64/kernel: [gmp_info.c:1758](pid 40370="kt: gmp-drive-updat")(tid=100872) new group: <15,1773>: { 1:0-25,27-34,37-38, 2:0-33,35-36, 3:0-35, 4:0-9,11-14,16-32,34-38, 5:0-35, 6:0-15,17-36, 7:0-16,18-36, 8:0-14,16-32,34-36, 9:0-10,12-36, 10-11:0-35, 12:0-5,7-30,32-35, 13-19:0-35, 20:0,2-35, down: 8:15, soft_failed: 1:27, 8:15, stalled: 12:6,31, 20:1 }
私が必要とする部分は、「失速」した後のすべてです。
この背後にある背景は、何かがストールする頻度を知ることができるということです:
cat messages | grep stalled | wc -l
私がする必要があるのは、特定のノードがストールした回数を調べることです(「ストール」後の各コロンの前の部分で示されます。それをgrepすると(つまり20 :)、ソフト障害のある行が返される場合がありますが、ストールはありません。これは役に立ちません。ストールした部分から特定のノードをgrepできるように、ストールした部分のみをフィルタリングする必要があります。
すべての目的と目的のために、これは標準のGNUコアユーティリティを備えたfreebsdシステムですが、支援するために追加のものをインストールすることはできません。
承認された回答:
そのための標準的なツールはsed
。
sed -n -e 's/^.*stalled: //p'
詳細な説明:
-
-n
デフォルトでは何も印刷しないことを意味します。 -
-e
後にsedコマンドが続きます。 -
s
パターン置換コマンドです。 - 正規表現
^.*stalled:
探しているパターンに加えて、先行するテキスト(.*
)に一致します すべてのテキストを意味し、最初に^
試合は行の先頭から始まると言います)。stalled:
行上で数回発生します。これは最後の発生と一致します。 - 一致、つまり
stalled:
、は空の文字列に置き換えられます(つまり削除されます)。 - 最後の
p
変換された線を印刷することを意味します。
一致する部分を保持する場合は、後方参照を使用します:1
交換部品では、グループ内にあるものを指定します(…)
パターンで。ここでは、stalled:
と書くことができます 再び交換部品で;この機能は、探しているパターンが単純な文字列よりも一般的である場合に役立ちます。
sed -n -e 's/^.*(stalled: )/1/p'
試合後に行の一部を削除したい場合があります。 .*$
を含めることで、試合に含めることができます パターンの最後(任意のテキスト.*
行の終わりが続く$
)。その部分を置換テキストで参照するグループに入れない限り、行の終わりは出力に含まれません。
グループと後方参照の詳細を示すために、このコマンドは、一致前の部分と一致後の部分を交換します。
sed -n -e 's/^(.*)(stalled: )(.*)$/321/p'