linux之awk详解

一、awk简述
 一种用于处理数据和生成报表的编程语言。行处理模式
二、命令格式
  1. 使用格式
 awk [options] -f scripts(脚本文件)  [var1=value1 var2=value2 ...] file 
awk [options] '[pattern]{action}' [var1=value1 var2=value2 ...] file ...
  1. options
    -F(Field separator,字段分隔符) 使用:-F:(表示以:为分隔符)
    -f(script file,脚本文件) 使用:-f scriptfilename
    -v(variable,声明变量) 使用:awk -v a=1 -v b=2 ‘{print a,b}’
  2. parrern(模式)
    /正则表达式/
    条件表达式
    指定一个行的范围 比如:/正则表达式/ ,/正则表达式/ /a/,/b/
    BEGIN 作用:在处理第一条记录前已经发生的动作,
    比如:awk ‘BEGIN{print"---------"}{printf"%-9s",$1}’
    分析:先输出"---------“然后再输出每行的第一个字段,如果不加BEGIN,就会每输出一行就输出”---------"
    END作用:最后一条记录被处理之后发生的动作(同BEGIN,不过一个在开始一个在结束)
    注:如果有BEGIN和END,则表达式为
    awk -F: /正则表达式/BEGIN{…}{action}END{…} filename
  3. action
    由括在{}内的一或多条语句组成,语句之间用分号或者换行符分割,默认操作是打印所有表达式结果为真的文本行。
    a、赋值(变量或者数组赋值操作)
    例如:var=value(变量) a[“age”]=“23”(awk中的数组下标可以是字符串) a[1]=“xxx”
    b、格式化输出
    printf:
    (1)可以自定义输出的模式,另外输出内容之后不自动换行,返回给标准输出一个带有格式的字符串。
    (2)修饰符: - 左对齐,默认右对齐
    (3)格式说明转换符符%: c d s f
    (4)使用举例:{printf “%-7d%-7d%-7s”,$1,$2,$3}
    print:输出内容之后自动换行,参数之间用逗号隔开(多个输出参数的话),
    举例:{pirnt $1,$2}
    输出可以被重定向
    举例: awk ‘$1 * $2 > 500{print $3+$4 >> “/tmp/test” }’ test1
    转义序列:\t \n \r(回车) 、047(八进制的47)
    内置变量:OEMT

c、内置函数
算数函数:
cos(x):返回余弦,x是弧度(类似的有sin(x) atan2(y,x)[返回y/x的反正切])
exp(x):x幂函数 log(x):x的自然对数 sqrt(x):x的平方根
rand(x):随机函数
字符串函数:
match():正则表达式匹配查找
substr():截取字符串
split():字符串分割
时间函数:
mktime(y m(月) d h m(分) s):生成时间格式
strftime([format[,timetamp]]):格式化时间输出,将时间戳转为时间字符串
systime(): 得到时间戳,返回从1970.01.01开始到当前时间的整秒数
如:[root@myp ~]# awk ‘BEGIN{tstamp=mktime(“2018 07 30 22 50 50”);print strftime("%c",tstamp)}’
Mon 30 Jul 2018 10:50:50 PM CST

[root@myp ~]# awk ‘BEGIN{tstamp=mktime(“2018 07 30 22 50 50”);print systime("%d",tstamp)}’
awk: fatal: 2 is invalid as number of arguments for systime
systime()的用法
[root@myp ~]# awk ‘BEGIN{tstamp=mktime(“2018 07 30 22 50 50”);tstamp2=systime();print tstamp2-tstamp1}’
1532240880

5、脚本文件(scripts)
a.一行中多条语句用分号分隔 action1;action2
b.每条语句在不同行,可以不需要分号分隔
action1
action2
c.如果操作跟在某个模式后面,它的左花括号就必须与该模式在同一行
BEGIN {
action;
}
d. #用于注释
6、记录和字段(每一行的内容)
(1)、记录的定义:输入的数据具有固定的格式和结果,不是无休止的字符串,每一行称为一条记录,以换行符分隔。
a、内置变量:
$0:当前行的内容
ORS:记录输出分隔符 output record separator
RS:记录分隔符 record separator
NR:记录当前处理的记录编号(相当于当前处理的行数)
FNR:表示awk开始执行程序后所读取的数据行数.不同的是awk每打开一个新文件,FNR便从0重新累计。
例如:[root@myp ~]# awk ‘{print NR,FNR}’ test1 test2
1 1
2 2
3 3
4 4
5 5
6 1
7 2
8 3
9 4
10 5

(2)、字段
a、定义: 每条记录由多个字段组成,默认字段用空白或者tab分隔 ,由-F或者-FS指定分隔符(如:-F: -F’|’),用$1表示第一个字段,以此类推。
b、内置变量:OFS:指定字段输出的分隔符
awk ‘BEGIN{OFS=}’
FS:字段分隔符
NF:记录当前记录字段数(就是这一行有几个字段)
c、字段分割:可以同时使用多个字段分隔符,将分隔符放入[]中
例: awk -F’[:\t]’{print $1,3}’
[root@myp ~]# cat file
1 2,3,4,5 6 7 9
[root@myp ~]# awk -F’[,\t]’ ‘{print $1,$2,$3,$4,$5,$6}’ file
1 2 3 4 5 6

7、编程结构
a、关系表达式:
< , <= , >, >= , == ,!= ~(匹配 ~love) ~!(不匹配)
b、条件表达式

三、问题

1、在awk中怎么运用sort
[root@myp ~]# awk -F| ‘/gif$/{print $1 | “sort -u”}’ test.log

四、习题:
  1. 将以下文件输出成下面的效果
    Mary 2143 78 84 77
    Jack 2321 66 78 45
    Tom 2122 48 77 71
    Mike 2537 87 97 95
    Bob 2415 40 57 62
  2. 效果:
    Lineno. Name No. Math English Computer Total
    1 Mary 2143 78 84 77 239
    2 Jack 2321 66 78 45 189
    3 Tom 2122 48 77 71 196
    4 Mike 2537 87 97 95 279
    5 Bob 2415 40 57 62 159
    答案:
[root@myp ~]# awk 'BEGIN{print "Lineno. Name  No. Math English Computer Total"}{print NR,$0,$3+$4+$5}' /test/test2 

2、统计TCP的链接数
netstat -ant | awk ‘/^tcp/{++state[KaTeX parse error: Expected 'EOF', got '}' at position 4: NF]}̲END{for (i in s…NF]}END{for (i in state){print i,state[i]}}’
ESTABLISHED 2
LISTEN 10
insert:netstat的用法:http://man.linuxde.net/netstat
3、分别统计不同IP的tcp链接数

4、合并两个文件的输出
test1:Mary 2143 78 84 77
Jack 2321 66 78 45
Tom 2122 48 77 71
Mike 2537 87 97 95
Bob 2415 40 57 62
test2:
Mary 239
Jack 189
Tom 196
Mike 279
Bob 159

要求处理后的文件是这样的:
Mary 239 78 84 77
Jack 189 66 78 45
Tom 196 48 77 71
Mike 279 87 97 95
Bob 159 40 57 62

答案:
由下面可知在处理第一个文件时,FNRNR
awk 'NR
FNR{sum[$1]=$2}NR!=FNR{$2=sum[$1];print $0}’ test2 test1
(注意NR(输出的总行数)和FNR(一个文件中的行数)的区别)
[root@myp ~]# awk ‘{print NR,FNR}’ test1 test2
1 1
2 2
3 3
4 4
5 5
6 1
7 2
8 3
9 4
10 5

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值