sed가 있는 줄에서 쉼표와 다음 3개 문자를 제거하세요.

sed가 있는 줄에서 쉼표와 다음 3개 문자를 제거하세요.

나는 fall2ban 로그를 postgres 데이터베이스로 보내는 쉘 스크립트를 작성 중입니다. 애플리케이션 로그의 이벤트 타임스탬프는 쉼표로 구분된 이벤트의 밀리초(예: 11:01:26,899)를 성가시게 표시합니다. Postgres는 이를 좋아하지 않으며 저는 필요하지 않습니다. 다음은 다음 줄의 예입니다. 통나무:

2023-02-09 11:01:26,899 fail2ban.filter         [6823]: INFO    [sshd] Found xxx.xxx.xxx.xxx - 2023-02-09 11:01:26

이는 파일에서 쉼표가 있는 유일한 위치입니다. sed를 사용하여 이 쉼표와 다음 3자를 제거할 수 있습니까?

답변1

다음 명령은 쉼표와 쉼표 뒤의 세 문자로 구성된 하위 문자열을 제거합니다.

sed 's/,...//' input.log

참고 및 설명:

  • 기술적으로 이 s명령은 교체를 수행합니다. 빈 문자열로 대체하여 무언가를 제거합니다. 우리 코드에서 관련된 빈 문자열은 두 번째와 세 번째 슬래시 사이에 있습니다.

  • 정규식에서는 ,리터럴이며 .모든 문자와 일치합니다.

  • 저는 작은 따옴표 안에 표현식을 넣었습니다. 이 경우 그러한 인용은 불필요하지만 일반적으로 sed코드에는 쉘에 의해 해석되는 문자가 포함되는 경우가 많으므로(우리는 이를 원하지 않음) 인용에 익숙해지는 것이 좋습니다.

  • 우리의 명령은 입력 줄당 최대 한 번만 교체합니다. 한 줄에서 일치하는 첫 번째 하위 문자열만 대체됩니다.

  • ,...단순한 패턴이다. 각 줄이 주어진 형식의 타임스탬프로 시작하면복잡한 패턴이나 로직이 필요하지 않습니다..

답변2

파일이 주어지면 input.log다음 sed명령은 타임스탬프에서 밀리초 구성 요소를 제거합니다.

sed -r 's/([0-9]{2}:[0-9]{2}:[0-9]{2})(,[0-9]{3})/\1/' input.log

이는 위의 두 캡처 그룹(캡처 그룹 1은 시간이고 %H:%M:%S캡처 그룹 2는 쉼표 및 밀리초임 ,%3N)을 첫 번째 캡처 그룹으로 대체합니다.

그런 다음 다른 파일로 리디렉션될 수 있습니다.

sed -r 's/([0-9]{2}:[0-9]{2}:[0-9]{2})(,[0-9]{3})/\1/' input.log > output.log

output.log출력 파일은 어디에 있습니까?

업데이트:불필요한 g플래그를 제거했습니다. 더 간단하고 간결한 솔루션은 @kamil-maciorowski의 답변을 참조하세요.

관련 정보