首页 > 代码库 > awk
awk
正则表达三剑客:
grep:文
本过滤器
sed:行编辑器
awk: 报告生成器
GNU AWK :gawk
awk使用的基本语法
awk [options]’program’file file...
awk[options]’’
awk工作原理 切片整行 输入空白符号 默认空格 赋值给内建变量$1 $2...整行$0
$nf number file
遍历。。。为什么还要循环呢 每一行都有很多字段 如果对每一行的字段 按条件 就需要循环了
awk的输出
print item1,item2
①各项目之间使用逗号分隔,而输出时则使用输出分隔符分隔
②输出的各item可以是字符串或者数值。当前记录的字段 变量或者awk表达式。数值会被隐式转换为字符串后输出
③print后面的item如果省略,相当于print $0 ,输出空白,使用print””
#awk -F: ‘{print $1}‘ /etc/passwd
#awk -F: ‘{print "hello",$1}‘ /etc/passwd
2.awk的变量
内置变量
自定义变量
2.1内置变量
FS:Field Seperator ,输入时的字段分隔符
#awk ‘BEGIN{FS=":"}{print $1,$7}‘ /etc/passwd
RS:Record Seperator ,输出行分隔符
OFS :Output filed Seperator 输出时的字段分隔符
#awk ‘BEGIN{FS=":";OFS=":"}{print $1,$7}‘ /etc/passwd
ORS:Output Row Seperator 输出时的行分隔符
#awk ‘BEGIN{FS=":";ORS=":"}{print $1,$7}‘ /etc/passwd
NF:numbers of field 字段数
NR:numbers of Record 行数 所有文件的一并计数
FNR:行数 各文件分别计数
#awk ‘BEGIN{FS=":";OFS=":"}{print FNR,$1,$7}‘ /etc/passwd
Awk中引用变量引用无需加$符号
ARGV 数组 保存命令本身这个字符,awk‘{print $0}‘1.txt 2.txt 意味着ARGV[0]保存awk
ARGC 保存awk命令中参数的个数的
awk‘BEGIN{print ARGV[0],ARGV[1]}‘ /etc/passwd /etc/group
awk ‘BEGIN{print ARGV[0],ARGV[1],ARGC}‘ /etc/passwd /etc/group
FILENAME:awk正在处理的当前文件的名称
2.2可自定义变量
-v var_name=VALUE
变量名区分字符大小写;
#awk ‘BEGIN{a="hello awk"}{print a]‘ /etc/passwd
#awk ‘BEGIN{a="hello awk";print a}‘
#awk -v a="hello gawk" ‘BEGIN{print a}
‘
①可以在program中定义变量
②可以在命令行中定义变量:awk中-v的选项
3.awk的printf(打印格式)
命令使用格式:printf format,item1,item2...
要点:
(1)要指定format
(2)不会自动换行,如需换行则需要给出\n
(3)Format用于为后面的每个item指定其输出格式
Format格式的指示符都%开头,后跟一个字符
%c显示字符的ASCII码
%d ,%i 十进制整数
%e,%E 科学计数法显示数值
%f 显示浮点数
%g,%G以科学计数法格式或者浮点数格式显示
%s 显示字符串
%u 显示无符号整数
%% 显示%自身
修饰符:
# 显示宽度
- 左对齐
+ 显示数值的符号
.# 取值精度
#awk -F:‘{printf "%20s,%30s\n",$1,$7}‘ /etc/passwd
#awk -F:‘{printf "%15s,%-20s\n",$1,$7}‘ /etc/passwd
浮点数格式
#awk ‘BEGIN{printf "%f\n",3.1415}‘
浮点数格式#awk ‘BEGIN{printf "%f\n",3.1415926}‘
4 awk输出重定向
Print items > output-file
Print items >> output-file
Print items | command
特殊文件描述符
/dev/stdin:标准输入
/dev/stdout:标准输出
/dev/stderr:错误输出
5.awk的操作符
算术操作符:
x+y
x-y
x*y
x/y
x**y,x^y
x%y
-x 负值
+x 转换为数值
赋值操作符
=
+=
-=
*=
/=
%=
^=
**=
++
--
如果模式自身为=号 要写为/=/
比较操作符
<
<=
>
>=
==
!=
~ 模式匹配 左边的字符串能够被右边的模式所匹配 匹配为真 否则为假
!~
subscript in array
逻辑操作符
&&与
|| 或
条件表达式
selector?If-true-expression:if-false-expression 表达式
函数调用:
function_name(argu1,argu2)
6.模式
①正则表达式Regexp:格式为/PATTERN/
仅处理被/PATTERN匹配到的行
②Expression :表达式,其结果为非0或者非空字符串时满足条件
仅处理满足条件的行
③Ranges:行范围,此前地址定界,startline,endline
仅处理范围内的行
④BEGIN/END;特殊模式,仅在awk命令的program运行之前(BEGIN)或运行之后(END)执行一次
⑤Empty:空模式,匹配任意行
7.awk 常用的action
①Expression表达式
②Control statements 控制语句
③Compound statements 组合语句
④Input statements 输入语句
⑤Output statements 输出语句
8控制语句
①if-else语句
格式:if(condition){then body}else{else body}
如果id号大于500 为普通用户 否则为系统用户
#awk -F: ’{if ($3>=500) {print $1}}’
字段数大于8的数
②while
格式:while (condition){while body}
例:显示inittab第奇数字段
length()函数 取字符串的长度 内置函数
字符个数大于等于6的
③do-while 循环
格式:do{do-while body}while(condition) 至少循环一次循环体
显示奇数的字段
④for循环
格式:for (variable assignment;condition;iteration process){for body}
字段大于等于6的
for循环可用来遍历数组元素
语法:for (i in array){for body}遍历元素的缩影
⑤case语句
语法:switch(Expression){case VALUE or RGEEXP/: statement1;...default: stementN}
⑥循环控制
break
continue
⑦next
提前结束对本行的处理而进入下一行进行处理
显示passwd下奇数行的用户名
如果某一行id为偶的显示
9.数组
array[index-expression]
Index-expression:可以使用任意字符串 如果某数组元素事先不存在,那么在引用时,awk会自动创建此元素并将其初始化为空字串。因此,要判断某数组是否存在某元素,必须使用“index in array”这种格式。
例A[FIRST]=’hello awk’’
print A[second]
要遍历数组中的每一个元素,需要使用如下特殊结构
For (var in array) {for body}
其var会遍历array的索引
state[LISTEN]++
state[ESRABLISHED]++
删除数组元素
delete array [index]
10.awk的内置函数
split(string,array[,fieldsep[,seps]]):
功能 :将sring表示的字符串以fieldsep为分隔符进行切片,并切片后的结果保存至
显示每个ip地址的次数
awk