나의 현재 회사 로그 보기 경험은 끔찍합니다. 특정 기간 내에 정리된 로그에 새 행을 추가하고 싶습니다. 매 날짜마다 새로운 라인을 얻고 싶습니다.
날짜와 시간 형식은 다음과 같습니다.
2023-10-03 15:34:37
가능하다는 것은 알지만 tr
어떻게 해야 할지 모르겠습니다. 최선의 답변을 선택하겠습니다. 누구든지 새 파일에 새 콘텐츠를 작성하는 방법을 알려줄 수 있습니까? 성능상의 이유 때문입니다. 나는 vi를 사용하는 것을 좋아하지 않으며 로그 리더로는 덜 사용합니다.
답변1
에서는 vim
다음을 수행할 수 있습니다.
:%s/\v^\d{4}(-\d{2}){2} \d{2}(:\d{2}){2}.*/&\r
참고 \v
하세요환상적이다따라서 각 항목 앞에 백슬래시를 추가할 필요가 없습니다 {}()
.
예, \r
대체(선을 두 부분으로 나눕니다.:help s/\r
예상되는 캐리지 리턴 문자 대신 )의 문구를 사용하십시오 .
존재하다기준vi
( \d
, \v
, \r
는 norm
모두 vim
확장자입니다.) 이에 상응하는 내용은 다음과 같습니다.
:%s/^[[:digit:]]\{4\}\(-[[:digit:]]\{2\}\)\{2\} [[:digit:]]\{2\}\(:[[:digit:]]\{2\}\)\{2\}.*/&^M/
^M
Ctrl+를 눌러 V입력합니다 Enter(그리고 ^J
CR(캐리지 리턴이라고도 함) 대신 LF(라인 피드라고도 함)를 다시 삽입합니다 ^M
.)
그러나 vi
CentOS의 구현은 (적어도 CentOS 4만큼 빨랐습니다) 따라서 확장 기능을 vim
사용할 수 있습니다 .vim
vi
어쨌든 tr
음역, 문자를 다른 문자로 바꾸거나 제거하거나 압착하는 도구이므로 여기서는 사용할 수 없습니다.
sed
, awk
또는 (AFAIK, Perl에서 파생된 정규식 연산자)를 perl
사용할 수 있습니다 .\d
perl -pi -e '$_ .= "\n" if /^\d{4}(-\d{2}){2} \d{2}(:\d{2}){2}/' your-file
파일 i
n을 편집합니다. 또는:
perl -p -e '$_ .= "\n" if /^\d{4}(-\d{2}){2} \d{2}(:\d{2}){2}/' < your-file > new-file
결과를 새 파일에 넣습니다.
또는 Regex::Common::time
모듈을 사용할 수 있다고 가정하면 다음과 같습니다.
perl -MRegexp::Common=time -p -e '
$_ .= "\n" if m{^$RE{time}{strftime}{-pat=>"%Y-%m-%d %H:%M:%S"}}
' < your-file > new-file
2023-13-00 25:61:62
이렇게 하면 더 엄격한 일치가 이루어집니다(예: 일치하지 않음). 이러한 날짜와 일치하는 날짜가 있지만 $RE{time}{iso}
날짜 또는 시간 구성 요소가 없어 여기에서 사용할 수 없는 일부 날짜를 포함하여 ISO8601 날짜의 다른 변형도 많이 있습니다.
다음을 사용하여 실제 정규식을 볼 수 있습니다.
$ perl -MRegexp::Common=time -le 'print $RE{time}{strftime}{-pat=>"%Y-%m-%d %H:%M:%S"}'
(?:(?:\d{4})-(?:(?:(?=[01])(?:0[1-9]|1[012])))-(?:(?:(?=[0123])(?:0[1-9]|[12]\d|3[01]))) (?:(?:(?=[012])(?:[01]\d|2[0123]))):(?:(?:[0-5]\d)):(?:(?:(?=[0-6])(?:[0-5]\d|6[01]))))
답변2
이 명령은 다음과 같습니다.
누르고 :들어가세요
g/\v\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/normal o
설명하다:
g
: global의 약어로, 정규식과 일치하는 모든 라인에 대해 명령을 실행합니다.\v
: 정규 표현식 만들기"환상적"(실명). 특수 문자를 이스케이프 처리할 필요가 없다는 뜻입니다./^\d\{4\}-\d\{2\}-\d\{2\} \d\{2\}:\d\{2\}:\d\{2\}/
:은 정규식입니다. 다음과 같은 도구에 넣으십시오.https://regexr.com/또는https://regex101.com/, 그들은 그것을 아주 잘 설명했습니다normal o
: 공통 명령 실행 매개변수일반 모드. 이 경우 누르면o
새 줄이 열립니다.
공식 문서의 설명을 읽어보세요:
:help global
, :help \v
,:help normal