1. AWK
1. 基础知识
print $0的含义是打印整行,输出到stdout。 -F参数设置的是awk的初始化变量FS(我们在后面的章节将讲到这个变量)。FS变量控制着awk的字段分隔符,默认情况下是空白字符。 在BEGIN代码块中,完成awk部分参数的初始化操作。END代码块,它是在所有的输入都处理完后awk运行的代码。 awk的变量在建立时的初始值都是空字符串,但是当需要数值时,它会被视为0。 awk允许在数组名称之后,以方括号将任意数字或字符串表达式括起来作为索引。 数组也无需声明就能使用。数组的存储空间在引用新元素时会自动增长。 delete array[index]会从数组中删除元素,而delete array会删除array数组中的所有元素。 在awk中只能使用print;不能使用echo。 在awk中使用的变量,不需要,使用$var
引用变量。直接使用var
即可获取到值。 、 awk核心代码块的执行次数和操作文件的行数一致; BEGIN和END只会执行一次
2. awk常见的内建变量
变量 描述 FILENAME 当前输入文件的名称 FNR 当前输入文件的记录数 FS 文件分隔符(默认为空格,支持正则表达式) NF 当前记录的字段数 NR 在工作中的记录数 OFS 输出字段分割字符 ORS 输出记录分割字符(默认为 “\n”) RS 输入记录分割字符 ARGC 传入的参数个数 eg: awk 'BEGIN{print "Args=", ARGC}' 1 2 343 4
ARGV 传入的参数 eg: awk 'BEGIN{print "Argv1=", ARGV[1]}' 1 2 343 4
;ARGV[0]为awk;从ARGV[1]开始,才是参数。
3. awk标准选项
选项 描述 示例 -v 该选项将一个值赋予一个变量,它会在程序开始之前进行赋值 awk -v name1=alex 'BEGIN{printf "name=%s\n", name1}'
4. awk条件判断(&& || !)
if ( condition1 && condition2) {
statement.. .
} else if ( condition1 || condition2) {
statement.. .
} else {
statement.. .
}
5. awk循环
while循环
BEGIN {
print "while is begin...."
}
{
item= 1
while( item < 10 ) {
item+= item
}
}
END {
print "while is end, item : " item
}
do…while循环
{
count= 1
do {
print "count: " count++
} while( count != 10)
}
for循环
BEGIN{
print "This is begin..."
}
{
for( i= 1; i<= 10; i++) {
print "item: " i
}
}
END {
print "This is end..."
}
6. awk执行流程
Created with Raphaël 2.2.0
awk-BEGIN代码块
读取文件一行数据
执行awk代码块
是否读取文件还有剩余行?
awk-END代码块
yes
no
7. 小案列
设置文件分隔符。
awk –F ":" '{print "USER: "$1 "\t SHELL: "$7 }' /tmp/passwd.piece
设置的分隔符为正则表达式
awk -F "[\t ]+" '{print "DEVICE: "$1 "\t FSTYPE: "$3 }' /etc/fstab
符合正则表达式时,执行脚本
awk '/nologin/ {++adder}' num1.txt
使用条件判断
awk '{if ($1 >100){count++; print $1 } \
else{count--;print $2 }}' num2.txt
使用awk脚本来执行批量的awk指令,操作文件。
num1.awk
BEGIN{
FS= ":"
print "This is begin!"
}
{
if( $1 > 100 && $1 < 200) {
print $1 " is more than 100"
} else if( $1 > 200) {
print $1 " is more than 200"
} else {
less_than_100++
print $1 " is less than 100"
}
}
END{
print "Less than 100, count: " less_than_100
}
awk -f num1.awk num1.txt