awk概述
awk是一种处理文本的语言,它将文件作为一个记录序列进行处理。一般情况下,一个文件的每一行就是一个记录,然后每行内容会被划分为一系列的域。一般情况下,我们可以认为一行的第一个词就是第一个域,第二个词为第二个域。
awk执行
awk ’awk 程序‘ 数据文件文件名
awk会先编译那个程序,然后执行该程序处理数据文件
awk程序的主要结构
awk是由一系列的 模式--动作 对组成的
pattern { action }
Pattern
pattern一般都是使用“关系表达式”来当Pattern
例如:
- x > 34, 是一个pattern( awk提供c++中常用的关系运算符:>, <, ==, != )
- A ~ B (A是一个字符串,B是regular expression,判断两者是否匹配)
- A !~ B (A是一个字符串,B是regular expression,判断两者不匹配)
Action
action是由许多awk指令组成的
例如:
- I/O指令: print, printf( ), getline...
- 流程控制指令: if(...){..} else{..}, while(...){...}...
我们可以发现在一些awk的表达式中会有BEGIN和END,这两个其实就是patten;而这两种条件对应的action分别是读取所有记录之前和之后。
pattern { action } 处理流程
awk首先判断(evaluate)pattern的值,如果pattern值为true(或者不为0,非空字符串),那么就会执行action里面的内容。
例如:
- 50 > 23 {print "Hello! The word!!" }(成功输出)
- "banana" ~ /123/ { print "Good morning !" }(不会有任何输出结果)
awk字段变量
awk所内建的字段变量及其含义
字段变量 | 含义 |
$0 | 一字符串, 其内容为目前 awk 所读入的数据行 |
$1 | $0 上第一个字段的数据 |
$2 | $0 上第二个字段的数据 |
... | 其余类推 |
awk的内建变量
常见的内建变量
内建变量 | 含义 |
NF (Number of Fields) | 为一整数, 其值表$0上所存在的字段数目 |
NR (Number of Records) | 为一整数, 其值表awk已读入的数据行数目. |
FILENAME | 正在处理的数据文件文件名 |
例子:
awk读取一个文件test.bat中的一行“it is a test”
$0 之值将是 "it is a test"
$1 之值为 "it"
$2 之值为 "is"
$3 之值为 "a"
$4 之值为 "tes"
$NF 之值为 4
$NR 之值为 1
$FILENAME 之值为 "test.bat"
awk内建函数
字符串函数
- sub(比对用的正则表达式,将替换的新字符串,原字符串)
A = "a6b12anan212.45an6a"
sub( /(an)+[0-9]*/, "[&]", A)
print A
输出结果
ab12[anan212].45an6a
sub( )中第三个参数(原字串)若未指定,则其预设值为$0.
- gsub(比对用的正则表达式,将替换的新字符串,原字符串)
- 会替换所有满足条件的式子,并返回取代的子字符串个数