내 로그 파일에 다음이 있습니다.
[2.09 10:23:56]
[23.09 10:3:56]
[23.09 10:23:56] Some other thing
[23.09 10:23:56]
[23.09 10:23:56]
[23.09 10:23:5]
[23.09 10:23:56] Something
[23.09 10:23:56]
sed를 사용하여 "빈" 줄(타임스탬프만 포함하는 줄)을 제거하려고 합니다. 나는 다음을 시도했습니다 :
sed -i '/\[\d{1,2}\.\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}\] ($|\R)/d' file
sed -i '/\[[0-9][0-9]?\.[0-9][0-9]? [0-9][0-9]?:[0-9][0-9]?:[0-9][0-9]?\] \n/d' file
sed -i '/\[[0-9][0-9]?\.[0-9][0-9]? [0-9][0-9]?:[0-9][0-9]?:[0-9][0-9]?\] ($|\R)/d' file
하지만 아무것도 작동하지 않는 것 같습니다.
도움을 주시면 감사하겠습니다!
답변1
내가 아는 한, 줄 시작 부분의 괄호 안의 날짜 문자열과 일치하는 표현식을 만들 필요가 없습니다.
$ grep -v -x '\[[^]]*\][[:blank:]]*' file
[23.09 10:23:56] Some other thing
[23.09 10:23:56] Something
위의 명령은 [like this]
대괄호로 묶인 문자열( )로 시작하고 선택적 후행 공백만 포함하는 줄을 제거합니다.
그걸로 sed
, 이것은 다음과 같습니다
$ sed '/^\[[^]]*\][[:blank:]]*$/ d' file
[23.09 10:23:56] Some other thing
[23.09 10:23:56] Something
표현식은 \[[^]]*\]
리터럴로 시작하고 [
그 뒤에 0개 이상의 비문자가 오고 ]
마지막으로 리터럴이 옵니다 ]
.
를 사용하여 awk
필드 구분 기호를 로 설정할 수 있습니다 ][[:blank:]]*
. 즉, ]
끝에 있는 타임스탬프(및 그 뒤의 모든 공백)가 두 필드 사이의 구분 기호가 됩니다. 두 번째 필드가 비어 있으면 현재 줄을 인쇄하지 않습니다.
$ awk -F '][[:blank:]]*' '$2 != ""' file
[23.09 10:23:56] Some other thing
[23.09 10:23:56] Something
~처럼콰지모도awk 'NF > 2' file
을 사용하면 질문에 제공된 예제 데이터에서도 작동한다는 의견 (현재 삭제됨)에서 지적되었습니다 . 이 방법은 awk
기본적으로 행이 빈 필드로 분할된다는 사실에 의존합니다. 이 변형은 각 행의 세부정보를 고려하지 않으며 공백으로 구분된 필드가 2개 이상인 행을 제외한 모든 행을 삭제합니다.
답변2
sed '/^\[[0-9]\{1,2\}\.[0-9]\{1,2\} [0-9]\{1,2\}:[0-9]\{1,2\}:[0-9]\{1,2\}\] $/ d'
- sed는 지원되지 않습니다
\d
. - 수량자는
{...}
백슬래시로 묶어야 합니다( 를 사용하지 않는 한-E
). - 대안은
|
백슬래시여야 합니다(-E
사용 하지 않는 한). - 선택적 기호는
?
백슬래시여야 합니다(-E
사용 하지 않는 한).