gawk是由GNU组织改良后的awk,这种语言在linux操作系统上,有着很好的应用,它不需要编译,比其它语言更为简洁,而且效率极高,还能与shell进行交互,是运维人员必不可少的编辑三剑客之一
gawk是一种报告生成器,它将文本读入内存,然后,结符合的显示在屏幕上
gawk的基本语法:
gawk [options] ‘program‘ file file …
gawk [options] ‘PATTERN{action}‘file file…
1、gawk的输出,使用print和printf
注意:
a、各个项目之间用逗号分隔,输出时使用输出分隔符
b、输出的各item可以为字符串、数值、当前记录的字段、变量、gawk的表达式
数值会被隐式转换为字符串后输出。
c、如果print后面的item省略,相当于print $0;输出空白使用print""
printf:
命令的使用格式:printf format,item1,item2,…
注意:
a、一定要指定format
b、输出时,不会自动换行,需要加入\n
c、format用于为每个item输出指定的格式
format的指示符以%开头,后跟一个修饰符
%c:显示字符的ASCII符
%d,%i:十进制的整数
%e,%E:科学技术法显示数值
%f:显示浮点数
%s:显示字符串
%u:显示无符号整数
%%:这是一个转义,相当于%自身
修饰符
#:显示宽度,是一个数值
-:左对齐显示
+:显示数值的符号
.#:取数值的精度
gawk的内置变量:
FS:输入时的字段分隔符
RS:输入是的行分隔符
OFS:输出时的字段分隔符
ORS:输出时的行分隔符
NF:显示字段数
NR:显示文件的行数,如果多个文件,一并线束
FNR:对NR的补充,分别对每个文件分别计数
ARVG:数组,保存命令的本身
实例:
gawk ‘{print $0}‘ file1 file2
ARGV[0]:gawk
ARGV[1]:file1
ARGC:保存gawk命令中参数的个数
上面的参数为3
FILENAME:gawk正在处理的文件的名称
这里是file1和file2
############################################
自定义变量
-v VAR_NAME=VALUE
变量名区分字符大小写
可以再program中定义;或是在命令行中定义
实例:
[[email protected] tmp]# gawk -v test="hello linux" ‘{print test}‘ /etc/issue
[[email protected] tmp]# gawk ‘{test="hello linux";print test}‘ /etc/issue
这里的issue只是为了提供遍历的次数
##########################################
gawk的输出重定向:
print items > output_file
print items >> output_file
print items | command
特殊的文件描述符
/dev/stdin:标准输入
/dev/stdout:标准输出
/dev/stderr:错误输出
实例:
将uid大于500的用户输出到common文件中
[[email protected] tmp]# gawk -F: ‘$3>=500{print}‘ /etc/passwd > common_user
[[email protected] tmp]# gawk ‘BEGIN {"date" | getline d; print d}‘
#########################################
gawk的操作符:
算术操作符
x+y:相加
x-y:相减
x*y:相乘
x/y:相除
x**y,x^y:幂运算
x%y:取模运算
-x:负值
+x:转换为数值
字符串操作符:连接
负值操作符
=
+=
-=
*=
/=
%=
^=,**=
++
–
注意:如果模式自身为=号,则要写成/=/
比较操作符
<
<=
>
>=
==
!=
~:模式匹配,左边的字符串若是能被右边的模式所匹配,则为真,否则为假
!~:与上面相反,表示不能匹配
逻辑操作符
&&:相与
||:相或
条件表达式
selector?if-true-expression:if-false-express
实例:
# awk -F: ‘{$3>=500?utype="common user":utype="admin or system user";print $1,"is",utype}‘
/etc/passwd
模式:
1、格式为/PATTERN/
仅处理被/PATTERN/匹配到的行
2、表达式,其结果为非0或非空字符串时
仅处理满足条件的行
3、行范围,地址定界,start_line,stop_line
仅处理范围的行
4、BEGIN/END,特殊模式,运行在program之前或是之后
控制语句
if-else:
格式:if (condition) (then body) else (else body)
实例:将/etc/inittab文件下,大于8个字段的都显示处理
[[email protected] ~]# gawk ‘{if (NF>=8) print}‘ /etc/inittab
while:
格式:while (condition) {while body}
[[email protected] ~]# gawk ‘{test=1;while (test<=NF) {if (length($test)>=5)
{print $test};test++ }}‘ /etc/inittab
for:
格式:for (variable assignment;condition;itenration process) {for body}
[[email protected] ~]# gawk ‘{for (i=1;i<=NF;i+=2){printf "%s",$i};print ""}‘ /etc/passwd
next:提前结束对本行的处理,进而进入下一行的处理
显示奇数行的用户名,如果有多个文件时,使用FNR
[[email protected] ~]# gawk -F: ‘{if (NR%2==0) next; print NR,$1}‘ /etc/passwd
gawk的内置函数
split:切割
格式:split(string,array[,fieldsep[,seps]])
功能:将string表示的字符串以fieldsep为分隔符进行切片,结果保存在array数组中
数组下表从1开始
实例:用gawk取出当前的时间,hh:mm:ss
[[email protected] ~]# date | gawk ‘{split($0,arr," ");print arr[4]}‘
length字符串的长度
[[email protected] ~]# echo "hello world" | gawk ‘{print length}‘
substr:
格式:substr(string,start[,length])
功能:从string中取子串,从start为起始位置为取length长度的子串
实例
[[email protected] ~]# echo "hello world" | gawk ‘{print (substr($0,7))}‘
[[email protected] ~]# echo "hello world" | gawk ‘{print (substr($0,2,4))}‘