したがって、指定されたポートでnetcatをリッスンし、出力をログファイルに保存します。明らかに、ログファイルはonelinerです。どのようにフォーマットを正しく指定するのですか? grcまたは同様のプログラムを統合して色を追加し、埋め込み色コードを微妙に削除する場合は、追加のポイントがあります。
入力(sedスクリプトによって誤って処理された、/ \ n /無視)
[{"startTime":"1","categoryName":"2","data":"3","level":"4","context":"5","pid":7520},"2021-03-25T08:01:08.086Z","default",["6"],{"level":20000,"levelStr":"7","colour":"8"},{},"Hello, log4js! \n","INFO","green"]__LOG4JS__[{"startTime":"1","categoryName":"2","data":"3","level":"4","context":"5","pid":7520},"2021-03-25T08:01:08.096Z","default",["6"],{"level":30000,"levelStr":"7","colour":"8"},{},"Test warning! This is not a drill! \n","WARN","yellow"]__LOG4JS__[{"startTime":"1","categoryName":"2","data":"3","level":"4","context":"5","pid":7520},"2021-03-25T08:01:08.229Z","default",["6"],{"level":20000,"levelStr":"7","colour":"8"},{}/\\n/,"Connected to mongo","INFO","green"]
出力
[{"startTime":"1","categoryName":"2","data":"3","level":"4","context":"5","pid":7520},
"2021-03-25T08:01:08.086Z","default",["6"],{"level":20000,"levelStr":"7","colour":"8"},{},"Hello, log4js! \n","INFO","green"]__LOG4JS__[{"startTime":"1","categoryName":"2","data":"3","level":"4","context":"5","pid":7520},
"2021-03-25T08:01:08.096Z","default",["6"],{"level":30000,"levelStr":"7","colour":"8"},{},"Test warning! This is not a drill! \n","WARN","yellow"]__LOG4JS__[{"startTime":"1","categoryName":"2","data":"3","level":"4","context":"5","pid":7520},
"2021-03-25T08:01:08.229Z","default",["6"],{"level":20000,"levelStr":"7","colour":"8"},{}/\\n/,"Connected to mongo","INFO","green"]
私はこれを達成しようとします(これは不正確であることに注意してください)
awk '{gsub(/\\n/,"__LOG4JS__")}1' a="$(ncat -l -k 10.0.0.1 10000)" log.log
答え1
何をしたいのかは明確ではありませんが、それぞれを__LOG4JS__
改行文字に変換することであれば、複数文字RSにGNU awkを使用すると問題が解決します(/\\n/
3行目の偽の内容を削除するために入力を修正しました)。間違ったJSONを生成しますが、実際には実際のデータには存在しないようです.)
$ awk -v RS='__LOG4JS__|\r?\n' '1' file
[{"startTime":"1","categoryName":"2","data":"3","level":"4","context":"5","pid":7520},"2021-03-25T08:01:08.086Z","default",["6"],{"level":20000,"levelStr":"7","colour":"8"},{},"Hello, log4js! \n","INFO","green"]
[{"startTime":"1","categoryName":"2","data":"3","level":"4","context":"5","pid":7520},"2021-03-25T08:01:08.096Z","default",["6"],{"level":30000,"levelStr":"7","colour":"8"},{},"Test warning! This is not a drill! \n","WARN","yellow"]
[{"startTime":"1","categoryName":"2","data":"3","level":"4","context":"5","pid":7520},"2021-03-25T08:01:08.229Z","default",["6"],{"level":20000,"levelStr":"7","colour":"8"},{},"Connected to mongo","INFO","green"]
awkで同じことができますが、これはファイル全体をメモリに読み込みます(同等のsedソリューションに似ています)。
awk '{sub(/\r$/,""); gsub(/__LOG4JS__/,ORS)}1' file
他のタスクを実行する場合は、そのタスクが何であるかを明確にし、予想される出力が表示されるように質問の例を更新してください。
フォーマットされたjson出力を表示するには、上記のコードを使用してください。
$ awk -v RS='__LOG4JS__|\r?\n' '1' file | jq .
[
{
"startTime": "1",
"categoryName": "2",
"data": "3",
"level": "4",
"context": "5",
"pid": 7520
},
"2021-03-25T08:01:08.086Z",
"default",
[
"6"
],
{
"level": 20000,
"levelStr": "7",
"colour": "8"
},
{},
"Hello, log4js! \n",
"INFO",
"green"
]
[
{
"startTime": "1",
"categoryName": "2",
"data": "3",
"level": "4",
"context": "5",
"pid": 7520
},
"2021-03-25T08:01:08.096Z",
"default",
[
"6"
],
{
"level": 30000,
"levelStr": "7",
"colour": "8"
},
{},
"Test warning! This is not a drill! \n",
"WARN",
"yellow"
]
[
{
"startTime": "1",
"categoryName": "2",
"data": "3",
"level": "4",
"context": "5",
"pid": 7520
},
"2021-03-25T08:01:08.229Z",
"default",
[
"6"
],
{
"level": 20000,
"levelStr": "7",
"colour": "8"
},
{},
"Connected to mongo",
"INFO",
"green"
]
答え2
入力が正しい形式のJSONの場合(ただしそうでない場合)、次のことができます。
ncat ... | sed -e 's/__LOG4JS__/\n/g' | jq -s -M .
__LOG4JS__
~であるメッセージ終了区切り記号したがって、sed
改行に変換され、次にきれいなjq
印刷に変換されます(-M
カラーエスケープを抑制し、JSON形式のみを表示します)。
入力の問題は次のとおりです。{}/\\n/
解析できません(3行目)。
色で何をしたいのかわかりません。これにより、指定されたカラー文字列(緑、黄色、赤など)が出力から完全に削除され、-C
色合いが適用されます(通常は端末出力のデフォルト値)。
ncat ... | sed ... | jq -C '. - ["green","yellow","red"]'
-c
複数行のきれいな印刷ではなく、出力を圧縮するために追加するオプションがあります。これは出力例に近いです。
(端末の背景によっては、出力の一部が表示されない場合があります。色は少なくともjq-1.5でハードコーディングされます。)