#include #include #include #define MAX_LINE 1024 // 사용법: // 1. 파일 읽기: grep // 2. 파이프(Stdin): cat file | grep int main(int argc, char *argv[]) { // 최소한 패턴은 있어야 함 if (argc < 2) { printf("Usage: grep [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; }