首页 > 系统 > Linux >

Linux awk的用法

2017-04-24

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

什么是awk?

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

处理文件的方式

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

awk的命令格式和选项

命令行语法格式

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

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
相关文章
最新文章
热点推荐