12

ログ ファイルがあり、sed を使用して、単語 MATCH を含む 2 つの文字列間の行を抽出します。sed を使用して行を抽出し、grep を使用して「MATCH」という単語を含む行のみを取得します。一致が見つかったログ ファイルの行番号が必要です。

Date:...
TST STARTS
DISCARD str1
DISCARD str2
MATCH str3 //line 5
MATCH str4 //line 6
DISCARD str5
TST FINISHED

このコマンドを使用して行を抽出します。

sed -n "/TST STARTS/,/TST FINISHED/p" log.txt | grep "MATCHED".

私の出力は次のとおりです。

MATCH str3
MATCH str4

ただし、出力には行番号も必要です。

line 5: MATCH str3
line 6: MATCH str4
4

3 に答える 3

19

あなたが使用することができます:

cat -n

次のように、sed を適用する前に行に番号を付けます。

cat -n log.txt | sed -n "/TST STARTS/,/TST FINISHED/p" | grep "MATCHED"

cat -nまたは、次のバリアントに置き換えることもできますnl

nl -n ln log.txt | sed ...
于 2013-11-15T10:37:28.220 に答える
5

sedパーツが特定の行を削除するため、最初の試みは行番号を保持していませんでした。

これですべてを行うことができますawk

$ awk '/TST STARTS/ {p=1} p && /MATCH/ {print "line "NR" --> "$0}; /TST FINISHED/ {p=0}' a
line 5 --> MATCH str3 //line 5
line 6 --> MATCH str4 //line 6
  • '/TST STARTS/ {p=1}p=1今後はすべての行が考慮されるようにフラグを設定します。
  • p && /MATCH/ {print "line "NR" --> "$0}フラグpがアクティブで行に が含まれているMATCH場合、情報が出力されます。
  • /TST FINISHED/ {p=0}テキストの検索時にフラグをオフにしTST FINISHEDます。
于 2013-11-15T10:34:30.313 に答える
3
sed -n '/TST STARTS/,/TST FINISHED/ {
   /MATCH/ {
      =;p
      }
   }' log.txt

次の行の行の内容よりも行番号

| sed "/^[0-9]/ { 
  N
  s/^\(.*\)\n/line \1:/
   }"

同じ行を含む場合(1つのsedで実行できますが、この場合は巨大なスクリプトでパフォーマンスが低下します。シェルからのリコールを伴うイベントでは、2番目のsedを使用すると簡単です)。行の以前の番号付けを使用することもできます

于 2013-11-15T10:51:43.473 に答える