정규식을 사용하여 AIX의 로그 파일 문자열(아래 코드)에서 날짜와 타임스탬프를 추출 $Data
하고 이를 다음과 같은 텍스트 파일에 로드하려고 합니다.
Data="Logs/2018-12-03/log.txt:3:2018-12-03 00:00:04,333 452621453 [blah blah blah"
echo "$data" | grep -o -n '[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1]) (2[0-3]|[01][0-9]):[0-5][0-9]' > timestamps.txt
내 호스트의 Unix 버전이 너무 오래되어 옵션을 인식하지 못하기 때문에 다음과 같은 오류가 발생할 가능성이 높습니다 -o
. 기능을 수행하는 다른 방법이 있습니까 -o
?
grep: Not a recognized flag: o
Usage: grep [-r] [-R] [-H] [-L] [-E|-F] [-c|-l|-q] [-insvxbhwyu] [-p[parasep]] -e pattern_list...
[-f pattern_file...] [file...]
Usage: grep [-r] [-R] [-H] [-L] [-E|-F] [-c|-l|-q] [-insvxbhwyu] [-p[parasep]] [-e pattern_list...]
-f pattern_file... [file...]
Usage: grep [-r] [-R] [-H] [-L] [-E|-F] [-c|-l|-q] [-insvxbhwyu] [-p[parasep]] pattern_list [file...]
답변1
-o
구현에서 정규식을 인식하더라도 작동하지 않습니다 grep
. 또한 -E
확장 정규식을 활성화 해야 합니다 . 아마도 당신이 가지고 있다고 가정하면 perl
다음을 시도해 볼 수 있습니다.
$ Data="Logs/2018-12-03/log.txt:3:2018-12-03 00:00:04,333 452621453 [blah blah blah"
$ echo "$Data" | perl -lne '/[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1]) (2[0-3]|[01][0-9]):[0-5][0-9]/ && print "$.:$&"'
1:2018-12-03 00:00
하지만 정규 표현식을 그렇게 복잡하게 만들 필요가 있나요? 이 정도면 충분하지 않나요?
$ echo "$Data" | perl -lne '/\d{4}-\d{2}-\d{2} \d{2}:\d{2}/ && print "$.:$&"'
1:2018-12-03 00:00