Shell 学习7(awk命令)

来源:互联网 发布:电脑足球战术板软件 编辑:程序博客网 时间:2024/06/07 14:57

AWK编程


基本用法:
1 awk记录和域
awk认为输入文件是结构化的,awk将每个输入文件行定义为记录,行中的每个字符串定义为域,域之间用空格、Tab键或其他符号进行分割,分割域的符号就叫分隔符 (默认分割符是空格!!!!)eg : 
sturecord文件:zhangsan 22 beijing 010lisi 23 wuhan 027
wangwu 23 shenyang 024
此处分别有四个域 ,分割符是空格
eg : awk '{print $2,$1,$4,$3}' file1 结果:。22 zhangsan 010 beijing23 lisi 027 wuhan23 wangwu 024 shenyang($1  代表第一域!  $2第二 依次类推,而 $0  代表所有 即全域!!!!!)
eg : awk '{print $0}' file1 结果:zhangsan 22 beijing 010lisi 23 wuhan 027wangwu 23 shenyang 024
2 awk修改分割符 两种方式: -F  , FS变量
(1)-F 例子eg :file内容为:zhang san21beijing 010li si23wuhan027wang wu22chengdu024只有姓名之间是空格, 其余之间是tab默认情况下空格是分割符  所以这样只有两个域第一域 zhang  第二域: san 21 beijing 010如果要以tab为分割符,则 zhang san 这样被看作是一个域命令: awk -F"\t" '{print $2}' file2结果:212322

(2)FS变量:文件内容:zhang san,21,beijing,010li si,23,wuhan,027wang wu,22,chengdu,024eg :   awk 'BEGIN {FS=","} {print $2,$3}' file3结果:21 beijing23 wuhan22 chengdu

awk 以 域和记录来处理文件的 
sed处理的是流!!!!!!!!

3awk关系、布尔运算符、表达式:
运算符 意义
< 小于
> 大于
<= 小于等于
>= 大于等于
== 等于
!= 不等于
~ 匹配正则表达式
!~ 不匹配正则表达式
运算符 意义
|| 逻辑或
&& 逻辑与
! 逻辑非
与其他编程语言一样,awk表达式用于存储、操作和获取数据,一个awk表达式可由数值、字符常量、变量、操作符、函数和正则表达式自由组合而成
变量是一个值的标识符,定义awk变量非常方便,只需定义一个变量名并将值赋给它即可。变量名只能包含字母、数字和下划线,而且不能以数字开头
运算符 意义
+ 加
- 减
* 乘
/ 除
% 模
^或** 乘方
++x 在返回x值之前,x变量加1
x++ 在返回x值之后,x变量加1
例子: 以etc下的passwd文件为例子
1 正则表达式
eg:awk 'BEGIN {FS=”:”} $0~/root/' passwd(在passwd文件中查找 以:为分割符,全域$0与root(这个是正则表达式)匹配的行)结果:root:x:0:0:root:/root:/bin/basheg: awk 'BEGIN {FS=”:”} $0!~/root/' passwd(在passwd中查找  全域 不与root匹配的行)
2运算符eg awk 'BEGIN {FS=”:”} {if($3==7||$4==7) print $0}' passwd将第三域 或者 第四域 等于7 的记录打印出来结果:awk: 1: unexpected character 0xe2eg : awk 'BEGIN {FS=":"} {if($3~7||$4~7) print $0}' passwd将第三域 或者 第四域 包含7 的记录打印出来结果:lp:x:7:7:lp:/var/spool/lpd:/bin/shavahi-autoipd:x:106:117:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/bin/falseavahi:x:107:118:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/falsehplip:x:113:7:HPLIP system user,,,:/var/run/hplip:/bin/falsesshd:x:117:65534::/var/run/sshd:/usr/sbin/nologin
=与~区别:!!= 表示 某个域与 7 当作值全域比较!!  相等!!!而~表示 的是 正则表达式!!!!  匹配的是字符串!!!
eg:awk '/^$/{print x+=1}' file等价于: awk '{$0~/^$/} {print x+=1}' fileawk '{/^$/} {print x+=1}' file找出file1中的空白行,找到一个空白行 x就加1eg:file4的内同:zhangsan class7 2009,91,92,90lisi class6 2009,88,87,95wangwu class1 2008,91,98,85file3,awk的内容:#!/usr/bin/awk -fBEGIN {FS=","}{total=$2+$3+$4avg=total/5print $1,avg}(计算每个学生的平均成绩)执行:./file3.awk file结果:zhangsan class7 2009 54.6lisi class6 2009 54wangwu class1 2008 54.8


4awk系统变量:
awk定义了很多内建变量用于设置环境信息,我们称它们为系统变量,这些系统变量可分为两种:
第1种用于改变awk的缺省值,如域分隔符
第2种用于定义系统值,在处理文本时可以读取这些系统值,如记录中的域数量、当前记录数、当前文件名等,awk动态改变第2种系统变量的值
变量名 意义
$n 当前记录的第n个域,域间由FS分割
$0 记录的所有域
ARGC 命令行参数的数量
ARGIND 命令行中当前文件的位置(以0开始标号)
ARGV 命令行参数的数组
CONVFMT 数字转换格式
ENVIRON 环境变量关联数组
ERRNO 最后一个系统错误的描述
FIELDWIDTHS 字段宽度列表,以空格键分割
FILENAME 当前文件名
FNR 浏览文件的记录数  file number row
FS 字段分隔符,默认是空格键 Field  Sign
IGNORECASE 布尔变量,如果为真,则进行忽略大小写的匹配
NF 当前记录中的域数量
NR 当前记录数
OFMT 数字的输出格式
OFS 输出域分隔符,默认是空格键
ORS 输出记录分隔符,默认是换行符
RLENGTH 由match函数所匹配的字符串长度
RS 记录分隔符,默认是空格键
RSTART 由match函数所匹配的字符串的第1个位置
SUBSEP 数组下标分隔符,默认值是\034
eg:awk 'BEGIN {FS=”:”} {print NF,NR,$0} END {print FILENAME}' file4结果:4 1 zhangsan class7 2009,91,92,904 2 lisi class6 2009,88,87,954 3 wangwu class1 2008,91,98,850 4 


5awk格式化输出:
awk的一大主要功能是产生报表,报表就要求按照预定的格式输出,awk借鉴C语言的语法,定义了printf输出语句,它可以规定输出的格式。
printf:printf (格式控制符,参数) 
格式控制符:awk修饰符,格式符
修饰符 意义
- 左对齐
width 域的步长
.prec 小数点右边的位数
运算符 意义
%c ASCII字符
%d 整型数
%e 浮点数,科学记数法
%f 浮点数
%o 八进制数
%s 字符串
%x 十六进制数
Eg文件内容:zhang san,21,beijing,010li si,23,wuhan,027wang wu,22,chengdu,024

eg:awk 'BEGIN {FS=”,”} {printf(“%s\t%d\n”,$1,$2)}' file3(将第一域为字符串  第二域为数字 打印出来)结果:zhang san21li si23wang wu22eg:awk 'BEGIN {FS=”,”} {printf(“%-10s\t\t%s\n”,$1,$3)}' file3(红色表示 该所占位置为10个字符!)结果:zhang san beijingli si     wuhanwang wu   chengdueg awk 'BEGIN {FS=",";print "NAME\t\t\tCITY"} {printf("%-10s\t\t%s\n",$1,$3)}' file3(第一个{}中的两个命令中间是;分号   后面 红色的命令是打印出 列名)结果;NAMECITYzhang san beijingli si     wuhanwang wu   chengdu

原创粉丝点击