シェルスクリプトを使用してファイルの1行で複数の文字列を検索および置換/変更

シェルスクリプトを使用してファイルの1行で複数の文字列を検索および置換/変更

私はシェルスクリプトに初めて触れました。

私が持っているのは、各行が次のように始まるログファイルです。

[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シェルスクリプトでテキストを処理するには、出力の各行で不適切なツール(または)を複数回呼び出すのではなく、テキスト処理ツール(または)を呼び出して入力全体を処理する必要があります。awkperlreadecho

ここでは、正規表現を使用して入力を一致させ、関連フィールドを抽出し、必要に応じてフォーマットを再指定します。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

そのうち正規表現構文では次のようになります。

  • ^タイトルの先頭に一致します(ここの行)。
  • \[文字と一致します[
  • \d10進数と一致します。
  • \.リテラル.文字を一致させます。
  • \w+wできるだけ頻繁に1つ以上の連続する文字(ここでは文字1または下線)と一致します。
  •  そして:それぞれ一致します。
  • (...)コンテンツをキャプチャし$1$2一致させるために使用されます。

これにより、パターンに一致する行の書式が再指定され、他の行(存在する場合)は維持されます。


perl¹ASCII番号(0123456789)に制限されています。 Unicodeモードで作業したり、ロケールエンコーディングに従って作業するように指示されなかったため、次のような他の10進数は含まれません。

関連情報