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

Comments 1 条评论
👍👍