정규식 : 특정 문자열을 포함하는 줄, 라인 판단

상황

log
1
2
3
4
5
6
7
"GET / HTTP/1.1" 200 hello world 1
"GET / HTTP/1.1" 200 hello world 2
"GET /a HTTP/1.1" 404 hello world 1
"POST / HTTP/1.1" 404 hello world 1
"GET / HTTP/1.1" 200 hello world 2
"GET / HTTP/1.1" 200 hello world 1
"POST /asd HTTP/1.1" 404 hello world 2
  • 이런 웹 로그가 있다고 하자
  • 중간에 보이는 200, 404 는 status code 이다
  • 404 에러인 라인만 뽑아서 보고싶을 때..

로그파일을 한줄씩 읽으며 정규식으로 확인하기

app.ts 전체코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import * as fs from 'fs';
import * as path from 'path';
import * as readline from 'readline';

const input_log_file_name = 'nohup20201107.out';

const input_file_path = path.join(
__dirname,
`../input files/${input_log_file_name}`
);
const output_file_path = path.join(
__dirname,
`../output files/${input_log_file_name}`
);
console.log(input_file_path);

async function processLineByLine() {
const fileStream = fs.createReadStream(input_file_path);

const rl = readline.createInterface({
input: fileStream,
crlfDelay: Infinity,
});

// 정규식
const reg404 = /^.*(404).*/;
let result_string = '';

for await (const line of rl) {
// console.log(`Line from file: ${line}`);

if (reg404.test(line)) {
// console.log(`hello : ${line}`);
result_string += line + '\r\n';
}
}

fs.writeFile(output_file_path, result_string, 'utf8', function (err) {
if (err) throw err;
console.log('file write complete');
});
}

processLineByLine();
readline으로 한줄한줄 읽기
1
2
3
4
5
6
const fileStream = fs.createReadStream(input_file_path);

const rl = readline.createInterface({
input: fileStream,
crlfDelay: Infinity,
});
  • 우선, 파일을 한줄씩 읽기위해 readline을 사용했다
정규식으로 404 문자열 포함 여부 확인
1
2
3
4
5
6
7
8
9
10
11
12
// 정규식
const reg404 = /^.*(404).*/;
let result_string = '';

for await (const line of rl) {
// console.log(`Line from file: ${line}`);

if (reg404.test(line)) {
// console.log(`hello : ${line}`);
result_string += line + '\r\n';
}
}
  • ^.*(404).* 로 정규식을 새웠다
  • ^.* ; 아무 문자로 시작하는 0개 이상의 문자열로 시작하고
  • (404) ; 404 문자열을 중간에 포함하며
  • .* ; 아무 문자열로 끝나는가
  • reg404.test(line)로 한줄한줄 확인하고
  • 참인 경우에 result_string 에 더하기
result_string 결과 새파일로 쓰기
1
2
3
4
fs.writeFile(output_file_path, result_string, 'utf8', function (err) {
if (err) throw err;
console.log('file write complete');
});
  • result_string에는 404 문자열을 포함한느 라인만 추출되었고
  • output_file_path에 해당 내용을 쓴다