
나는 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의 답변을 참조하세요.