首页 > 代码库 > Linux下文本搜索-AWK篇
Linux下文本搜索-AWK篇
一、AWK简介
和GREP相比,AWK相对陌生一些,但它的功能更强大,处理起来更灵活,适合处理基于列结构化的文本数据,因为它可以对行数据进行细致的处理,如按特定字符将文本切分成多个字段,进而对各个字段进行下一步的片。它还支持C语法,可以当成脚本语言来使用。
二、基本语法
awk 用法:awk ’ pattern {action} ’ files
ARGC 命令行变元个数
ARGV 命令行变元数组
FILENAME 当前输入文件名
FNR 当前文件中的记录号
FS 输入域分隔符,默认为一个空格
RS 输入记录分隔符
NF 当前记录里域个数
NR 到目前为止记录数
OFS 输出域分隔符
ORS 输出记录分隔符
简单例子:
awk ‘/abcd/ {print $1,$2}’ a.txt
打印包含abcd的文件行的第一、二列
三、条件操作符
<、<=、==、!=、>=、~匹配正则表达式、!~不匹配正则表达式
awk ‘{if ($4~/ASIMA/) print $0}’ temp
表示如果第四列包含ASIMA,就打印整条
awk ‘$0 ~ /ASIMA/’ temp
表示只要整条包含ASIMA就打印出来
awk ‘$3==”48″ {print $0}’ temp
只打印第3列等于”48″的记录
awk ‘$0 !~ /ASIMA/’ temp
打印整条不包含ASIMA的记录
awk ‘$1 != “asima”‘ temp
awk ‘{if ($1<$2) print $1 “is smaller”}’ temp
awk ‘/[Gg]reen/’ temp
打印整条包含Green,或者green的记录
awk ‘$1 ~/^…a/’ temp
打印第1域中第四个字符是a的记录,^行首,.任意字符
awk ‘$0~/(abc)|(efg)/’ temp
使用|时,语句需要括起来
awk ‘{if ( $1==”a” && $2==”b” ) print $0}’ temp
awk ‘{if ($1==”a” || $1==”b”) print $0}’ temp
四、内置字符串处理函数
gsub(r,s) 在整个$0中用s替代r
awk ‘gsub(/name/,”xingming”) {print $0}’ temp
gsub(r,s,t) 在整个t中用s替代r
index(s,t) 返回s中字符串t的第一位置
awk ’BEGIN {print index(“Sunny”,”ny”)}’ temp 返回4
length(s) 返回s的长度
match(s,r) 测试s是否包含匹配r的字符串
awk ‘$1==”J.Lulu” {print match($1,”u”)}’ temp 返回4
split(s,a,fs) 在fs上将s分成序列a
awk ‘BEGIN {print split(“12#345#6789″,myarray,”#”)”‘
返回3,同时myarray[1]=”12″, myarray[2]=”345″, myarray[3]=”6789″
sprint(fmt,exp) 返回经fmt格式化后的exp
sub(r,s) 从$0中最左边最长的子串中用s代替r(只更换第一遇到的匹配字符串)
substr(s,p) 返回字符串s中从p开始的后缀部分
substr(s,p,n) 返回字符串s中 从p 开始长度为n 的后缀部分
Linux下文本搜索-AWK篇