入力(sedスクリプトによって誤って処理された、/ \ n /無視)

入力(sedスクリプトによって誤って処理された、/ \ n /無視)

したがって、指定されたポートで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でハードコーディングされます。)

関連情報