awk命令个人总结(以CentOS 6.3环境下shell为例)
最近学了一点Shell里的awk命令基础。下面根据自己所学做一些总结,仅供日后翻阅。如有错误,烦请指正。
awk是什么?
awk其实算是一种编程语言,仔细拓展开可以有好多好多内容,而我学的知识一点皮毛,可能连入门都算不上了。在Linux下,awk可以用来对一些文本数据进行筛选和扫描处理。
awk是怎么工作的?
awk一般可以搭配管道符使用,将送入awk出来的文本文件扫描处理。对于文件的名字赋予$0,即第一个位置变量。awk一次扫描一行文本,从第一行到最后一行,寻找匹配要求的行,进行用户操作。awk默认的分隔符是空格或者制表符,每一行依据分隔符,分为多个列,或者更准确讲是数据段,分别赋予$1、$2…..
基本结构如下
`awk '条件1{操作1}条件2{操作2}'`文件名
条件:一般是关系表达式
操作:默认处理是print打印输出处理行
awk的两个特殊条件
BEGIN和END,这两个放在条件位置,可以使在其他命令执行前或执行后进行BEGIN和END对应的指令。具体下面再举例子说明。
awk的基本选项
-F 指定分隔符,-F后面加指定的分隔符
-f 指定脚本,-f后面加脚本文件,从该脚本中读取awk命令,代替输入
awk使用例子
1.先正则表达式匹配整个test文档里的空白行,每一个空白行打印一次 “blank line”
awk '/^$/{print "blank line"}' test
2.正则表达式匹配/etc/sysconfig/network里的的主机名行,打印主机名
awk '/HOSTNAME/{print}' /etc/sysconfig/network
3.用-f 选项调用一个awk脚本来对sample.txt做操作,awk脚本是test.sh
awk -f test.sh sample.txt
4.输出a,b,c,$1 $2 $3 分别对应输出的a,b,c
echo a b c | awk'{print $1,$2,$3}'
5.读取输入的行并输出数据段个数
echo a b c | awk '{print $0}'
6.指定分隔符是” : “,输出passwd文本的第一列,即系统的用户名
awk -F ":" '{print $1}' /etc/passwd //写法1
awk 'BEGIN {FS=":"}{print $1}' /etc/passwd //写法2
7.awk中的变量,默认是空字串或者0
awk '/^$/ {x+=1} END {print x}' test //统计空白行行数并输出
8.awk结合条件语句使用,因为awk都使用了BEGIN模式,所以,在没读取test文档内容之前,就回把BEGIN后面的指令执行。
awk '{if($1<10) print "a"; else print "b"}' test
//如果test文件中每一行的第一个参数小于10,则输出a,否则输出b
awk 'i=1 {} BEGIN{while(i<=10) {++i;print i}}'
//i初始值为1,当i<=10,输出i的值,i++
awk 'BEGIN { do { ++x;print x } while (x<=10)}'
//do-while格式
awk 'BEGIN{for(i=1;i<=10;i++) print i}' //for循环