传说中的Linux三剑客命令之awk(三剑客老大)别人只知道了而我却做到了
awk(三剑客老大)
1.介绍
The name awk comes from the initials of its designers: Alfred V. Aho, Peter J. Weinberger, and Brian W. Kernighan. The original version of awk was written in 1977 at AT&T Bell Laboratories. In 1985, a new version made the programming language more powerful, introducing user-defined functions, multiple input streams, and computed regular expressions. This new version became widely available with Unix System V Release 3.1 (1987). The version in System V Release 4 (1989) added some new features and cleaned up the behavior in some of the “dark corners” of the language. The specification for awk in the POSIX Command Language and Utilities standard further clarified the language. Both the gawk designers and the original awk designers at Bell Laboratories provided feedback for the POSIX specification.
awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自定义 函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk的处理文本和数据的方 式是这样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。如果没有指定处理动作,则把匹配的行显示到标 准输出(屏幕),如果没有指定模式,则所有被操作所指定的行都被处理。awk分别代表其作者姓氏的第一个字母。因为它的作者是三个人,分别是Alfred Aho、Brian Kernighan、Peter Weinberger。gawk是awk的GNU版本,它提供了Bell实验室和GNU的一些扩展。
2.BEGIN和END
BEGIN模式
- 是指 awk 将在读取任何输入行之前立即执行 BEGIN 中指定的动作
END模式
-是指 awk 将在它正式退出前执行 END 中指定的动作
3.运算符
运算符 | 功能描述 |
---|---|
= += -= *= /= %= ^= **= | 赋值语句 |
|| && | 逻辑或 和 逻辑与 |
~ !~ | 匹配正则表达式 和 不匹配正则表达式 |
< <= > >= != == | 关系运算符 |
+ - * / & | 加减乘除求余 |
+ - ! | 一元加,减和逻辑非 |
^*** | 求幂 |
++ – | 自增 和 自减 |
$ | 字段引用 |
space | 字符串连接符 |
?: | 三目运算符 |
ln | 数组中是否存在某键值 |
4.内置变量
变量名 | 属性 |
---|---|
$0 | 当前记录 |
$1~$n | 当记录的第n个字段 |
FS | 输入字段分隔符,默认是空格 |
RS | 输入记录分隔符,默认是换行符 |
NF | 当前记录中的字段个数,就是有多少列 |
NR | 已经读出的记录数,就是行号,从1开始 |
OFS | 输出字段分隔符,默认也是空格 |
ORS | 输出的记录分隔符,默认是换行符 |
5.正则表达式
元字符 | 功能 | 示例 | 解释 |
---|---|---|---|
^ | 行首定位符 | /^root/ | 匹配所有以root开头的行 |
$ | 行尾定位符 | /root$/ | 匹配所有以root结尾的行 |
. | 匹配任意单个字符 | /r…t/ | 匹配字母r,然后两个任意字符,再以t结尾的行,比如root,rout等 |
* | 匹配0个或多个前导字符(包括回车) | /r*oot/ | 匹配0个或多个r之后紧跟着oot的行,比如oot,rrroot等 |
+ | 匹配1个或多个前导字符 | /a+b/ | 匹配1个或多个a加b的行,比如ab,aab等 |
? | 匹配0个或1个前导字符 | /a?b/ | 匹配b或ab的行 |
[] | 匹配指定字符组内的任意一个字符 | /^[abc] | 匹配不以字母a或b或c开头的行 |
[^] | 匹配不在指定字符组内任意一个字符 | /^[^abc]/ | 匹配不以字母a或b或c开头的行 |
() | 子表达式组合 | /(root)+/ | 表示一个或多个root组合,当有一些字符需要组合时,使用括号括起来 |
| | 或者的意思 | /(root)|B/ | 匹配root或者B的行 |
| | 转义字符 | /a\/\// | 匹配a// |
~,!~ | 匹配,不匹配的条件语句 | $1~/root/ | 匹配第一个字段包含字符root的所有记录 |
x{m} x{m,} X{m,n} | x重复m次,x重复至少m次,x重复至少m次,但不超过n次需要指定参数:-posix或者–re-interval没有该参数不能使用该模式 | /(root){3}/ /(root){3,}/ /(root){5,6}/ | 需要注意一点的是,root加括号和不加括号的区别,x可以表示字符串也可以只是一个字符,所以/root{5}/表示匹配roo再加上5个t,及roottttt,/(root){2,}/则表示匹配rootrootrootroot等 |
6.条件语句 循环 和数组
语法和C语言类似
条件语句:
if else elseif
循环结构:
do…while
for
break
continue
数组:
awk中数组都是关联数组,数字索引也会转变为字符串索引
for(n in string)得到的是无序的数组
常用字符串函数
函数 | 说明 |
---|---|
gsub(Ere,Repl,[ln]) | 除了正则表达式所有具体值被替代这点,他和sub函数完全一样地执行 |
sub(Ere,Repl,[ln]) | 用Repl参数指定的字符串替换ln参数指定的字符串中的由Ere参数指定的扩展正则表达式的第一个具体值,sub函数返回替换的数量,出现在Repl参数指定的字符串中的&(和符号)由ln参数指定的Ere参数的指定的扩展正则表达式匹配字符串替换,如果未指定ln参数,缺省值是整个记录($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数组中的元素用字符串值来创建 |
tolower(String) | 返回String参数指定的字符串,字符串中每个大写字符将更改为小写,大写和小写,大写和小写的映射由当前语言环境的LC_CTYPE范畴定义. |
toupper(String) | 返回String参数指定的字符串,字符串中每个小写字符将更改为大写,大写和小写的映射由当前语言环境的LC_CTYPE范畴定义 |
Sprintf(Format,Expr,Expr,…) | 根据Format参数指定的printf子例程格式化字符串来格式化Expr参数指定的表达式并返回最后生成的字符串. |
以上内容来源。1
参考《跟老男孩学Linux三剑客命令V1》第一章 Awk讲解 ↩︎