首页 > 代码库 > sed和awk简介
sed和awk简介
什么是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()!\n");
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()!\n");
return 1;
}
windeal@ubuntu:~/Windeal/Test$
在动作脚本中 \\t是为了在return前面插入tab,需要两个转义字符
使用-f脚本选项,在第6行前面插入printf("Hello!\n"); 并将第5行的Main替换为MyMain
windeal@ubuntu:~/Windeal/Test$ sed -f script test.c
#include <stdio.h>
int main()
{
printf("This is MyMain()!\n");
printf("hello!\n");
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 "\t" $1 "\t" $3 "\t" $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\n",$1,$2,$3,$4,"Sum"}\
NR>=2{Sum=$3+$4
printf "%10s %10s %10s %10s %10s\n",$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 后面需要换行,还不清楚为什么。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。