内容简介: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 使用
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。