grep
오늘부터 다음 형식의 MySQL 오류 로그가 필요합니다 .
`date +"%y%m%d"` (140710)
해당 단어의 모든 인스턴스를 찾습니다 partitioned
.
나는 다양한 방법을 시도했지만 아무 소용이 없었습니다. 이것은 작동하는 것 같습니다:
more +/"`date +"%y%m%d"`" mysql-error.log | grep -c partitioned
그러나 로그 파일에 오늘 항목이 포함되어 있지 않으면 0을 반환하는 대신 전체 파일을 검색하여 전체 파일의 번호를 반환합니다.
오늘 항목이 없으면 전체 파일이 아닌 grep
0을 반환하고 결과를 계산해야 합니다 .
sed
이 작업 을 수행하는 더 좋은 방법이 있습니까 awk
?
기술적으로 계산해야 할 내용 } partitioned {
뒤에는 영숫자 문자열 })이 옵니다. 분할된 {(문자열 없음)}이 있을 수 있으므로 계산해서는 안 되기 때문입니다.
그러나 이는 엄격한 요구 사항은 아닙니다. 나는 단어의 발생 횟수를 세는 것만으로도 행복합니다 partitioned
.
다음은 로그 파일의 예입니다.
140109 12:25:07 [Note] WSREP: view(view_id(PRIM,c4819ddf-7952-11e3-89fc-4f9f1bfa267f,3) memb {
c4819ddf-7952-11e3-89fc-4f9f1bfa267f,
} joined {
} left {
} partitioned {
f85c2e70-7952-11e3-a759-aa8332246e85,
})
140109 12:25:07 [Note] WSREP: Shifting JOINED -> SYNCED (TO: 85)
답변1
GNU sed
anhd 를 사용하면 grep
다음을 시도해 볼 수 있습니다.
sed -n "/$(date +%y%m%d)/,\$p" file | grep -c partitioned
/pattern/,$
첫 번째 패턴을 파일의 끝과 일치시킵니다.
귀하의 의견을 바탕으로:
$ sed -n "/$(date +%y%m%d)/,\$p" 1.txt | grep -c partitioned
1
일치하는 날짜가 없습니다:
$ sed -n "/$(date +%y%m%d)/,\$p" 1.txt | grep -c partitioned
0
답변2
두 개의 grep을 함께 연결해 볼 수 있습니다.
grep `date +"%y%m%d"` mysql-error.log | grep -c partitioned
아니면 더 간단합니다:
grep -c "`date +%y%m%d`.*partitioned" mysql-error.log
편집하다
날짜와 "partitioned"라는 단어가 다른 줄에 있으므로:
d=$(date +"%y%m%d"); awk '/'$d'/,EOF {print $0}' mysql-error.log | grep -c partitioned
또는:
awk '/'$(date +%y%m%d)'/,EOF {print $0}' mysql-error.log | grep -c partitioned