内容简介: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
以上所述就是小编给大家介绍的《Linux awk》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Linux awk
- Linux awk命令入门详解
- Linux 三剑客之 awk(一):awk 简介与表达式实例
- Linux文本分析命令awk的妙用
- Linux三剑客之awk详解
- Linux awk less tail grep 使用
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Nature of Code
Daniel Shiffman / The Nature of Code / 2012-12-13 / GBP 19.95
How can we capture the unpredictable evolutionary and emergent properties of nature in software? How can understanding the mathematical principles behind our physical world help us to create digital w......一起来看看 《The Nature of Code》 这本书的介绍吧!