53 lines
1.4 KiB
C
53 lines
1.4 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#define MAX_LINE 1024
|
|
|
|
// 사용법:
|
|
// 1. 파일 읽기: grep <pattern> <filename>
|
|
// 2. 파이프(Stdin): cat file | grep <pattern>
|
|
int main(int argc, char *argv[]) {
|
|
// 최소한 패턴은 있어야 함
|
|
if (argc < 2) {
|
|
printf("Usage: grep <pattern> [filename]\n");
|
|
return 1;
|
|
}
|
|
|
|
char *pattern = argv[1];
|
|
FILE *fp;
|
|
|
|
// 인자가 2개면 (grep pattern) -> 표준 입력(stdin) 사용
|
|
if (argc == 2) {
|
|
fp = stdin;
|
|
}
|
|
// 인자가 3개 이상이면 (grep pattern file) -> 파일 열기
|
|
else {
|
|
fp = fopen(argv[2], "r");
|
|
if (!fp) {
|
|
perror("grep");
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
char line[MAX_LINE];
|
|
|
|
// fp가 파일이든 stdin이든 똑같이 읽음
|
|
while (fgets(line, sizeof(line), fp)) {
|
|
// strstr: 부분 문자열 찾기
|
|
if (strstr(line, pattern) != NULL) {
|
|
printf("%s", line);
|
|
|
|
// 입력에 개행이 없는 경우(드물지만)를 대비해 안전장치
|
|
// (보통 fgets가 개행까지 읽어오므로 중복 개행 방지 로직 필요시 추가)
|
|
// 여기서는 단순하게 그대로 출력
|
|
}
|
|
}
|
|
|
|
// 파일일 때만 닫아줌 (stdin은 닫으면 안 됨)
|
|
if (argc > 2) {
|
|
fclose(fp);
|
|
}
|
|
|
|
return 0;
|
|
} |