쉘 스크립트를 사용하여 파일의 한 줄에서 여러 문자열 찾기 및 바꾸기/변경

쉘 스크립트를 사용하여 파일의 한 줄에서 여러 문자열 찾기 및 바꾸기/변경

저는 쉘 스크립팅을 처음 접했습니다.

내가 가지고 있는 것은 각 줄이 다음 항목처럼 시작되는 로그 파일입니다.

[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

위의 코드는 대체 줄에서 대괄호를 제거합니다. 이는 첫 번째 줄 "["에서 시작하는 대괄호가 제거되고 두 번째 줄 "]"에서 끝나는 대괄호가 제거됨을 의미합니다. 모든 줄에서 두 줄을 모두 삭제하고 싶습니다. 뿐만 아니라 하이픈으로 변경하려는 점은 위의 예에 이미 표시되어 있습니다.

답변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

그중 정규식 구문에서는 다음과 같습니다.

  • ^제목의 시작 부분과 일치합니다(여기 줄).
  • \[문자 와 일치합니다 [.
  • \d십진수와 일치합니다.
  • \.리터럴 .문자를 일치시킵니다.
  • \w+w가능한 한 자주 하나 이상의 연속 문자(여기서는 문자 1 또는 밑줄)와 일치합니다.
  •  그리고 :각각 일치합니다.
  • (...)콘텐츠를 캡처 $1하고 $2일치시키는 데 사용됩니다...

이렇게 하면 패턴과 일치하는 줄의 형식이 다시 지정되고 다른 줄(있는 경우)은 유지됩니다.


perl¹ ASCII 숫자(0123456789)로 제한됩니다. 유니코드 모드에서 작업하거나 로케일 인코딩에 따라 작업하라는 지시를 받지 않았기 때문에 다음과 같은 다른 십진수를 포함하지 않습니다.

관련 정보