AWK学习笔记

AWK学习笔记

目录


简介

  1. awk是Unix环境下用于格式化文本,并按一定条件进行筛选显示的工具。
  2. awk以发展这种语言的人Aho.WeninbergerKernigham命名。

基本使用方法

格式

  1. 基本格式和说明:
    • awk [-F filed -separator] 'commands' input-files;
    • -F为可先项,后跟间隔符,默认以空格为间隔符;
    • commands为awk命令,包含模式和动作,如BEGINEND模式,动作需要包含在{}中,最常用的有{print $0};
    • input-files为输入的文本所在的文件。

调用方式

  1. 有三种方式可以调用awk
    • 在命令行中直接执行awk命令
    • awk命令写入文件,在shell环境下执行该文件
    • awk命令的commands部分写成awk脚本文件,通过-f选项调用awk脚本,如下所示:
      awk -f awk-script-file input-files

命令部分的构成

  1. '[模式] {动作}'
  2. BEGIN模式:为模式部分使用的关键字,用于表示在读取输入文本之前所做的动作。
  3. END模式:用来在awk完成文本浏览动作后打印输出文本总数和结尾状态标志。
  4. awk中将文本用域进行标识,域标记为$1,$2...$n$0则表示所有域

  5. print动作:在commandsawk命令中使用,且因为是动作,所以需要包含在'{}'中,print之后跟的是需要输出的内容,可以按照一定的格式对域标记进行组合,如:awk {print $1"\t"$3}' input-files

  6. 输出重定向:
    • 重定向符号’>’,可将执行的输出重写到文件中,++但不会输出在屏幕++,且文件会被重写,可使用’>>’,则会从文件尾开始输入。
    • 还可使用tee命令,也是将输出重写到文件中,但有个好处是++可以输出到屏幕++,如果用-a参数则可以从文件尾开始输入。

示例

awk 'BEGIN {print "field1\t|field2\n--------------------"} >{print $1"\t|"$2}END{print "succ end"}' input-files
input-files文件中的内容:

a1 a2 a3
b1 b2  b3

结果:


field1 |field2
--------------------

a1 |a2
b1 |b2
succ end

使用技巧(待补充)

  1. 定义多个分隔符,比如想要以‘()’作为分隔对文本‘name(lisa)’可以写为:
    awk -F'[()]' '{print $2}' input-files
    结果为:

    lisa

正则表达式(待补充)

  1. 条件操作符
操作符描述用法
<小于{if($1 < $2) print $0}
>大于{if($1 > $2) print $0}
<=小于等于{if($1 <= $2) print $0}
>=大于等于{if($1 >= $2) print $0}
==等于{if($1 == $2) print $0}
!=不等于{if($1 != $2) print $0}
~匹配{if($1~ /aa/) print $1}
!~不匹配{if($1!~ /aa/) print $1}

2. 复合操作符

操作符描述用法
&&{if($1~/bb/ && $2~/aa/) print $0}
||``{if($1~/bb/ || $2~/aa/) print $0}
!

字符集(待补充)

  1. 字符集:\ / ^ $ . [] & | () * + - ? % !
符号描述
\转意字符
/匹配符
^表示行首或域首
$域标识符
.占位符
[]单字符包含匹配
|
()条件
*
+匹配一个或多个字符
?出现频率

awk内置变量(待补充)

变量符描述
ARGC命令行参数个数
ARGV命令行参数排列
ENVIRON支持队列中系统环境变量的使用
FILENAMEawk浏览的文件名
FNR浏览文件的记录数
FS设置输入域分隔符,等价于命令行- F选项
NF浏览记录的域个数
NR已读的记录数
OFS输出域分隔符
ORS输出记录分隔符
RS控制记录分隔符

awk内置函数(待补充)

函数名描述
gsub(x,y)在每条记录中用y替代x
gsub(x,y,z)在整个z中用y替代x
index(x,y)返回x中字符串y的第一位置
length(x)返回x长度
match(x,y)测试x是否包含匹配y的字符串
split(s,a,fs)在fs上将s分成序列a
sprint(fmt,exp)返回经fmt格式化后的exp
sub(x,y,z)在z所示的域中用y字符串代替x表达式匹配的子串
substr(s,p)返回字符串s中从p开始的后缀部分
substr(s,p,n)返回字符串s中从p开始长度为n的后缀部分
printf(fmt,s,…)格式化输出字符串s,可以有多个s参数

awk转意字符(待补充)

  1. 可以通过使用‘\’来对特殊字符进行转意,如果字符串中需要显示{,则可以使用'\{'

参考资料

[1]: 《SHELL编程入门》:第9章 AWK介绍;
[2]: 《UNIX? Shells by Example Fourth Edition》:Chapter 6;
[3]: 【UNIX/LINUX 系统操作手册】:[man awk];

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值