awk即gawk,是一款在Linux中实现文本格式化输出的文本处理工具,在Linux中与文本过滤工具grep和文本行编辑器sed共同组成Linux中的文本处理三剑客。express
awk在处理文本时以行为单位,读入整行数据后以指定的分隔符对行进行切片,而后再针对切片后的数据进行处理。以下图所示:数组
文本通过指定的分隔符进行切片后再对每一片进行处理,而后在根据设定的动做对处理后的文本执行动做,而切片后的文本若是只想引用一部分也可使用变量进行引用,其引用的各个变量以下表所示:bash
变量服务器 |
指代tcp |
$0、$N编辑器 |
当前处理行的全部内容ide |
$1,$2,$3...函数 |
当前处理行切片后的第1、第2、第三...片内容工具 |
awk使用方式spa
1.awk命令行
#awk
2.awk程序文件
awk -f /PATH/TO/awk_script_file
3.awk脚本
#!/bin/awk -f
awk基本基本语法
awk [OPTIONS] ‘program’ FILE1 FILE2......
Program:PATTERN{ACTION STATEMENT}
Program由语句组成,各语句之间使用;隔开
OPTIONS:
-F:指定分隔符
例:显示当前系统的各用户名及其UID
[root@localhost tmp]# awk -F: '{print $1,$3}' /etc/passwd
-v:指定变量
例:使用awk定义一个变量,并显示其值
[root@localhost tmp]# awk -v file=/etc/passwd BEGIN'{print file}'
/etc/passwd
-f:后接awk脚本文件
例:
awk内置变量:
变量 |
意义 |
变量 |
做用 |
FS |
输入分隔符 |
OFS |
输出分隔符 |
RS |
行分隔符 |
NR |
文件的行数(统一计数) |
NF |
当前行的字段数 |
FNR |
文件的行数(单独计数) |
FILENAME |
当前处理文件的文件名 |
ARGC |
当前命令行参数的个数 |
ARGV |
以数组方式保存命令行参数个数 |
变量的几个使用实例
例1:使用多种字符做为输入分隔符
例2:使用不一样的输出分隔符
例3:使用“,”做为行分隔符
例4:查看当前文件每行的字段数
例5:使用分别计数和统一计数显示当前处理的文件和正处理的行数,并显示其文件名
例6:显示当前命令的参数个数
[root@localhost tmp]# awk 'BEGIN{print ARGC}' 1
ACTION之print、printf
EXPRESSIONS:表达式
Control Statements:控制语句
if (condition){statements} [else {statement}]
例:打印指定文件的行,条件为其字段数必须大于三
while (condition) {statements}
例:显示指定文件中单词长度大于5的字符串
do statement while (condition)
for (expr1;expr2;expr3){statements}
for (var in array){statements}:遍历数组array中的元素
break
语法:break [n]:表示退出n轮循环
continue
exit [expression]
{statements}
next:执行next会跳过当前动做,进入下一轮
例:找出当前系统上全部UID为偶数的用户,并显示其用户名和UID
Compound Statements:复合语句
Input statements:输入语句
Output statements:输出语句
print:直接打印输出内容,会自动换行,上面已经有例子
print item1,item2,...
printf:格式化打印输出指定内容,不会自动换行
printf FORMAT [修饰符]item1,item2,......
FORMAT:
%c:只显示字符的ASCII码
%d:,%i:显示为十进制整数
%f:显示浮点数
%g,%G:以科学计数法或浮点数格式显示数值
%s:显示字符串
%u:显示无符号整数
%%:显示%自己
修饰符:
#[#]
+:显示数值符号
-:左对齐
格式化输出的一个实例
例:格式化输出当前系统的用户和其ID
[root@localhost tmp]# awk -F":" '{printf "%s\n %s %15-s %s %2-4s %s\n","---------------------------","|",$1,"|",$3,"|"}' /etc/passwd
awk中的操做符
算数操做符:
操做符 |
意义 |
操做符 |
意义 |
x+y |
x加y |
-x |
表示x是个负值 |
x-y |
x减y |
x%y |
x对y取模 |
x*y |
x乘y |
x^y |
x的y次方 |
x/y |
x除y |
例:定义两个变量,计算两个变量的和
[root@localhost tmp]# awk -v f1=2 -v f2=3 'BEGIN{print f1+f2}'
字符操做符:
字符链接,可直接写,不使用其余符号,
赋值操做符:
操做符 |
意义 |
操做符 |
意义 |
= |
直接赋值 |
%= |
取模后赋值 |
+= |
加后赋值 |
^= |
次方后赋值 |
-= |
减后赋值 |
-- |
自减1后赋值 |
*= |
乘后赋值 |
++ |
自加1后赋值 |
/= |
除后赋值 |
例:定义一个变量,而后对变量进行自加后打印出来
[root@localhost tmp]# awk -v test=1 'BEGIN{test++;print test}'
比较操做符:
操做符 |
意义 |
> |
前面变量是否大于后面变量 |
>= |
前面变量是否大于或者等于后面变量 |
< |
前面变量是否小于后面变量 |
<= |
前面变量是否小于或等于后面变量 |
== |
比较先后两个变量是否等值 |
!= |
比较先后连个变量是否不等 |
例:定义两个变量并赋值,判断其是否相等
[root@localhost tmp]# awk -v f1=2 -v f2=3 'BEGIN{print f1==f2}' 1
模式匹配操做符
操做符 |
意义 |
~ |
是否能被右侧模式所匹配 |
!~ |
是否不能被右侧模式所匹配 |
例:查看当前系统上全部用户的用户名有哪些是以r开头的
[root@localhost tmp]# awk -F: '{print "user:"$1,"T/F:",$1~/^r.*/}' /etc/passwd
逻辑操做符
操做符 |
意义 |
&& |
与运算 |
|| |
或运算 |
! |
非运算 |
例:判断给定文件中是否包含root字符串或第一和第二个字符串是否为都为tom,1为是,0为否
[root@localhost tmp]# awk -F" " '{print NR,($1=="root" || $2=="root" ||$1==$2 && $1=="tom") }' awk
条件表达式:
selector?If-ture-expression:if-false-expression
例:判断当前系统上的各个帐号的类型(系统帐号和普通帐号)
[root@localhost tmp]# awk -F: '$3<500?utype="system user":utype="common user"{print $1,":",utype}' /etc/passwd
函数调用:
function_name(argu1,argu2...)
常见内建函数
land():返回0,1随机数
length():取字符串长度
sub(r,s,[,t]):基于r所表示的模式来匹配字符串t中的内容,将其第一次被匹配到的内容替换为s所表示的字符串
gsub(r,s,[,t]):同上,只不过是全局替换
split(r,a[,r]):以r为分隔符取切割字符串s,并将切割后的结果保存至a所表示的数组中
substr(s,i,n):从s所表示的字符串取子串,取法:从i表示的位置开始,取n个字符
systime():取当前系统的时间戳
用户自定义函数
Function f_name(p,q){...}
PATTERN:
空模式:匹配文本中的全部行
/Regular Expression/:仅将ACTION应用于Regular Expression所匹配到的行
例:显示/etc/passwd文件中包含root字符串行的相关信息
[root@localhost tmp]# awk '/root/{print $0}' /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin
关系表达式:结果为真时才执行
例:找出/etc/passwd文件中的普通用户,并打印输出
[root@localhost tmp]# awk -F: '$3>=500{print $1,$3}' /etc/passwd wuxiaotao 500 wxt 501
行定界:start_line,stop_line
BEGIN:在文件格式化操做以前实现执行的一次操做
例:打印欢迎信息
[root@localhost tmp]# awk 'BEGIN{print "hello welcome!"}'
END:在文件格式化操做完成后,命令退出以前执行的一次操做
例:处理完文件后提示文件已经处理完了
[root@localhost tmp]# awk -F: '$3>=500{print $1,$3}END{print "The End"}' /etc/passwd wuxiaotao 500 wxt 501 The End
数组:
关联数组:array[index-expression]
Index-expression
可使用任意字符
若是某数组事先不存在,则在引用时,awk会自动建立此元素将其值初始化为空串
例:统计给定文件中各个单词的出现次数
[root@localhost tmp]# awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(j in count){print j,count[j]}}' awk
例:查看当前tcp协议的各类状态的个数
[root@localhost tmp]# ss -tan | awk '!/state/{state[$1]++}END{for(i in state)print i,state[i]}'
例:统计当前服务器上各个ip访问的次数
[root@localhost tmp]# awk '{ip[$1]++}END{for(i in ip)print i,ip[i]}' /var/log/httpd/access_log
差很少就这样吧,内容太多了,不少格式也不统一,有些都是上课跟着老师作的笔记。惭愧!