学习目标
熟悉awk的命令行模式基本语法结构
熟悉awk的相关内部变量
熟悉awk常用的打印函数print
能够在awk中匹配正则表达式打印相关的行
一、awk介绍
awk是一种编程语言,主要用于在linux/unix下对文本和数据进行处理,是linux/unix下的一个工具。数据可以来自标准输入、一个或多个文件,或其他命令的输出
awk的处理文本和数据的方式:逐行扫描文件,默认从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。
gawl是awk的GUN版本,它提供了Bell实验室和GUN的一些扩展。
下面介绍的Awk是以GUN的awk为例的,在linux系统中已把awk链接到gawk,所以下面全部以awk进行介绍。
1.awk使用方式
命令模式语法
awk 选项 'commands' 文件名
常用选项
-F 定义字段分隔符号,默认的分隔符号是空格。 类似与小工具cut自定义分隔符
-V 定义变量并赋值
命令部分
1.正则表达式,地址定位
'/root/{awk语句}'
'NR==1.NR==5{awk语句}'
'/^root/,/^ftp/{awk语句}'
2.{awk语句1;awk语句2;...}
'print $0'
'NR==5{print $0}'
注:awk命令语句间用分号间隔
3.BEGIN...END...
'BEGIN{awk语句};{处理中};END{awk语句}'
'BEGIN{awk语句};{处理中}'
'{处理中};END{awk语句}'
4.引用shell变量需用双引号引起
脚本模式
脚本执行
方法1:
awk 选项 -f awk的脚本文件 需处理的文本文件
awk -f awk.sh filename
方法2:
./awk的脚本文件(或者绝对路径) 需处理的文本文件
./awk.sh filename
脚本编写
#! /bin/awk -f 定义魔法字符
以下是awk引号里的命令清单,不要用引号保护命令,多个命令用分号间隔
BEGIN{FS=":"}
NR==1,NR==3{print $1"\t"$NF}
...
2.awk内部相关变量
变量 | 变量说明 | 备注 |
$0 | 当前处理行的所有记录 | |
$1,$2,$3...$n | 文件中每行以间隔符合分割的不同字段 | |
NF | 当前记录的字段数 | |
$NF | 最后一列 | $(NF-1)表示倒数第二列 |
FNR/NR | 行号 | |
FS | 定义间隔符 | ‘BEGIN{FS=":"}{print 1,3}' |
OFS | 定义输出字段分隔符,默认空格 | ‘BEGIN{OFS="\t"}{print 1,3}' |
RS | 输入记录分割符,默认换行 | ‘BEGIN{RS="\t"}{print $0}' |
ORS | 输出记录分割符,默认换行 | ‘BEGIN{ORS="\n\n"}{print 1,3}' |
FILENAME | 当前输入的文件名 |
3.awk工作原理
awk -F: '{print $1,$3}' /etc/passwd
1.awk使用一行作为输入,并将这一行赋给内部变量$0,每一行也可称为一个记录,以换行符{RS}结束
2.每行被间隔符:(默认为空格或制表符)分解成字段(或域),每个字段存储在已编号的变量中,从$1开始
问:awk如何知道用空格来分隔字符的呢?
答:因为有一个内部变量FS来确定字段分隔符。初始时,FS赋为空格
3.awk使用print函数打印字段,打印出来的字段会以空格分隔,因为$1,$3之间有一个逗号。逗号比较特殊,它映射为另一个内部变量,称为输出字段分隔符OFS,OFS默认为空格
4.awk处理完一行后,将从文件中获取另一行,并将其存储在$0中,覆盖原来的内容,然后将新的字符串分隔成字段并进行处理。该过程将持续到所有行处理完毕
4.awk变量定义
awk -v NUM=3 -F: '{ print $SUM }' /etc/passwd
awk -v NUM=3 -F: '{ print SUM }' /etc/passwd
5.awk中BEGIN...END使用
BEGIN:表示在程序开始前执行
END:表示所有文件处理完后执行
用法:'GEBIN{开始处理之前};{处理中};END{处理结束后}'
6.awk和正则的综合运用
运算符 | 说明 |
== | 等于 |
!= | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
~ | 匹配 |
!~ | 不匹配 |
! | 逻辑非 |
&& | 逻辑与 |
|| | 逻辑或 |
awk 'NR>=3 && NR<=8 && $0 ~ /bash$/{print $0}' 1.txt
7.awk的脚本编程
7.1 流程控制语句
if语句:if [ xxx ];then
xxx
fi格式:
{ if(表达式) {语句;语句;...} }例子:awk -F: '{if($3>=500 && $3<=60000) {print $1,$3} }' passwd===============================================================
if...else语句:
if [xxx];thenxxx
elsexxx
fi格式:
{ if(表达式) {语句;语句;...} else {语句;语句;...} }例子:awk 'BEGIN{ if( $(id -u)>=500 && $(id -u) !=65534 ) {print "是普通用户"} else {print "不是普通用户"} }==============================================================
if [xxx];thenxxx
elif xxx
elsexxx
fi格式:
{ if(表达式) {语句;语句;...} else if(表达式) {语句;语句;...}else {语句;语句;...}...}
7.2循环语句
while:
awk 'BEGIN{I=1;while(i<=10){pritn i;i++}}'
awk -F: '{i=1;while(i<=10) {pritn i;i++}}' /etc/passwdfor:
awk 'BEGIN{for(i=1;i<=5;i++){print i} }'
awk -F: '{for(i=1;i<=10;i++) print $0}' /etc/passwd
7.3算数运算
+ - * / %(模) ^(幂2^3)
可以在模式中执行计算,awk都将按浮点数方式执行算术运算
awk 'BEGIN{print 1+1}'
awk 'BEGIN{print 1**1}'
awk 'BEGIN{print 2**3}'
awk 'BEGIN{print 2/3}'