作为一个应用运维攻城狮,Linux三剑客命令是必备敲门砖。今天我梳理了下关于awk命令面试中最常问的几个问题,虽然不是高级命令,但在公司大数据日志云平台还不成熟的条件下几乎每天都会频繁用到。
1、基础用法命令格式:
awk [-F分隔符] [-v 变量=值] ‘BEGIN { 初始化 } { 循环执行部分 } END { 结束处理 }’ file1 file2 ···
[-F|-f|-v] 大参数,-F指定分隔符,-f调用脚本,-v定义变量 var=value
' ' 引用代码块
BEGIN 初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符
// 匹配代码块,可以是字符串或正则表达式
{} 命令代码块,包含一条或多条命令
; 多条命令使用分号分隔
END 结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息
示例:awk '{pirnt $1}' test.txt
2、各参数详解:
$0 表示整个当前行
$1 每行第一个字段
NF 字段数量变量
NR 每行的记录号,多文件记录递增
F 指定分隔符
3、以下就是面试官常问命令,提问方式大同小异但是考察内容都是一样的:
a、一个文本有2列,从文本中找出所有请求IP,并统计每个IP的个数,
awk '{print $1}' test.txt| sort | uniq -c |sort -rn | head -n 5
b、每个IP后面都有一个数字,将IP相同都第二列数字求和
cat test.txt |awk '{a[$1] += $2} END {for (i in a) print i, a[i]}' >> sum.txt
4、常见的统计命令:
a、求和:cat data|awk '{sum+=$1} END {print "Sum = ", sum}'
b、求平均:cat data|awk '{sum+=$1} END {print "Ave = ", sum/NR}'
c、求最大值:cat data|awk 'BEGIN {max = 0} {if ($1>max) max=$1 fi} END {print "Max=", max}'
d、求最小值:cat data|awk 'BEGIN {min = 1999999} {if ($1<min) min=$1 fi} END {print "Min=", min}'
e、求某个字段前N:awk '{print $M}' web_access.log|sort|uniq -c |sort -rn|head -N