1、基本语法
Awk –Fs ‘/pattern/ {action}’ input-file (或者) Awk –Fs ‘{action}’ input-file
-Fs 是分隔符,默认是空格。
-F : 和-F ':' 都是对的
/pattern/指定的模式,可不选,不选则表示awk处理文件的所有内容。
{action}可以是单个命令也可以是多个命令。
input-file是要处理的文件。
/pattern/ {action} 需要用单引号引起来。
例如
awk -F : '/root/{print $1}' /etc/passwd
以冒号为分隔符,打印 /etc/passwd中匹配到的第一个字段。
2、awk命令脚本文件
-f 参数调用这个脚本文件。
awk -Fs -f script.awk /etc/passwd
3、awk程序结构区域{BEGIN,BODY,END}
BEGIN区域的基本用法:
BEGIN{awk-commands}
BEGIN必须大写,并且在执行body区域之前执行一次,也可以用来初始化变量。
body区域的用法
/pattern/{action}
body部分只有正则模式和对应的命令,每读取一行,执行一次命令。
end区域
语法:
END { awk-commands }
在整个命令结束后执行一次。AND关键字必须大写。
4、打印命令print
awk '{print}' test.txt
等同于cat test.txt
5、-F的作用
指定分隔符
搭配$使用,指定以指定分隔符的第几个字段的内容,一般print出来。
6、awk的内置变量
(1)FS 指定输入字段分隔符,在BEGIN区域使用
例如
awk -F ', ' '{print $1 $2}' /etc/passwd
等同于
awk 'BEGIN{FS=","} {print $1,$2}' /etc/passwd
如何指定多个输入字段分隔符?
FS依然可以解决,例如:
awk 'BEGIN{FS="[,?%:]"} {print $1,$2}' /etc/passwd
(2)输出字段分隔符OFS
没有指定输出字段分隔符的时候一般是以空格隔开
例如
awk -F ',' 'BEGIN {OFS=":"} {print $2,$3}' /etc/paswd
(3)记录分隔符RS
默认的字段记录分隔符号为换行符
$vi employee-one-line.txt
添加如下内容
101,John Doe:102,Jason Smith:103,Raj Reddy:104,Anand Ram:105,Jane, Miller
$awk -F, '{print $2}' employee-one-line.txt
结果是:
John Doe:102
如果指定了记录分隔符为:则
awk -F , 'BEGIN{RS=":"} {print $2}' employ-one-line.txt
结果为:
John Doe
Jason Smith
Raj Reddy
Anand Ram
Jane Miller
(4)输出记录分隔符ORS
awk默认的输出记录分隔符为ORS
awk 'BEGIN{FS="," ORS="\n----\n"} {print $1,$2} ' employee.txt
John Doe CEO
---
Jason Smith IT Manager
---
Raj Reddy Sysadmin
---
Anand Ram Developer
---
Jane Miller Sales Manager
(5)记录序号NR 和FNR
NR在循环处理过程中,处理第二个文件的时候,NR继续加1,而FNR则是在处理第二个文件开始,FNR重新从1开始记录序号。
(6)变量
是由数字字母和下划线组成。
- 取反
+ 取正,返回数字本身
-- 自减
++ 自增
算术运算符
+ - * / %
还有比较运算符,赋值运算符,比较简单
== 等于
&& 且
|| 或
!= 不等于
正则表达式操作符
~ 匹配
!~ 不匹配
(7)循环等语句
if else
while
do while
for
break语句
continue
exit