Day6
今日问答10-28
- touch命令可以刷新文件的哪些元数据?
答:会刷新文件的时间戳信息,刷新文件的访问时间(atime),修改时间(mtime),状态改变时间(ctime) - 怎么查看文件的SeLinux信息?
答:使用ls -Z file可以查看文件内的selinux信息
三剑客(grep,sed,awk)
grep
常用参数注解
- -i: 忽略大小写
- -r: 递归查询
- -n: 显示行号
- -E/egrep: 扩展正则
- -v: 取反
- -c: 统计行数
- -C 1: 显示查询行并显示上下各一行
基础练习:精确匹配与简单模式
- 显示所有包含 “Apple” 的行。
grep 'Apple' grep-practice.txt - 显示所有包含 “apple” 的行(区分大小写)。
grep 'apple' grep-practice.txt - 显示所有包含数字的行。
grep [0-9] grep-pracrive.txt - 显示所有以 “Hello” 开头的行。
grep '^Hello' grep-practice.txt - 显示所有以 “!” 结尾的行。
grep '!$' grep-practice.txt
进阶练习:正则与选项应用
- 忽略大小写,显示所有包含 “apple” 的行。
grep -i 'apple' grep-practice.txt - 显示所有包含字母 “a” 或 “b” 的行。
grep [ab] grep-practice.txt - 显示所有包含 3 个连续小写字母的行。
grep '[a-z]{3}' grep-practice.txt - 统计所有包含 “is” 的行数。
grep -c 'is' grep-practice.txt - 显示所有不包含 “fruit” 的行。
grep -v 'fruit' grep-practice.txt
高级练习:上下文与复杂匹配
- 显示包含 “special” 的行,并显示其上下各 1 行的内容。
grep -C 1 'special' grep-practice.txt - 显示第 3 行到第 5 行中包含 “red” 的行。
grep -n 'red' grep-practice.txt | egrep '^[3-5]:' - 显示所有包含 “[0-9]” 形式数字的行(注意正则转义)。
grep '\[[0-9]\]' grep-practice.txt - 显示所有包含 “pie” 且行号为偶数的行。
grep -n 'pie' grep-practice.txt | egrep '^[0-9]*[24680]:'
sed
常用参数注解
- -n: 抑制默认输出,仅当显式使用p时才输出
- -i: 插入,使用该参数会直接修改文件内容
- -r: 转义,使用该参数后{}将不需要使用转义符
- s,i,a,d: 替换,插入,追加,删除
基础练习:行操作与简单替换
- 删除 sed-practice.txt 的第 3 行。
sed '3d' sed-practice.txt - 删除 sed-practice.txt 的第 2 行到第 5 行。
sed '2,5d' sed-practice.txt - 将 sed-practice.txt 中所有包含 “sed” 的单词替换为 “SED”。
sed 's/sed/SED/g' sed-practice.txt
进阶练习:正则与分组引用
- 提取 sed-practice.txt 中所有数字,如(12345、67890),并输出。
sed -r -n 's/.*:([0-9]+).*/ \1/p' sed-practice.txt - 将 sed-practice.txt 中日期格式 2025-10-28 改为 2025/10/28。
sed -r 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\1/\2/\3/' sed-practice.txt - 只打印 sed-practice.txt 中包含 “line” 的行。
sed -r -n '/line/p' sed-practice.txt
综合练习:多命令组合
- 删除 sed-practice.txt 的第 1 行,将所有 “is” 替换为 “IS”,并只打印包含 “Linux” 的行。
sed '1d; s/is/IS/g; /Linux/p' sed-practice.txt
awk
第一阶段:基础练习(字段提取、行操作)
- 使用 student.txt,打印所有学生的 “姓名” 和 “成绩”(第 2 列和第 6 列)。
awk '{print $2,$6}' student.txt - 使用 student.txt,打印第 3 行到第 5 行的内容。
awk 'NR==3,NR==5' student.txt - 使用 score.csv(CSV 格式),打印所有学生的 “学号” 和 “成绩”(第 1 列和第 4 列)。
awk -F, '{print $1,$4}' score.csv - 使用 student.txt,打印所有行的 “整行内容” 和 “行号”(行号在前,内容在后)。
awk '{print NR,$0}' student.txt
第二阶段:进阶练习(条件筛选、正则匹配)
- 使用 student.txt,筛选出 “性别为女” 的学生,打印其姓名和成绩。
awk '$3=="女"{print $2,$6}' student.txt - 使用 student.txt,筛选出 “数学” 科目的学生,且成绩大于 80 分,打印其姓名和成绩。
awk '$5=="数学" && $6>80 {print $2,$6}' student.txt - 使用 score.csv,筛选出 “班级为一班” 且 “成绩≥85 分” 的学生,打印其姓名和成绩。
awk -F, '$5=="一班" && $4 >=85 {print $2,$4}' score.csv - 使用 student.txt,筛选出 “姓名以‘张’开头” 的学生,打印整行内容。
awk '$2~/^张/{print $0}' student.txt
第三阶段:高级练习(统计计算、文本处理)
- 使用 student.txt,计算所有学生的 “成绩总和” 和 “平均成绩”,并格式化输出。
awk '{sum+=$6;count++}END{print "成绩总和:",sum;print"平均成绩:",sum/count}' - 使用 student.txt,统计 “数学” 科目和 “英语” 科目的学生人数,分别输出。
awk '$5=="数学"{math++} $5=="英语"{english++}END{print "数学人数:",math; print "英语人数:",english}' student.txt - 使用 score.csv,给输出结果添加表头 “姓名 科目 成绩”,再打印所有学生的对应信息。
awk -F, 'BEGIN{print "姓名\t科目\t成绩"}{print $2,$3,$4}' score.csv - 使用 student.txt,将所有 “数学” 科目替换为 “高等数学”,打印修改后的整行内容。
awk '$5=="数学"{$5="高等数学"}{print $0}' student.txt
第四阶段:综合练习(多文件关联、复杂逻辑)
- 关联 score.csv 和 class.txt,根据 “班级” 匹配班主任,打印 “姓名 班级 班主任”(例如:张三 一班 班主任:王老师)。
awk -F, 'NR==FNR {class_tea[$1]=$2; next}{print $2,$5,class_tea[$5]}' class.txt score.csv - 使用 student.txt,统计 “男生” 和 “女生” 的平均成绩,分别输出(格式:性别:X,平均成绩:X)。
awk '$3=="女"{sum1+=$6;count1++}$3="男"{sum2+=$6;count2++}{print "性别:男,平均成绩:",sum2/count2;print "性别:女,平均成绩:",sum1/count1}' student.txt
awk数组
1 | 示例: awk -F, '{count[$1]++}END{for(word in count) print word"的次数:"count[word]}' word.CSV |
awk的数组是以键值对的方式存取,下标是字符,所以,取用数组中的value或者变动数组中的value都要以他的下标进行调用。
在示例中,count[$1]是取文件的第一列的值作为下标,因为该文件的单词都在第一列;当数组检测到对应单词在数组中没有该单词,就会在数组中新建一对键值对,值value就是++,表示加一,如果数组中有对应单词,就会在原value上+1,最终达到单词计数的目的。






