GMS Linux: start?
This commit is contained in:
@@ -0,0 +1,15 @@
|
||||
TARGET = grep
|
||||
SRCS = grep.c
|
||||
CC = gcc
|
||||
CFLAGS = -static -Wall
|
||||
|
||||
OUT_BIN ?= $(TARGET)
|
||||
|
||||
all: $(OUT_BIN)
|
||||
|
||||
$(OUT_BIN): $(SRCS)
|
||||
@echo " [CC] Compiling to $(OUT_BIN)..."
|
||||
$(CC) $(CFLAGS) -o $@ $^
|
||||
|
||||
clean:
|
||||
rm -f $(TARGET)
|
||||
@@ -0,0 +1,53 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user