首页 > 代码库 > 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篇