私はシェルスクリプトに初めて触れました。
私が持っているのは、各行が次のように始まるログファイルです。
[2021.04.27.17:03:43.813]: ERROR -
[2021.04.27.17:04:36.790]: SUCCESS -
希望する新しいファイル出力は次のとおりです。
2021-04-27 17:03:43 813,ERROR,
2021-04-27 17:04:36 790,SUCCESS,
私がコーディングしたのは
while read a; do
echo ${a//"["/""}
echo ${a//"]"/""}
done < xms.log > resultlog.txt
上記のコードは、代替行から角括弧を削除します。これは、最初の行「[」で始まる角かっこが削除され、2行目「]」で終わる角括弧が削除されることを意味します。すべての行から両方の行を削除したいと思います。さらに、ハイフンに変更したい点は、上記の例にすでに表示されています。
答え1
ストリームエディタを使用してsed
テキストファイルを変更します。
sed 's/\./-/;s//-/;s// /;s// /;s/: /,/;s/ -/,/;s/\[//;s/]//' xms.log > resultlog.txt
スクリプトには、セミコロンで区切られたs
形式の代替コマンドのみが含まれています。最初の点をダッシュに置き換えます。次のポイントも交換したいので、パターンを繰り返す必要はありません。パターンを空白にして、他の必須の交換もすべて同じ方法で完了してください。正規表現構文で特別な意味のある文字を一致させる必要がある場合は、バックスラッシュ(および:)を使用してエスケープする必要があります。s/pattern/replacement/
s/\./-/
s//-/
\.
\[
読みやすく、次のように書くこともできます。
sed 's/\./-/
s/\./-/
s/\./ /
s/\./ /
s/: /,/
s/ -/,/
s/\[//
s/]//' xms.log > resultlog.txt
答え2
sed
シェルスクリプトでテキストを処理するには、出力の各行で不適切なツール(または)を複数回呼び出すのではなく、テキスト処理ツール(または)を呼び出して入力全体を処理する必要があります。awk
perl
read
echo
ここでは、正規表現を使用して入力を一致させ、関連フィールドを抽出し、必要に応じてフォーマットを再指定します。perl
正規表現のマッチングに最適
perl -lpe '
$_ = "$1-$2-$3 $4 $5,$6," if
m{^\[(\d\d\d\d)\.(\d\d)\.(\d\d)\.(\d\d:\d\d:\d\d)\.(\d\d\d)\]: (\w+)}
' < input.txt > output.txt
そのうち正規表現構文では次のようになります。
^
タイトルの先頭に一致します(ここの行)。\[
文字と一致します[
。\d
10進数と一致します。\.
リテラル.
文字を一致させます。\w+
w
できるだけ頻繁に1つ以上の連続する文字(ここでは文字1または下線)と一致します。:
それぞれ一致します。(...)
コンテンツをキャプチャし$1
て$2
一致させるために使用されます。
これにより、パターンに一致する行の書式が再指定され、他の行(存在する場合)は維持されます。
perl
¹ASCII番号(0123456789)に制限されています。 Unicodeモードで作業したり、ロケールエンコーディングに従って作業するように指示されなかったため、次のような他の10進数は含まれません。