# 行编辑器
vi/vim 称为全文本编辑器,sed 和 awk 称为行编辑器
# 一、sed
# 1. sed 的基本工作方式:
- 将文件以行为单位读取到内存中
- 使用 sed 的每个命令对该行进行操作
- 处理完成后输出该行
# 2. 替换命令 s
| sed 's/old/new/' filepath |
| sed -e 's/old/new/' -e 's/old/new/' filepath |
| sed -i 's/old/new' filepath |
| sed 's/正则表达式/new/' filepath |
| sed -r 's/扩展正则表达式/new/' filepath |
案例
| |
| head -5 /etc/passwd > afile |
| |
| sed 's/root/chendong/' afile |
| |
| sed 's:/:~:' afile |
| |
| sed -e 's/x/aa/' -e 's/aa/bb/' afile |
| |
| sed 's/x/aa/;s/aa/bb/' afile |
| |
| sed -i 's/x/bb/' afile |
| |
| sed 's/..//' afile |
| sed 's/s*bin//' afile |
| sed -r 's/s+bin//' afile |
| sed 's/^root//' afile |
# 3. 替换命令的更多选项
| sed 's/old/new/g' filepath |
| |
| |
| sed 's/root/!!!!/g' afile |
| sed 's/root/!!!!/2' afile |
| sed '/正则表达式/s/old/new/g' filepath |
| sed '行号s/old/new/g' filepath |
| sed '行号1,行号2s/old/new/g' filepath |
| |
| |
| sed '1,3s/adm/!!!!/g' afile |
| sed '1,$s/adm/!!!!/g' afile |
| sed '/^root/s/bash/!!!/' afile |
# 4. 其他命令
| sed '[寻址]d' filepath |
| |
| |
| sed '/root/d' afile |
| sed '/root/a hello' afile |
| |
| sed '/root/i hello' afile |
| |
| sed '/root/c hello' afile |
# 二、awk
# 1. awk 流程控制
- 输入数据前 BEGIN {}
- 主输入循环 {}
- 所有文件读取完成 END {}
- 不需要写所有流程
# 2. awk 的字段
- 每行称为 awk 的记录
- 使用空格、制表符分隔开的单词称作字段
- 可以自己指定分隔的字段
| awk '{print $1, $2, $3}' filepath |
| |
| awk -F ':' '{print $1, $2, $3}' filepath |
案例:
| awk -F "'" '/^menu/{ print $2 }' /boot/grub2/grub.cfg |
| |
| awk -F "'" '/^menu/{ print x++,$2 }' /boot/grub2/grub.cfg |
# 3. awk 表达式
| var1 = "name" |
| var2 = "hello" "world" |
| var3 = $1 |
- 系统变量
- FS 字段分隔符,OFS 输出字段分隔符
- RS 记录分隔符
- NR 行数
- NF 字段数量,最后一个字段内容可以使用 NF 取出
| awk 'BEGIN{FS=":"}{print $1}' afile |
| |
| awk 'BEGIN{RS=":"}{print $0}' afile |
| |
| awk '{print NR, $0}' afile |
| |
| awk '{print NF}' afile |
# 4. 判断和循环
| if(表达式) { |
| awk语句 |
| } |
| else { |
| awk语句2 |
| } |
案例:
| |
| user1 80 90 67 |
| user2 60 67 90 |
| user3 82 87 83 |
| user4 100 75 68 |
| |
| awk '{if($2>=80) print $1}' scores.txt |
| awk '{if($2>=80) {print $1; print $2}}' scores.txt |
sum=0 ; for(i=2;i<=NF;i++) sum+=$i ; print sum
| while(表达式) { |
| awk语句 |
| } |
| |
| do { |
| awk语句 |
| }while(表达式) |
| |
| for(初始值;循环判断条件;累加) { |
| awk语句 |
| } |
案例:
| awk '{sum=0 ; for(i=2;i<=NF;i++) sum+=$i ; print sum, sum/(NF-1) }' scores.txt |
# 5. awk 数组
| awk '{sum=0 ; for(i=2;i<=NF;i++) sum+=$i ; avg[$1]=sum/(NF-1) }END{for(user in avg) sum2+=avg[user]; print sum2/NR}' scores.txt |
| sum=0 |
| |
| for(i=2;i<=NF;i++) |
| |
| sum+=$i |
| |
| avg[$1]=sum/(NF-1) |
| |
| |
| |
| for(user in avg) |
| |
| sum2+=avg[user] |
| |
| print sum2/NR |