shell学习 - awk入门

一. awk应用场景

格式化数据或从一个大的文本文件中抽取记录

二. 使用方法

  1. 命令行方式
    $awk [-F field-separator] ‘commands’ input-file(s)
    commands是真正的awk命令
    [-F域分割符]是可选的,如果无-F选项,awk默认用空格作为分隔符,如果域分隔符不为空格,比如要浏览以”:”作为分隔符的password文件则必须指明-F选项,如:
    awk -F: ‘commands’ input-file

  2. awk脚本文件
    将1中的命令行写入一个文件,用bash或sh去解释它,执行命令为shawkscriptfile./awk_script_file, 后者需要给脚本文件加执行权限。

  3. 将所有awk命令写入一个文件awk_script_file,用$awk -f awk_script_file input-file(s),例如,

#record.txt
zhangsan 21 M Hubei
lisi     30 F Beijing
wangwu   34 M Anhui
wangmazi 50 M Sichuang
lilei    20 M Hubei

#awk_script_file
$2 > 30 {print $0}

$awk -f awk.sh record.txt
wangwu   34 M Anhui
wangmazi 50 M Sichuang

三. awk脚本组成

awk语句都是由模式和动作组成。

模式即动作的执行条件,可以是条件语句或正则表达式,模式包括2个特殊字段BEGIN和END。使用BEGIN语句设置计数和打印头。BEGIN语句在文本浏览之前执行。END语句用来在awk完成文本浏览动作后打印出文本总数和结尾状态。

动作大多数用来打印,在{}内指明,可以包含if和循环等,如果不指明动作awk将打印出所有浏览出来的记录。

域和记录
域即用分隔符分割的字段,用$1,$2,$3...,$n表示第一个、第二个、第三个,第n个字段, $0表示所有字段。

保存awk输出

$awk$2 > 30 {print $1, $2}‘ record.txt > tmp.txt

动作中的正则表达式
动作中的正则表达式用表示方式为:/这则表达式/,域号匹配正则表达式用~后紧跟正则表达式,也可以用if()。例如,打印名字中包含“zhangsan”的所有记录,

$ awk ‘{if ($1~/zhangsan/)print $0}‘ record.txt

$ awk ‘$1~/zhangsan/‘ record.txt
#默认打印所有满足条件的字段

条件运算中常用的运算符和正则式

+, -, *, /, %, +=, -=, %=, ^=
++, --
~模糊匹配,即**包含**
!~不匹配
==精确匹配 
>, <, >=, <=, !=
||, &&

正则表达式列举

[Gg]reen或(Green|green) 匹配Green或green
^...a 行首前三个字符任意,第四个是a

打印报告头和报告尾

awk ‘BEGIN{print "Name    Age\n-------------------------"} $2>30 && $3 == "M" {print $1, $2} END {print "end-of-report"}‘ record.txt

awk内置变量

AGRC          命令行参数个数
ARGV          命令行参数列表
ENVIRON       系统环境变量
FNR           浏览文件的记录数
FILENAME      浏览文件名
FS            域名分隔符,等价于-F选项
NF            浏览记录域个数
NR            已读记录数
OFS           输出域分隔符
ORS           输出记录分隔符
RS            控制记录分隔符

awk内置字符串函数

gsub(r, s)        在整个$0中用s替代r
gsub(r, s, t)     在整个t中用s替代r
index(s, t)       返回s中字符串t的第一个位置
length(s)         返回s长度
match(s, r)       测试s是否包含匹配的r字符串
split(s, a, fs)fss分割成序列a
sprintf(fmt, exp) 返回经fmt格式化的串
substr(s, p)      返回字符串s中从p开始的部分
substr(s, p, n)   返回字符串s中从p开始长度为n的部分

awk变量
变量提高了awk程序可读性,下面是变量使用的简单例子

awk ‘{name=$1;age=$2;sex=$3;if(age>30 && sex=="M")print "Name:" name " Age:" age}‘ record.txt 

修改数值域的值

#将姓名为"lilei"的年龄增加1,然后打印出所有记录
awk ‘{if ($1=="lilei") $2+=1;print "Name:"$1 " Age:"$2}‘ record.txt 
#将姓名为"lilei"的姓名修改为"Lilei",打印出修改后的记录
awk$1=="lilei" {$1="Lilei";print "Name:"$1 " Age:"$2}‘ record.txt 

统计

awk ‘{(tot += $2)};END{print "Total age:" tot}‘ record.txt 

本文只是简单的介绍了awk的基本语法,阅读本文后可以用awk完成简单的文本处理功能,awk博大精深,如果要深入学习建议阅读更专业的awk文档和相关书籍。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。