입력(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/세 번째 줄에 있는 가짜 내용을 제거하기 위해 입력을 수정했습니다). 잘못된 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/ 구문 분석할 수 없습니다(세 번째 줄).

색상으로 무엇을 하려는지 잘 모르겠습니다. 이렇게 하면 지정된 색상 문자열(예: 녹색, 노란색, 빨간색)이 출력에서 ​​완전히 제거되고 -C색조가 적용됩니다(일반적으로 터미널 출력의 기본값).

ncat ... | sed ... | jq -C '. - ["green","yellow","red"]'

-c여러 줄의 예쁜 인쇄 대신 출력을 압축하기 위해 추가하는 옵션이 있습니다 . 이는 예제 출력에 더 가깝습니다.

(터미널 배경에 따라 출력의 일부가 표시되지 않을 수 있습니다. 색상은 최소한 jq-1.5로 하드코딩됩니다.)

관련 정보