저는 쉘 스크립팅을 처음 접했습니다.
내가 가지고 있는 것은 각 줄이 다음 항목처럼 시작되는 로그 파일입니다.
[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
쉘 스크립트에서 텍스트를 처리하려면 출력의 각 줄에서 부적절한 도구(예: 또는 )를 여러 번 호출하는 대신 텍스트 처리 도구(예: 또는 )를 호출하여 전체 입력을 처리해야 합니다 .awk
perl
read
echo
여기서는 정규식을 사용하여 입력을 일치시키고 관련 필드를 추출하고 필요에 따라 형식을 다시 지정합니다. 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)로 제한됩니다. 유니코드 모드에서 작업하거나 로케일 인코딩에 따라 작업하라는 지시를 받지 않았기 때문에 다음과 같은 다른 십진수를 포함하지 않습니다.