什么是sed和awk
sed和awk是Linux环境下数据的处理工具,可以完成对数据的增删改查的功能。
sed处理时是以行尾单位的,awk处理数据时以字段为单位。
sed
用法:sed 【选项】 【动作】 【文件】
以行为处理单位
选项:
-n:安静模式,仅显示被处理的行,如果改行是被删除的,则不显示
-e:add the script to the commands to be executed(用于连接多个动作脚本)
-r:表示命令使用的动作时延伸型的正则表达式
-i:直接在文件上进行编辑,而不是输出到屏幕上
-f:使用脚本文件,即动作编辑在脚本文件中,支持一个脚本文件中使用多个动作
动作:[n1[,n2]]function
[n1[,n2]]不一定有,function如下:
c:行取代,用新行(字符串)替换旧行
d:删除行
i: 在当前行前面插入一行数据(字符串)
p:打印行
s:s/regexp/replacement/ 用新字符串替换旧字符串。s后面接分隔符,默认为/
练习:
测试文件:test.c
#include <stdio.h> int main() { printf("This is Main()! "); return 0; }
删除第2行,并用 return 1; 取代第6行
windeal@ubuntu:~/Windeal/Test$ sed -e '2d' -e '6c \treturn 1;' test.c #include <stdio.h> int main() { printf("This is Main()! "); return 1; } windeal@ubuntu:~/Windeal/Test$
在动作脚本中 \t是为了在return前面插入tab,需要两个转义字符
使用-f脚本选项,在第6行前面插入printf("Hello!
"); 并将第5行的Main替换为MyMain
windeal@ubuntu:~/Windeal/Test$ sed -f script test.c #include <stdio.h> int main() { printf("This is MyMain()! "); printf("hello! "); return 0; } windeal@ubuntu:~/Windeal/Test$
awk
用法:
1 mawk [-W option] [-F value] [-v var=value] [--] 'program text' [file ...] 2 mawk [-W option] [-F value] [-v var=value] [-f program-file] [--] [file ...]
用法1和2的区别在于是直接使用脚本命令还是有脚本文件,即脚本是直接使用还是写在一个文件里
选项
-W 表示一些特殊选项(还没怎么用到过)
-F 表示分隔符
-v 定义变量,或给变量赋值
-f 使用脚本
特殊变量
NF 每行的字段数
NR 当前处理行
FS 分隔符
脚本形式:
An AWK program is a sequence of pattern {action} pairs
and function definitions.
即又[条件][动作] [条件][动作]...组成
[条件]支持逻辑运算符 < > = >= <= ==
支持格式化输出和if语句
练习:
测试数据 stu.txt
No. Name Chinese Math 001 Jack 80 85 002 Jane 90 90 003 Ben 85 90 004 Alice 85 95
1. 输出行号,第1个字段、第3个字段、第4个字段
windeal@ubuntu:~/Windeal/Test$ awk '{print "line:" NR " " $1 " " $3 " " $4}' stu.txt line:1 No. Chinese Math line:2 001 80 85 line:3 002 90 90 line:4 003 85 90 line:5 004 85 95 windeal@ubuntu:~/Windeal/Test$
注意所有文本要使用双引号
2.输出数学考90的同学
windeal@ubuntu:~/Windeal/Test$ awk 'NR==1 {print} NR>1&&$4==90{print}' stu.txt No. Name Chinese Math 002 Jane 90 90 003 Ben 85 90 windeal@ubuntu:~/Windeal/Test$
3 支持格式化输出和if语句
windeal@ubuntu:~/Windeal/Test$ awk '{if(NR==1) printf "%10s %10s %10s %10s %10s ",$1,$2,$3,$4,"Sum"} NR>=2{Sum=$3+$4 printf "%10s %10s %10s %10s %10s ",$1,$2,$3,$4,Sum}' stu.txt No. Name Chinese Math Sum 001 Jack 80 85 165 002 Jane 90 90 180 003 Ben 85 90 175 004 Alice 85 95 180 windeal@ubuntu:~/Windeal/Test$
Sum=$3+$4
后面需要换行,还不清楚为什么。