AWK常用技巧

介绍                              

它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。

awk 是一种很棒的语言,它适合文本处理和报表生成,其语法较为常见,借鉴了某些语言的一些精华,如 C 语言等。在 linux 系统日常处理工作中,发挥很重要的作用,掌握了 awk将会使你的工作变的高大上。

AWK原理                                     

这需要一个例子来说明,你将会见到/etc/passwd 文件的内容出现在眼前。

[root@localhost ~]#  awk '{print $0}' /etc/passwd
[root@localhost ~]# echo "liujunjun"|awk '{print "hello,world"}'
[root@localhost ~]# awk '{ print "root" }' /etc/passwd

现在,解释 awk 做了些什么。调用 awk时,我们指定/etc/passwd 作为输入文件。执行 awk 时,它依次对/etc/passwd 中的每一行执行 print 命令。所有输出都发送到 stdout,所得到的结果与执行 cat /etc/passwd 完全相同。现在,解释{ print }代码块。在 awk 中,花括号用于将几块代码组合到一起,这一点类

似于C 语言。在代码块中只有一条 print 命令。在awk 中,如果只出现 print 命令,那么将打印当前行的全部内容。

再次说明,awk 对输入文件中的每一行都执行这个脚本。

AWK常用速查表                    

运算符 说明
赋值运算符
= += -= *= /= %= ^= **= 赋值语句
逻辑运算符
|| 逻辑或
&& 逻辑与
正则运算符
~ !~ 匹配正则表达式和不匹配正则表达式
关系运算符
< <= > >= != == 关系运算符
算术运算符
+ - 加,减
* / & 乘,除与求余
+ - ! 一元加,减和逻辑非
^ *** 求幂
++ -- 增加或减少,作为前缀或后缀
其他运算符
$ 字段引用
空格 字符串链接符
?: 三目运算符
In 数组中是否存在某键值

常用AWK内置变量

变量名
$0 当前记录
1  n 当前记录的第 n 个字段
FS 输入字段分隔符 默认是空格
RS 输入记录分割符 默认为换行符
NF 当前记录中的字段个数,就是有多少列
NR 已经读出的记录数,就是行号,从 1 开始
OFS 输出字段分隔符 默认也是空格
ORS 输出的记录分隔符 默认为换行符

 awk中的正则

元字符 功能 示例 解释
^ 行首定位符 /^root/ 匹配所有以 root 开头的行
$ 行尾定位符 /root$/ 匹配所有以 root 结尾的行
. 匹配任意单个字符 /r..t/

匹配字母 r,然后两个任意字符,再以 l

结尾的行,比如 root,r33l 等

* 匹配 0 个或多个前导字符(包括回车) /a*ool/ 匹配 0 个或多个 a 之后紧跟着 ool 的行,比如 ool,aaaaool 等
+ 匹配 1 个或多个前导字符 /a+b/

匹配 1 个或多个 a 加 b 的行,比如

ab,aab 等

扫描二维码关注公众号,回复: 8019975 查看本文章
匹配 0 个或 1 个前导字符 /a?b/ 匹配 b 或 ab 的行
[] 匹配指定字符组内的任意一个字符 /^[abc] 匹配以字母 a 或b 或 c 开头的行
[^] 匹配不在指定字符组内任意一个字符 ^[^abc]/ 匹配不以字母 a 或 b 或 c 开头的行
() 子表达式组合 /(rool)+/ 表示一个或多个 rool 组合,当有一些字符需要组合时,使用括号括起来
| 或者的意思 /(root)|B/ 匹配root 或者 B 的行
\ 转义字符 /a\/\// 匹配 a//
~,!~ 匹配,不匹配的条件语句 $1~/root/ 匹配第一个字段包含字符root 的所有记录
x{m} x 重复m 次 /(root){3}/ 需要注意一点的是,root 加括号和不
x{m,} x 重复至少m 次 /(root){3,}/ 加括号的区别,x 可以表示字符串也
X{m,n}

x 重复至少 m 次,

但不超过 n 次

/(root){5,6}/

可以只是一个字符,所以/root\{5\}/

表示匹配roo 再加上5 个t,及roottttt

 

需要指定参数:

-posix         或者

--re-interval    没 有该参数不能使用该模式

cat   rex.txt smierth,harry smierth,reru robin,tom

/rootroot\{2,\}/ 则   表 示 匹 配

rootrootrootroot 等

awk -posix '/er\{1,2\}/' rex.text smierth,harry

smierth,reru

 awk 常用函数表

函数 说明
gsub( Ere, Repl, [ In ] ) 除了正则表达式所有具体值被替代这点,它和 sub 函数完全一样地执行,。
sub( Ere, Repl, [ In ] ) 用 Repl 参数指定的字符串替换 In 参数指定的字符串中的由 Ere参数指定的扩展正则表达式的第一个具体值。sub 函数返回替换的数量。出现在 Repl 参数指定的字符串中的 &(和符号)由 In 参数指定的与Ere 参数的指定的扩展正则表达式匹配的字符串替换。如果未指定 In 参数,缺省值是整个记录($0 记录变量)。
index( String1, String2 ) 在由 String1 参数指定的字符串(其中有出现 String2 指定的参数)中,返回位置,从 1 开始编号。如果 String2 参数不在 String1  参数中出现,则返回 0(零)。
length [(String)]

返回 String  参数指定的字符串的长度(字符形式)。如果未给出

String  参数,则返回整个记录的长度($0  记录变量)。

blength [(String)]

返回 String  参数指定的字符串的长度(以字节为单位)。如果未给出

String  参数,则返回整个记录的长度($0  记录变量)。

substr( String, M, [ N ] )

返回具有 N 参数指定的字符数量子串。子串从 String 参数指定的字符串取得,其字符以 M 参数指定的位置开始。M 参数指定为将

String 参数中的第一个字符作为编号 1。如果未指定 N 参数,则子串的长度将是 M 参数指定的位置到 String 参数的末尾 的长度。

match( String, Ere ) 在 String  参数指定的字符串(Ere  参数指定的扩展正则表达式出现在其中)中返回位置(字符形式),从 1  开始编号,或如果 Ere  参数不出现,则返回 0(零)。RSTART  特殊变量设置为返回值。RLENGTH特殊变量设置为匹配的字符串的长度,或如果未找到任何匹配,则设置为 -1(负一)。
split( String, A, [Ere] )

将 String 参数指定的参数分割为数组元素 A[1], A[2], . . ., A[n],并返回 n 变量的值。此分隔可以通过 Ere  参数指定的扩展正则表达式进行,或用当前字段分隔符(FS 特殊变量)来进行(如果没有给出 Ere参数)。除非上下文指明特定的元素还应具有一个数字值,否则 A  数

猜你喜欢

转载自www.cnblogs.com/liujunjun/p/11960233.html