Linux awk的用法

什么是awk?

awk是Linux下面的一个命令行工具,相比于sed,awk不仅可以以行为单位进行处理文件,还能以列为单位处理文件;同时,它还是一种编程语言,用来在Linux/Unix下对文本和数据进行处理,数据既可以来自标准输入,也可以来自一个或者多个文件。

处理文件的方式

awk处理文本和数据的方式和sed相似,都是逐行扫描文件,从第一行到最后一行,然后通过正则表达式寻找匹配的特定模式的行,并在这些行上进行你自定义的操作(操作一般是打印~)如果没有指定匹配模式,那么所有的数据都会被进行处理。

awk的命令格式和选项

命令行语法格式

awk     [-F     field-separator]    'commands'      input

awk脚本文件格式

awk  -f     awk-script-file     input-file

命令选项

-F fs:表示指定输入文件分隔符。
-v var=value:表示赋值一个用户定义变量。
–asign var=value:同上。
-f scriptfile or –file scriptfile:从脚本文件中读取awk命令。

使用方法

awk     [option]    '{pattern + action }'   filename

pattern:表示awk在数据中查找的内容。
action:表示是在找到的匹配内容时所执行的一系列指令。

模式

awk是由模式和操作组成的: pattern {action}
两者是可选的,如果没有模式,则action应用到全部记录(行)。
如果没有action,则输出全部匹配的记录。
默认情况下,每一个输入行都是一条记录,用户可以通过RS变量或者-F选项来指定不同的分隔符进行分割。

例如:

[lzh@leap_ awk_test]$ cat file
ProductA:20
ProductB:50
ProductC:20
ProductD:30
ProductE:99
ProductF:120
[lzh@leap_ awk_test]$ awk '{print $1}' file                   //只有action没有pattern
ProductA:20
ProductB:50
ProductC:20
ProductD:30
ProductE:99
ProductF:120
[lzh@leap_ awk_test]$ awk '/^Product/' file                //只有pattern没有action
ProductA:20
ProductB:50
ProductC:20
ProductD:30
ProductE:99
ProductF:120

模式的类型

关于模式可以是一下的任意一个:
1. 正则表达式
2. 关系表达式
3. 模式匹配表达式(~和!)
4. BEGIN:让用户指定第一条输入记录在被处理之前所发生的动作,可以在Begin中设置全局变量。
5. END:让用户在最后一条输入记录被读取之后所发生的动作。

awk的常用环境变量

$n:表示当前记录的第n个字段,字段之间由域分隔符分隔。
$0:表示完整的输入记录。
ARGC:表示命令行参数的数目。

[lzh@leap_ awk_test]$ awk 'BEGIN{ print ARGC}{print $1}' file
2
ProductA:20
ProductB:50
ProductC:20
ProductD:30
ProductE:99
ProductF:120

ARGIND:表示命令行中当前文件的位置。
ENVIRON:表示环境变量关联的数组。
FILENAME:表示当前文件名。
FS:表示输入域分隔符。

[lzh@leap_ awk_test]$ awk -F ':' '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd | head -n 3
filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash
filename:/etc/passwd,linenumber:2,columns:7,linecontent:bin:x:1:1:bin:/bin:/sbin/nologin
filename:/etc/passwd,linenumber:3,columns:7,linecontent:daemon:x:2:2:daemon:/sbin:/sbin/nologin

FNR:表示浏览文件的记录数。

[lzh@leap_ awk_test]$ awk -F: 'BEGIN{ print FNR }{print $1,FNR}' file
0
ProductA 1
ProductB 2
ProductC 3
ProductD 4
ProductE 5
ProductF 6

OFS:表示输出域分隔符。
ORS:表示输出记录分隔符。

[lzh@leap_ awk_test]$ awk -F: 'BEGIN{ OFS="###"} {print $0,$1,$2}' file
ProductA:20###ProductA###20
ProductB:50###ProductB###50
ProductC:20###ProductC###20
ProductD:30###ProductD###30
ProductE:99###ProductE###99
ProductF:120###ProductF###120

来个例子找出一个人目录下文件的大小,并计算出总大小。

[r[root@leap_ awk_test]# ls -lR /home/lzh/code | awk 'BEGIN{size=0}/^-/{size+=$5; print $9,$5} END{printf("total:%d\n",size);}' | tail -n 10
test.c 233
3_class.tar 20480
3_class.tgz 2922
proc.c 0
a.out 6474
file1.txt 270
file.txt 1405
test.c 125
test.cpp 273
total:268757855
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值