誉重网站建设,个人网站建设论文中期报告,手机app开发最好的工具,西安前端开发招聘目录
工作原理
命令格式
awk常见的内建变量#xff08;可直接用#xff09;如下所示
按行输出文本 按字段输出文本
通过管道、双引号调用 Shell 命令
示例
CPU使用率
数组
编辑统计文件的内容出现的次数
使用awk 统计secure 访问日志中每个客户端IP的出现次数? …目录
工作原理
命令格式
awk常见的内建变量可直接用如下所示
按行输出文本 按字段输出文本
通过管道、双引号调用 Shell 命令
示例
CPU使用率
数组
编辑统计文件的内容出现的次数
使用awk 统计secure 访问日志中每个客户端IP的出现次数? 工作原理
逐行读取文本默认以空格或tab键为分隔符进行分隔将分隔所得的各个字段保存到内建变量
中并按模式或者条件执行编辑命令。
sed命令常用于一整行的处理而awk比较倾向于将一行分成多个“字段”然后再进行处理。awk信息
的读入也是逐行读取的执行结果可以通过print的功能将字段数据打印显示。在使用awk命令的过
程中,可以使用逻辑操作符“”表示“与”、“||”表示“或”、“!”表示“非”还可以进行简单的数学运算
如、-、*、/、%、^分别表示加、减、乘、除、取余和乘方。
命令格式 awk 选项 模式或条件 {操作} 文件 1 文件 2 … awk -f 脚本文件 文件 1 文件 2 … awk常见的内建变量可直接用如下所示 FS列分割符。指定每行文本的字段分隔符默认为空格或制表位。与-F作用相同 NF当前处理的行的字段个数。 NR当前处理的行的行号序数。 $0当前处理的行的整行内容。 $n当前处理行的第n个字段第n列。 FILENAME被处理的文件名。 RS行分隔符。awk从文件上读取资料时,将根据RS的定义把资料切割成许多条记录,而awk一次仅读入一条记录,以进行处理。预设值是\n 按行输出文本
awk {print} a.txt #输出所有内容 awk {print $0} a.txt #输出所有内容 awk NR1,NR3{print} a.txt #输出第 1~3 行内容 awk (NR1)(NR3){print} a.txt #输出第 1~3 行内容 awk NR1||NR3{print}a.txt #输出第1行、第3行内容 awk (NR%2)1{print} a.txt #输出所有奇数行的内容 awk (NR%2)0{print} a.txt #输出所有偶数行的内容 awk /^root/{print} passwd #输出以 root 开头的行 awk /nologin$/{print} /etc/passwd #输出以 nologin 结尾的行 awk BEGIN {x0};/\/bin\/bash$/{x};END {print x} /etc/passwd #统计以/bin/bash 结尾的行数等同于 grep -c /bin/bash$ /etc/passwd BEGIN模式表示在处理指定的文本之前需要先执行BEGIN模式中指定的动作awk再处理指定的文本之后再执行END模式中指定的动作END{}语句块中往往会放入打印结果等语句 按字段输出文本
awk -F : {print $3} passwd #输出每行中(以空格或制表位分隔)的第3个字段 awk -F : {print $1,$3} passwd #输出每行中的第1、3个字段 awk -F : $35{print $1,$3} passwd #输出第3个字段的值小于5的第1、3个字段内容 awk -F : !($3200){print} passwd #输出第3个字段的值不小于200的行 awk BEGIN {FS:};{if($31000){print}} passwd #先处理完BEGIN的内容再打印文本里面的内容 awk -F : {max($3$4)?$3:$4;{print max}} passwd #($3$4)?$3:$4;三元运算符如果第3个字段的值大于等于第4个字段的值则把第3个字段的值赋给max否则第4个字段的值赋给max awk -F : {print NR,$0} passwd #输出每行内容和行号每处理完一条记录NR值加1 awk -F : $7~/bash{print $1} passwd #输出以冒号分隔且第7个字段中包含/bash的行的第1个字段 awk -F : ($1~root)(NF7){print $1,$2} passwd #输出第1个字段中包含root且有7个字段的行的第1、2个字段 awk -F : ($7!/bin/bash)($7!/sbin/nologin){print} passwd #输出第7个字段既不为/bin/bash也不为/sbin/nologin的所有行 通过管道、双引号调用 Shell 命令
echo $PATH | awk BEGIN{RS:};END{print NR} #统计以冒号分隔的文本段落数END{}语句块中往往会放入打印结果等语句 awk -F: /bash$/{print | wc -l} passwd #调用 wc -l 命令统计使用 bash 的用户个数,等同于 grep -c bash$ /etc/passwd free -m | awk /Mem:/ {print $3/$2 * 100%} #查看当前内存使用百分比 top -b -n 1 | grep Cpu | awk -F , {print $4} | awk {print $1} #查看当前CPU空闲率-b -n 1 表示只需要1次的输出结果 date -d $(awk -F . {print $1} /proc/uptime) second ago %F %H:%M:%S #显示上次系统重启时间等同于uptimesecond ago为显示多少秒前的时间%F %H:%M:%S等同于%Y-%m-%d %H:%M:%S的时间格式
/proc/uptime 第一列输出的是系统启动到现在的时间以秒为单位第二列输出的是系统空闲的时间以秒为单位
date -d $(date -d1 month %Y%m01) -3 day %Y%m%d 当月倒数第三天
date %Y%m01 当月第一天 awk BEGIN {n0 ; while (w | getline) n ; {print n-2}} #调用w命令,并用来统计在线用户数 awk BEGIN {hostname | getline ; {print $0}} #调用 hostname,并输出当前的主机名 seq 10 | awk {getline; print $0} #获取偶数行 seq 10 | awk {print $0; getline} #获取奇数行 当getline左右无重定向符“”或“|”时awk首先读取到了第一行就是1然后getline就得到了1下面的第二行就是2因为getline之后awk会改变对应的NFNRFNR和$0等内部变量所以此时的$0的值就不再是1而是2了然后将它打印出来。 当getline左右有重定向符“”或“|”时getline则作用于定向输入文件由于该文件是刚打开并没有被awk读入一行只是getline读入那么getline返回的是该文件的第一行而不是隔行。
FNRawk当前读取的记录数其变量值小于等于NR比如当读取第二个文件时FNR是从0开始重新计数而NR不会。 NRFNR用于在读取两个或两个以上的文件时判断是不是在读取第一个文件
示例
CPU使用率
cpu_ustop -b -n 1 | grep Cpu | awk {print $2}
cpu_sum$(($cpu_us$cpu_sy))
echo $cpu_sum
echo A B C D | awk {OFS|;print $0;$1$1;print $0} A B C D A|B|C|D
$1$1 是用来激活$0的重新赋值,也就是说 字段$1...和字段数NF的改变会促使awk重新计算$0的
值,通常是在改变OFS后而需要输出$0时这样做
数组
awk BEGIN{a[0]10;a[1]20; print a[1]} awk BEGIN{a[0]10;a[1]20; print a[0}} awk BEGIN{a[abc]10;a[xyz]20;print a[abc]} awk BEGIN{a[abc]10;a[xyz]20;print a[xyz]} awk BEGIN{a[abc]aabbcc;a[xyz]xxyyzz;print a[xyz]} awk BEGIN{a[0]10;a[1]20;a[2]30;for(i in a){print i,a[i]}}
PS1BEGIN中的命令只执行一次 PS2awk数组的下标除了可以使用数字也可以使用字符串字符串需要使用双引号
统计文件的内容出现的次数 cat test.txt aaa aaa bbb ccc aaa bbb aaa awk {a[1]}END{for(i in a){print a[i]}} test.txt PSa[1]初始为0a[1]后即为1而这里awk中的a[1]最终的值是由test.txt文本内容有多少行决定的文本逐行读取完毕后再执行END中的命令 使用awk 统计secure 访问日志中每个客户端IP的出现次数?
cat /var/log/secure | awk /Failed password/{a[$11]};END{for(i in a){print i,a[i]}}备注:定义数组数组名称为ip数字的下标为日志文件的第1列也就是客户端的IР地址)的目的在于对客户端进行统计计数客户端IP出现一次计数器就加1。END中的指令在读取完文件后执行通过循环将所有统计信息输出for循环遍历的是数组名ip的下标。