새로운 문자열을 형성하기 위해 문자열의 일부를 grep

새로운 문자열을 형성하기 위해 문자열의 일부를 grep

일부 로그 파일을 구문 분석하고 오류를 찾고 있습니다. 각 줄은 다음과 같습니다.

CreateOrder_hostname1.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_CreateOrder: [1443555726715] Error description [system]: Method1
ScheduleOrder_hostname2.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_ScheduleOrder: [1443555726715] Error description 2 [system]: Method2
ScheduleOrder_hostname2.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_ScheduleOrder: [1443555726715] Error description 3 [system]: Method3
ShipOrder_hostname3.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_ShipOrder: [1443555726715] Error description 4 [system]: Method4

이 줄을 어떻게 이렇게 읽을 수 있나요?

CreateOrder: 2015-09-29 15:42:06: Error description
ScheduleOrder: 2015-09-29 15:42:06: Error description 2
ScheduleOrder: 2015-09-29 15:42:06: Error description 3
ShipOrder: 2015-09-29 15:42:06: Error description 4

답변1

그리고 sed:

sed 's/^\([^_]*\)_[^:]*:\([^,]*\)[^]]*\]\([^[]*\).*/\1: \2:\3/'
  • ^\([^_]*\)줄의 시작 부분과 일치합니다 ^. 그런 다음 괄호 안의 부분이 \(...\)sed 내부 변수에 저장됩니다 \1.
    • [^_]*_밑줄이 0번 이상 아닌 모든 문자와 일치합니다 *.
  • [^:]*그 뒤에는 가 아닌 모든 문자가 옵니다 :.
  • \([^,]*\)다시 괄호 안에 넣고 날짜 이후의 모든 문자 \2까지 변수에 저장합니다.,
  • [^]]*\]]구문 분석은 오류가 발생할 때까지(오류 설명 전) 계속됩니다 .
  • \([^[]*\)그런 다음 모든 것을 다음 열린 대괄호 [와 일치시키고 \3.
  • \1: \2:\3\1이제 모든 것을 형식화된 출력과 \2변수 값으로 대체하고 \3.

산출:

CreateOrder: 2015-09-29 15:42:06: Error description 
ScheduleOrder: 2015-09-29 15:42:06: Error description 2 
ScheduleOrder: 2015-09-29 15:42:06: Error description 3 
ShipOrder: 2015-09-29 15:42:06: Error description 4 

답변2

이것은 작동합니다:

$ perl -pe 's/^(.+?)_.+?:(.+?),.*?\](.+?)\[.*/$1: $2:$3/' file 
CreateOrder: 2015-09-29 15:42:06: Error description 
ScheduleOrder: 2015-09-29 15:42:06: Error description 2 
ScheduleOrder: 2015-09-29 15:42:06: Error description 3 
ShipOrder: 2015-09-29 15:42:06: Error description 4 

설명하다

  • perl -pe: " -p주어진 스크립트를 적용한 후 각 줄을 인쇄한다는 의미입니다.-e
  • s/^(.+?)_.+?:(.+?),.*?\](.+?)\[.*/$1: $2:$3/:Regex는 첫 번째 _( ) .+?_이전의 모든 항목을 찾아 로 저장합니다 $1. 그런 다음 첫 번째 쉼표( )까지의 모든 항목 과 :그 이후의 첫 번째 쉼표( )까지의 .+?,모든 항목을 로 저장합니다. 그런 다음 첫 번째 ( ) $2로 이동하여 이후의 모든 항목을 캡처합니다. 첫 번째 ( )까지는 3달러입니다. 마지막으로 줄 끝까지 모든 것을 일치시킵니다. 이 모두 로 대체됩니다 .].*?\][.+?\[$1: $2: $3

답변3

또 다른 방법은 꼭 필요한 패턴을 유지하는 대신 불필요한 패턴을 제거하는 것입니다.

sed 's/_[^:]*:/: /;s/,[^]]*\]/:/;s/\[.*//'

산출:

CreateOrder: 2015-09-29 15:42:06: Error description 
ScheduleOrder: 2015-09-29 15:42:06: Error description 2 
ScheduleOrder: 2015-09-29 15:42:06: Error description 3 
ShipOrder: 2015-09-29 15:42:06: Error description 4

답변4

오류 설명에는 다음과 같은 내용만 나와 있으므로 찾고 있는 것이 무엇인지 말하기 어렵습니다.잘못된 설명. 이렇게 하면 해당 항목과 그 주변의 식별 콘텐츠가 보존됩니다.

sed 's/[_,][^:-]*:/ /g
' <<\IN
CreateOrder_hostname1.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_CreateOrder: [1443555726715] Error description [system]: Method1
ScheduleOrder_hostname2.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_ScheduleOrder: [1443555726715] Error description 2 [system]: Method2
ScheduleOrder_hostname2.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_ScheduleOrder: [1443555726715] Error description 3 [system]: Method3
ShipOrder_hostname3.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_ShipOrder: [1443555726715] Error description 4 [system]: Method4
IN

...인쇄...

CreateOrder 2015-09-29 15:42:06 ERROR  :Thread-26  [1443555726715] Error description [system]: Method1
ScheduleOrder 2015-09-29 15:42:06 ERROR  :Thread-26  [1443555726715] Error description 2 [system]: Method2
ScheduleOrder 2015-09-29 15:42:06 ERROR  :Thread-26  [1443555726715] Error description 3 [system]: Method3
ShipOrder 2015-09-29 15:42:06 ERROR  :Thread-26  [1443555726715] Error description 4 [system]: Method4

이것이 너무 많은 것인지 너무 적은 것인지, 아니면 올바른 방향으로 나아가고 있는지 모르겠습니다. 박스에 담긴 물건을 버리기도 했어요.

sed 's/[_,[][^]:-]*[]:]/ /g
' <<\IN
CreateOrder_hostname1.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_CreateOrder: [1443555726715] Error description [system]: Method1
ScheduleOrder_hostname2.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_ScheduleOrder: [1443555726715] Error description 2 [system]: Method2
ScheduleOrder_hostname2.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_ScheduleOrder: [1443555726715] Error description 3 [system]: Method3
ShipOrder_hostname3.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_ShipOrder: [1443555726715] Error description 4 [system]: Method4
IN

...인쇄...

CreateOrder 2015-09-29 15:42:06 ERROR  :Thread-26    Error description  : Method1
ScheduleOrder 2015-09-29 15:42:06 ERROR  :Thread-26    Error description 2  : Method2
ScheduleOrder 2015-09-29 15:42:06 ERROR  :Thread-26    Error description 3  : Method3
ShipOrder 2015-09-29 15:42:06 ERROR  :Thread-26    Error description 4  : Method4

...아마도 보고 싶은 게 있는 것 같군요.

이건 떨어졌어요설명하다조금은 완전하지만, 여전히 같은 이야기를 하고 있을까요? 말씀하신 문자열을 일치시키기가 조금 어렵다는 점을 명심하세요무엇이든 될 수 있다이것도 실제 목적에 도움이 되지 않는 것 같습니다. 아무튼 그것도 재미있습니다.

sed 's/[_,][^-]*[^ ]:/ /g
' <<\IN
CreateOrder_hostname1.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_CreateOrder: [1443555726715] Error description [system]: Method1
ScheduleOrder_hostname2.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_ScheduleOrder: [1443555726715] Error description 2 [system]: Method2
ScheduleOrder_hostname2.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_ScheduleOrder: [1443555726715] Error description 3 [system]: Method3
ShipOrder_hostname3.domain.com_201509291530_tee.log:2015-09-29 15:42:06,715:ERROR  :Thread-26_ShipOrder: [1443555726715] Error description 4 [system]: Method4
IN

CreateOrder 2015-09-29 15:42:06 ERROR  :Thread-26  Method1
ScheduleOrder 2015-09-29 15:42:06 ERROR  :Thread-26  Method2
ScheduleOrder 2015-09-29 15:42:06 ERROR  :Thread-26  Method3
ShipOrder 2015-09-29 15:42:06 ERROR  :Thread-26  Method4

관련 정보