パスワード:
grep -rI --exclude=*_*.log -B20 -A1 "Status: Error" > /var/log/alertError.log
入力ログの例:
[06/07/20 20:38:53.911]:loopback ST: token-src-name()
[06/07/20 20:38:53.914]:loopback ST: Token Value: "DVADER".
[06/07/20 20:38:53.916]:loopback ST: token-text(",OU=users,O=data")
[06/07/20 20:38:53.919]:loopback ST: Arg Value: "CN=DVADER,OU=users,O=data".
[06/07/20 20:38:53.922]:loopback ST: description("Removed by Termination Process")
[06/07/20 20:38:53.926]:loopback ST: token-text("Removed by Termination Process")
[06/07/20 20:38:53.929]:loopback ST: Arg Value: "Removed by Termination Process".
[06/07/20 20:38:53.943]:loopback ST: DirXML Log Event -------------------
Driver: \StarWars\system\Driver Set\User Processor
Channel: Subscriber
Status: Error
Message: Code(-9217) Error in
この入力ログには、スクラップするログの一部が表示されます。しかし、ログを検索したい日付と一致させたいです。構造内のすべてのログファイルに対して再帰検索を実行できるため、grepを使用します。私のgrepは私が望むすべてのデータを返しますが、今私は古いコードブロックを除外したいと思います。したがって、日付がすべての行にあるわけではありません。 grepは、必要なスイッチBとAを含むコードスニペットを返します。したがって、行全体が表示される場合は、メッセージとステータス行が進行中の複数のタスクと一致することになります。このgrepコマンドを使用すると、すべての種類のメッセージまたはステータス値を取得できますが、特定の日付範囲に対してのみすべての結果をコードの塊として削除する方法がわかりません。
答え1
python
解決策は次のとおりです。
with open("log.txt") as f: # open file log.txt
lines = f.readlines() # load lines
nonempty = filter(lambda x: x.strip() != "", lines) # filter out empty lines
newlines = [] # list for out result lines
for l in nonempty: # iterate lines
l = l.rstrip() # cut '\n' from the right of each line
last_idx = len(newlines) - 1 # index of the last element in the list
if l.startswith(" "): # this lines are lines with your traceback
newlines[last_idx] += l # add to the "normal" log element
else: # this are "normal" elements
newlines.append(l) # add them to the list
print("\n".join(newlines)) # create output and print to stdout
この出力には、同じ行に「ステータス」と「日付」が含まれていますgrep
。
normalize.py
ログファイル(たとえば)の近くにそれを配置し(たとえばlog.txt
)実行します。python3 normalize.py
答え2
あなたの質問は不明ですが、これはあなたが望むものですか?
$ awk -v tgt='06/07/20' '
/^\[/ { prt() }
NF { rec = rec $0 ORS }
END { prt() }
function prt() {
if ( index(rec,tgt) == 2 ) {
printf "%s", rec
}
rec = ""
}
' file
[06/07/20 20:38:53.911]:loopback ST: token-src-name()
[06/07/20 20:38:53.914]:loopback ST: Token Value: "DVADER".
[06/07/20 20:38:53.916]:loopback ST: token-text(",OU=users,O=data")
[06/07/20 20:38:53.919]:loopback ST: Arg Value: "CN=DVADER,OU=users,O=data".
[06/07/20 20:38:53.922]:loopback ST: description("Removed by Termination Process")
[06/07/20 20:38:53.926]:loopback ST: token-text("Removed by Termination Process")
[06/07/20 20:38:53.929]:loopback ST: Arg Value: "Removed by Termination Process".
[06/07/20 20:38:53.943]:loopback ST: DirXML Log Event -------------------
Driver: \StarWars\system\Driver Set\User Processor
Channel: Subscriber
Status: Error
Message: Code(-9217) Error in
それともこれではないだろうか?
$ awk -v tgt='06/07/20' '
/^\[/ { prt() }
NF { rec = rec $0 ORS }
END { prt() }
function prt() {
if ( (index(rec,tgt) == 2) && (rec ~ /Status:[[:space:]]+Error/) ) {
printf "%s", rec
}
rec = ""
}
' file
[06/07/20 20:38:53.943]:loopback ST: DirXML Log Event -------------------
Driver: \StarWars\system\Driver Set\User Processor
Channel: Subscriber
Status: Error
Message: Code(-9217) Error in
次のように簡単にawkを呼び出すことができますfind
。
find . -type f -name '*.log' -exec awk '....' {} +