OS-lab0-课上

Dracary 发布于 2026-03-20 299 次阅读


lab0-exam

比较简单的Makefile题目

题目大致需求为:

执行make或者make run会处理三个依赖:casegen ver1 ver2,接着分别运行casegen ver1 ver2

目标ver1依赖公共文件和calc1.c,编译产物为同级目录下的ver1

目标ver2依赖公共文件和calc2.c,编译产物为同级目录下的ver2

目标casegen依赖casegen.c,编译产物为同级目录下的casegen

执行make clean会清除该目录下的casegen ver1 ver2 *.txt

同时要求加入.PHONY来忽略文件区的run clean all对于make指令的影响

include makefile.inc

COMMON_FILE = main.c post_calc.c common.h

run: casegen ver1 ver2
# TODO: fill the remaining commands
        ./casegen $(CASE_NUM) $(INPUT_FILE)
        ./ver1 $(INPUT_FILE)
        ./ver2 $(INPUT_FILE)

# TIPS: casegen, instead of casegen.c , is one of the dependencies, why?
all: casegen ver1 ver2   # TODO: fill the remaining dependency

ver1: $(COMMON_FILE)  calc1.c # TODO: fill the remaining dependency
# TODO: fill the remaining commands
        gcc $(COMMON_FILE) calc1.c -o ver1

ver2: $(COMMON_FILE)  calc2.c  # TODO: fill the remaining dependency
# TODO: fill the remaining commands
        gcc $(COMMON_FILE) calc2.c -o ver2

casegen: casegen.c 
        gcc casegen.c -o casegen

clean:
# TODO: fill the clean command
        rm -rf casegen ver1 ver2 *.txt
# TODO: setup PHONY rules
.PHONY: clean all run

lab0-exra

评价为调试时一定不要自己造数据或者只用瞪眼法,直接使用本地提供的数据调试

题目要求写一个脚本来分析处理某logs的访问日志和错误日志

脚本格式为bash analyze.sh date,其中date的格式为xxxx-xx-xx,文件的树状结构如下:

logs/
├── 2025-04-06
├── 2025-04-15
├── 2025-05-18
├── 2025-06-14
├── 2025-06-20
├── 2025-06-23
├── 2025-07-12
├── 2025-07-22
├── 2025-08-08
├── 2025-10-11
├── 2025-10-22
├── 2025-11-02
├── 2025-12-05
├── 2025-12-07
└── 2025-12-16
    ├── access.log
    └── error.log

接下来是具体要求:

首先判断参数是否存在,不存在打印提示信息并且退出:

if [ $# -eq 0 ]; then
    # 打印消息,立即退出
    echo "analyze.sh: No date provided"
    exit
fi

如果存在就依次进行以下操作,在logs同级目录下新建文件夹reports

新建的所有文件夹权限为775,新建的所有文件权限为664

这里就直接每次新建文件(夹)的时候后面直接加chmod,不像某人以为可以一开始直接递归使用chmod,结果浪费大量时间,此外最外面的大文件夹也一定要chmod

LOG_DIR="logs"
REPORT_DIR="reports"
DAY=$1
mkdir -p $REPORT_DIR/$DAY
chmod 775 $REPORT_DIR
chmod 775 $REPORT_DIR/$DAY

接着题目要求提取给定日期的错误日志中含有ERROR的部分并且输出到reports的同名文件下

errors=$(grep "ERROR" "$error_src")
if [ $? -eq 0  ]; then
    # 仅当结果非空时保存
    echo "$errors" > $REPORT_DIR/$DAY/error.log
    chmod 664 $REPORT_DIR/$DAY/error.log
fi

我只能说如果echo "$errors"你不加双引号,你DEBUG会很痛苦的,它直接吞了所有的换行符

其次就是对给定文件的字符串替换,替换结果保存到同名目录下

sed 's|/127.0.0.1|/localhost|g'  "$access_src" > $REPORT_DIR/$DAY/access.log

唯一需要注意的点,就是此处执行sed命令行时使用|而不是/

最后就是管道综合题目,要处理的文件格式大概是这样:

192.168.1.1 - - [2025-04-15:00:01:32 +0800] POST /search?q=test HTTP/1.1 404 0
172.16.0.3 - - [2025-04-15:00:04:50 +0800] GET /about HTTP/2.0 200 2048
127.0.0.1 - - [2025-04-15:00:05:13 +0800] GET /127.0.0.1/admin HTTP/2.0 200 768
10.0.0.2 - - [2025-04-15:00:19:03 +0800] DELETE /index.html HTTP/2.0 200 0
172.16.0.3 - - [2025-04-15:00:20:06 +0800] DELETE /contact HTTP/2.0 301 512

其中各列以空格分割,要求统计首列的出现次数并按照该次数从大到小输出,每行输出格式为IP 次数

cat $access_src | cut -d' ' -f1 | sort -r | uniq -c | sed 's/^ *//' | sort -k1,1nr | awk '{print $2" "$1}' > $REPORT_DIR/$DAY/summary.txt

这里有个坑点就是如果你使用cut进行分割,需要显示指定分隔符为空格,也就是cut -d' ' -f1,因为它默认分隔符为制表符;如果使用awk进行分割,因为它的默认分隔符为空白(空格和制表符),所以不需要显示指定,直接awk '{print $1}'即可

不要忘了所有新建文件后加上chmod 664

这里是紫罗兰的永恒花园
最后更新于 2026-03-24