以下是50个实用的awk
、sed
和grep
实战题目,涵盖文本处理、日志分析、数据提取等常见场景:
一、grep 实战题(15个)
查找包含”error”的行
grep "error" logfile
忽略大小写搜索”warning”
grep -i "warning" file.txt
统计匹配”success”的行数
grep -c "success" data.log
显示不包含”debug”的行
grep -v "debug" app.log
递归搜索目录下所有Python文件中的”import”
grep -r "import" --include="*.py" /path/
匹配IPv4地址
grep -Eo "([0-9]{1,3}\.){3}[0-9]{1,3}" access.log
查找空行并显示行号
grep -n "^$" file.txt
匹配以”#”开头的注释行
grep "^#" config.conf
查找包含数字的行
grep "[0-9]" data.txt
匹配精确单词”fail”(非子串)
grep -w "fail" logfile
显示匹配行及其后2行
grep -A 2 "panic" system.log
匹配邮箱地址
grep -Eo "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" contacts.txt
查找2023年的日志条目
grep "2023-" server.log
统计所有Java文件中”public”的出现次数
grep -ro "public" --include="*.java" . | wc -l
静默检查是否存在”ready”标记
grep -q "ready" status.txt && echo "Found"
二、sed 实战题(15个)
替换所有”foo”为”bar”
sed 's/foo/bar/g' file.txt
删除空行
sed '/^$/d' input.txt
替换每行第2个”cat”为”dog”
sed 's/cat/dog/2' pets.txt
删除1-5行
sed '1,5d' data.txt
在行首添加注释符”# “
sed 's/^/# /' config.conf
删除HTML标签
sed 's/<[^>]*>//g' page.html
替换冒号分隔文件的第3列
sed 's/\([^:]*:[^:]*:\).*/\1new_value/' passwd.txt
在匹配行后插入新行
sed '/pattern/a\new line' file
将DOS换行符(CRLF)转为Unix格式(LF)
sed 's/\r$//' dosfile.txt > unixfile.txt
仅打印第10-20行
sed -n '10,20p' log.txt
原地修改文件(备份原文件)
sed -i.bak 's/old/new/g' file.txt
将多行合并为一行(用空格分隔)
sed ':a;N;$!ba;s/\n/ /g' multiline.txt
删除行尾空格
sed 's/[[:space:]]*$//' file.txt
将大写字母转换为小写
sed 's/[A-Z]/\L&/g' mixed.txt
提取两个标记之间的内容
sed -n '/START/,/END/p' data.txt
三、awk 实战题(20个)
打印文件第1列和第3列
awk '{print $1, $3}' table.csv
统计文件行数
awk 'END{print NR}' data.txt
计算第2列的总和
awk '{sum+=$2} END{print sum}' numbers.txt
打印长度大于80字符的行
awk 'length($0) > 80' longlines.txt
处理冒号分隔文件(如/etc/passwd)
awk -F: '{print $1, $6}' /etc/passwd
求第3列的平均值
awk '{sum+=$3} END{print sum/NR}' data.txt
过滤第2列大于100的行
awk '$2 > 100' sales.txt
去重显示第1列
awk '!seen[$1]++{print $1}' duplicates.txt
打印行号及内容
awk '{print NR, $0}' file.txt
反转字段顺序
awk '{for(i=NF;i>=1;i--) printf "%s ",$i; print ""}' words.txt
统计IP访问次数(Nginx日志)
awk '{ip[$1]++} END{for(i in ip) print i, ip[i]}' access.log
提取JSON中的特定字段
awk -F'"' '/"name":/{print $4}' data.json
合并多个文件并添加文件名前缀
awk '{print FILENAME, $0}' file1.txt file2.txt
条件格式化输出
awk '{printf "Name: %-10s Score: %5d\n", $1, $2}' grades.txt
处理CSV文件(跳过标题行)
awk -F, 'NR>1{print $2}' data.csv
按第3列数值降序排序
awk '{print $0}' data.txt | sort -nk3
分组统计(按第1列分组求和)
awk '{sum[$1]+=$3} END{for(i in sum) print i, sum[i]}' sales.txt
计算文件MD5校验和
awk '{content=content $0} END{print content | "md5sum"}' file.txt
提取两个时间戳之间的日志
awk '/2023-01-01 10:00/,/2023-01-01 11:00/' server.log
复杂条件处理(嵌套if)
awk '{if($2>90) grade="A"; else if($2>80) grade="B"; else grade="C"; print $1, grade}' scores.txt
四、综合挑战题(附加5个)
提取Nginx日志中状态码为404的URL
awk '$9==404{print $7}' access.log | sort | uniq -c
批量重命名文件(添加前缀)
ls | awk '{print "mv "$0" prefix_"$0}' | bash
删除配置文件中的重复行(保留顺序)
awk '!seen[$0]++' config.conf
统计Java方法的行数
sed -n '/public.*void/,/^}/p' Class.java | wc -l
分析磁盘空间占用(过滤大于1GB的目录)
du -sk * | awk '$1>1048576{print $2}'
这些题目覆盖了文本处理的常见需求,建议逐步练习以掌握三剑客的强大功能!
最后编辑:admin 更新时间:2025-05-29 13:26