awk编程
admin
2024-05-22 21:42:31
0

一、awk介绍

1)awk是一种编程语言,主要用于在linux/unix下对文本和数据进行处理,是linux/unix下的一个工具。数据可以来自标准输入、一个或多个文件,或其它命令的输出。
2)awk的处理文本和数据的方式:逐行扫描文件,默认从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。
3)awk分别代表其作者姓氏的第一个字母。因为它的作者是三个人,分别是Alfred Aho、Brian Kernighan、Peter Weinberger。
4)gawk是awk的GNU版本,它提供了Bell实验室和GNU的一些扩展。

命令模式语法

awk 选项 'commands' 文件名- 常用选项- -F  定义字段分割符号,默认的分隔符是空格- -v  定义变量并赋值'/root/{awk语句}'				            sed中: '/root/p''NR==1,NR==5{awk语句}'			sed中: '1,5p''/^root/,/^ftp/{awk语句}'           	sed中:'/^root/,/^ftp/p''{print $0;print $1}'		sed中:'p''NR==5{print $0}'				sed中:'5p'注:awk命令语句间用分号间隔===========================================- BEGIN...END....'BEGIN{awk语句};{处理中};END{awk语句}''BEGIN{awk语句};{处理中}''{处理中};END{awk语句}'============================================- 脚本执行方法1:awk 选项 -f awk的脚本文件  要处理的文本文件awk -f awk.sh filenamesed -f sed.sh -i filename方法2:./awk的脚本文件(或者绝对路径)	要处理的文本文件./awk.sh filename./sed.sh filename
================================================- 脚本编写#!/bin/awk -f 		定义魔法字符以下是awk引号里的命令清单,不要用引号保护命令,多个命令用分号间隔BEGIN{FS=":"}NR==1,NR==3{print $1"\t"$NF}

awk内部相关变量

变量变量说明备注
$0当前处理行的所有记录
$1,$2,$3…$n文件中每行以间隔符号分割的不同字段awk -F: ‘{print $1,$3}’
NF当前记录的字段数(列数)awk -F: ‘{print NF}’
$NF最后一列$(NF-1)表示倒数第二列
FNR/NR行号
FS定义间隔符‘BEGIN{FS=“:”};{print $1,$3}’
OFS定义输出字段分隔符,默认空格‘BEGIN{OFS=“\t”};print $1,$3}’
RS输入记录分割符,默认换行‘BEGIN{RS=“\t”};{print $0}’
ORS输出记录分割符,默认换行‘BEGIN{ORS=“\n\n”};{print $1,$3}’
FILENAME当前输入的文件名

案例1

[root@19c ~]# cat 1.txt
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
gnome-initial-setup:x:989:983::/run/gnome-initial-setup/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
============================================================
[root@19c ~]# awk -F: '{print $1,$(NF-1)}' 1.txt
nfsnobody /var/lib/nfs
gnome-initial-setup /run/gnome-initial-setup/
sshd /var/empty/sshd
avahi /var/run/avahi-daemon
postfix /var/spool/postfix
==============================================================
[root@19c ~]# awk -F: '{print $1,$(NF-1),$NF,NF}' 1.txt
nfsnobody /var/lib/nfs /sbin/nologin 7
gnome-initial-setup /run/gnome-initial-setup/ /sbin/nologin 7
sshd /var/empty/sshd /sbin/nologin 7
avahi /var/run/avahi-daemon /sbin/nologin 7
postfix /var/spool/postfix /sbin/nologin 7
==============================================================
[root@19c ~]# awk '/root/{print $0}' 1.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
=============================================================
[root@19c ~]# awk '/root/' 1.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
============================================================
[root@19c ~]# awk -F: '/root/{print $1,$NF}' 1.txt
root /bin/bash
operator /sbin/nologin
==========================================================
[root@19c ~]#  awk -F: '/root/{print $0}' 1.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
==========================================================
[root@19c ~]#  awk 'NR==1,NR==5' 1.txt
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
gnome-initial-setup:x:989:983::/run/gnome-initial-setup/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
===========================================================
[root@19c ~]# awk 'NR==1,NR==5{print $0}' 1.txt
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
gnome-initial-setup:x:989:983::/run/gnome-initial-setup/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
============================================================
[root@19c ~]# awk 'NR==1,NR==5;/^root/{print $0}' 1.txt
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
gnome-initial-setup:x:989:983::/run/gnome-initial-setup/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
=============================================================

#案例2:

FS和OFS:
[root@19c ~]# awk 'BEGIN{FS=":"};/^root/,/^lp/{print $1,$NF}' 1.txt
root /bin/bash
operator /sbin/nologin
============================================================
[root@19c ~]#  awk -F: 'BEGIN{OFS="\t\t"};/^root/,/^lp/{print $1,$NF}' 1.txt
root            /bin/bash
operator                /sbin/nologin
============================================================
[root@19c ~]#  awk -F: 'BEGIN{OFS="@@@"};/^root/,/^lp/{print $1,$NF}' 1.txt
root@@@/bin/bash
operator@@@/sbin/nologin
============================================================RS和ORS:
修改源文件前2行增加制表符和内容:
vim 1.txt
root:x:0:0:root:/root:/bin/bash hello   world
bin:x:1:1:bin:/bin:/sbin/nologin        test1   test2
[root@19c ~]# awk 'BEGIN{RS="\t"};{print $0}' 1.txt
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
gnome-initial-setup:x:989:983::/run/gnome-initial-setup/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
mysql:x:988:54324::/usr/local/mysql:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
root:x:0:0:root:/root:/bin/bash hello   world
bin:x:1:1:bin:/bin:/sbin/nologin        test1   test2
======================================================================awk 'BEGIN{ORS="\t"};{print $0}' 1.txt
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin   gnome-initial-setup:x:989:983::/run/gnome-initial-setup/:/sbin/nologin       sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin   avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin       postfix:x:89:89::/var/spool/postfix:/sbin/nologin    mysql:x:988:54324::/usr/local/mysql:/sbin/nologin   root:x:0:0:root:/root:/bin/bash  operator:x:11:0:operator:/root:/sbin/nologin    root:x:0:0:root:/root:/bin/bash hello   world        bin:x:1:1:bin:/bin:/sbin/nologin        test1   test2   [root@19c ~]#
=======================================================================格式化输出`print`和`printf`print函数		类似echo[root@19c ~]# date |awk '{print "Month: "$2 "\nYear: "$NF}'
Month: Feb
Year: 2023
====================================================================
[root@19c ~]# awk -F: '{print "username is: " $1 "\t uid is: "$3}' /etc/passwd
username is: root        uid is: 0
username is: bin         uid is: 1
=================================================================
[root@19c ~]# awk -F: '{printf "%-15s %-10s %-15s\n", $1,$2,$3}'  /etc/passwd
root            x          0
bin             x          1
daemon          x          2
=================================================================
[root@19c ~]# awk -F: '{printf "|%15s| %10s| %15s|\n", $1,$2,$3}' /etc/passwd
|           root|          x|               0|
|            bin|          x|               1|
|         daemon|          x|               2|
=================================================================
[root@19c ~]# awk -F: '{printf "|%-15s| %-10s| %-15s|\n", $1,$2,$3}' /etc/passwd
|root           | x         | 0              |
|bin            | x         | 1              |
|daemon         | x         | 2              |
=================================================================
[root@19c ~]# awk 'BEGIN{FS=":"};{printf "%-15s %-15s %-15s\n",$1,$6,$NF}' 1.txt
nfsnobody       /var/lib/nfs    /sbin/nologin
gnome-initial-setup /run/gnome-initial-setup/ /sbin/nologin
sshd            /var/empty/sshd /sbin/nologin
avahi           /var/run/avahi-daemon /sbin/nologin
=================================================================
%s 字符类型  strings			%-20s
%d 数值类型	
占15字符
- 表示左对齐,默认是右对齐
printf默认不会在行尾自动换行,加\n

awk工作原理

[root@19c ~]# echo awk -F: '{print $1,$3}' /etc/passwd

1. awk使用一行作为输入,并将这一行赋给内部变量$0,每一行也可称为一个记录,以换行符(RS)结束
2. 每行被间隔符**==:==**(默认为空格或制表符)分解成字段(或域),每个字段存储在已编号的变量中,从$1开始问:awk如何知道用空格来分隔字段的呢?答:因为有一个内部变量==FS==来确定字段分隔符。初始时,FS赋为空格
3. awk使用print函数打印字段,打印出来的字段会以==空格分隔==,因为\$1,\$3之间有一个逗号。逗号比较特殊,它映射为另一个内部变量,称为==输出字段分隔符==OFS,OFS默认为空格
4. awk处理完一行后,将从文件中获取另一行,并将其存储在$0中,覆盖原来的内容,然后将新的字符串分隔成字段并进行处理。该过程将持续到所有行处理完毕

#awk变量定义

[root@19c ~]# awk -v NUM=3 -F: '{ print $NUM }' /etc/passwd
0
1
===============================================
[root@19c ~]# awk -v NUM=3 -F: '{ print NUM }' /etc/passwd
3
3
===============================================
[root@19c ~]# awk -v num=1 'BEGIN{print num}'
1
===============================================
注意:
awk中调用定义的变量不需要加$

awk中BEGIN…END使用

​	①==BEGIN==:表示在程序开始前执行​	②==END== :表示所有文件处理完后执行​	③用法:`'BEGIN{开始处理之前};{处理中};END{处理结束后}'`打印最后一列和倒数第二列(登录shell和家目录)
[root@19c ~]# awk -F: 'BEGIN{ print "Login_shell\t\tLogin_home\n*******************"};{print $NF"\t\t"$(NF-1)};END{print "************************"}' 1.txt
Login_shell             Login_home
*******************
/sbin/nologin           /var/lib/nfs
/sbin/nologin           /run/gnome-initial-setup/
/sbin/nologin           /var/empty/sshd
/sbin/nologin           /var/run/avahi-daemon
/sbin/nologin           /var/spool/postfix
/sbin/nologin           /usr/local/mysql
/bin/bash               /root
/sbin/nologin           /root
/bin/bash hello   world         /root
/sbin/nologin        test1   test2              /bin
************************
================================================================[root@19c ~]# awk 'BEGIN{ FS=":";print "Login_shell\tLogin_home\n*******************"};{print $NF"\t"$(NF-1)};END{print "************************"}' 1.txt
Login_shell     Login_home
*******************
/sbin/nologin   /var/lib/nfs
/sbin/nologin   /run/gnome-initial-setup/
/sbin/nologin   /var/empty/sshd
/sbin/nologin   /var/run/avahi-daemon
/sbin/nologin   /var/spool/postfix
/sbin/nologin   /usr/local/mysql
/bin/bash       /root
/sbin/nologin   /root
/bin/bash hello   world /root
/sbin/nologin        test1   test2      /bin
************************
====================================================================打印/etc/passwd里的用户名、家目录及登录shellawk -F: 'BEGIN{print "u_name\t\th_dir\t\tshell" RS "*****************"}  {printf "%-15s %-20s %-20s\n",$1,$(NF-1),$NF}END{print "***************************"}'  /etc/passwd
u_name          h_dir           shell
*****************
root            /root                /bin/bash
bin             /bin                 /sbin/nologin
daemon          /sbin                /sbin/nologin====================================================================

awk和正则的综合运用

| 运算符 | 说明 |
| ----- - | -------- |
| == | 等于 |
| != | 不等于 |
| > | 大于 |
| < | 小于 |
| >= | 大于等于 |
| <= | 小于等于 |
| ~ | 匹配 |
| !~ | 不匹配 |
| ! | 逻辑非 |
| && | 逻辑与 |
| || | 逻辑或 |
示例

从第一行开始匹配到以lp开头行
awk -F: 'NR==1,/^lp/{print $0 }' passwd  
从第一行到第5行          
awk -F: 'NR==1,NR==5{print $0 }' passwd
从以lp开头的行匹配到第10行       
awk -F: '/^lp/,NR==10{print $0 }' passwd 
从以root开头的行匹配到以lp开头的行       
awk -F: '/^root/,/^lp/{print $0}' passwd
打印以root开头或者以lp开头的行            
awk -F: '/^root/ || /^lp/{print $0}' passwd
awk -F: '/^root/;/^lp/{print $0}' passwd
显示5-10行   
awk -F':' 'NR>=5 && NR<=10 {print $0}' /etc/passwd     
awk -F: 'NR<10 && NR>5 {print $0}' passwd 打印1-39行以bash结尾的内容:
[root@19c ~]# awk 'NR>=1 && NR<=39 && $0 ~/bash$/{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
==========================================================================
理解;号和||的含义:
[root@19c ~]# awk 'NR>=3 && NR<=8 || /bash$/' 1.txt
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin[root@19c ~]#  awk 'NR>=3 && NR<=8;/bash$/' 1.txt
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
=========================================================================
[root@19c ~]#  ifconfig enp0s8|grep -w inet|awk -F' ' '{print $2}'|awk '{print $1}'
192.168.56.168[root@19c ~]# ifconfig enp0s8|grep -w inet|awk '{print $2}'
192.168.56.168

练习

1、显示可以登录操作系统的用户所有信息     从第7列匹配以bash结尾,输出整行(当前行所有的列)
[root@19c ~]# awk '/bash$/{print $0}'    /etc/passwd
root:x:0:0:root:/root:/bin/bash
a:x:1000:1000:a:/home/a:/bin/bash
oracle:x:54321:54321::/home/oracle:/bin/bash
=======================================================================
[root@19c ~]#  awk '/bash$/{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
a:x:1000:1000:a:/home/a:/bin/bash
oracle:x:54321:54321::/home/oracle:/bin/bash
=======================================================================
[root@19c ~]# awk '/bash$/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
a:x:1000:1000:a:/home/a:/bin/bash
oracle:x:54321:54321::/home/oracle:/bin/bash
======================================================================
[root@19c ~]#  awk -F: '$7 ~ /bash/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
a:x:1000:1000:a:/home/a:/bin/bash
oracle:x:54321:54321::/home/oracle:/bin/bash
====================================================================
[root@19c ~]# awk -F: '$NF ~ /bash/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
a:x:1000:1000:a:/home/a:/bin/bash
oracle:x:54321:54321::/home/oracle:/bin/bash
[root@19c ~]#
===================================================================
[root@19c ~]# awk -F: '$0 ~ /bash/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
a:x:1000:1000:a:/home/a:/bin/bash
oracle:x:54321:54321::/home/oracle:/bin/bash
==================================================================
[root@19c ~]# awk -F: '$0 ~ /\/bin\/bash/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
a:x:1000:1000:a:/home/a:/bin/bash
oracle:x:54321:54321::/home/oracle:/bin/bash

2、显示可以登录系统的用户名

[root@19c ~]# awk -F: '$0 ~ /\/bin\/bash/{print $1}' /etc/passwd
root
a
oracle

3、打印出系统中普通用户的UID和用户名如下显示:

[root@19c ~]# awk -F: 'BEGIN{print "UID\tUSERNAME"} {if($3>=500 && $3 !=65534 ) {print $3"\t"$1} }' /etc/passwd
UID     USERNAME
999     polkitd
998     libstoragemgmt
997     colord

4、以数字开头

[root@19c ~]# awk -F: '{if($3 >= 500 && $3 != 65534) print $1,$3}' 1.txt
gnome-initial-setup 989
mysql 988awk '/^[0-9]/{print $0}'   1.txt

5、以任意大小写字母开头

[root@19c ~]# awk '/^[a-z]/{print $0}' 1.txt
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
gnome-initial-setup:x:989:983::/run/gnome-initial-setup/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
  1. awk的脚本编程
    6.1 流程控制语句
if语句:if [ xxx ];then
xxx
fi格式:
awk 选项 '正则,地址定位{awk语句}'  文件名
{ if(表达式){语句1;语句2;...}}awk -F: '{if($3>=500 && $3<=60000) {print $1,$3} }' passwd[root@19c ~]# awk -F: '{if($3==0) {print $1"是管理员"} }' /etc/passwd
root是管理员# awk 'BEGIN{if($(id -u)==0) {print "admin"} }'
adminif...else语句:
if [ xxx ];thenxxxxx
elsexxx
fi格式:
{if(表达式){语句;语句;...}else{语句;语句;...}}awk -F: '{ if($3>=500 && $3 != 65534) {print $1"是普通用户"} else {print $1,"不是普通用户"}}' passwd awk 'BEGIN{if( $(id -u)>=500 && $(id -u) !=65534 ) {print "是普通用户"} else {print "不是普通用户"}}'if [xxxx];thenxxxx
elif [xxx];thenxxx
....
else
...
fiif...else if...else语句:格式:
{ if(表达式1){语句;语句;...}else if(表达式2){语句;语句;...}else if(表达式3){语句;语句;...}else{语句;语句;...}}awk -F: '{ if($3==0) {print $1,":是管理员"} else if($3>=1 && $3<=499 || $3==65534 ) {print $1,":是系统用户"} else {print $1,":是普通用户"}}'awk -F: '{ if($3==0) {i++} else if($3>=1 && $3<=499 || $3==65534 ) {j++} else {k++}};END{print "管理员个数为:"i "\n系统用户个数为:"j"\n普通用户的个数为:"k }'# awk -F: '{if($3==0) {print $1,"is admin"} else if($3>=1 && $3<=499 || $3==65534) {print $1,"is sys users"} else {print $1,"is general user"} }' a.txt 
root is admin
bin is sys users
daemon is sys users
adm is sys users
lp is sys users
redhat is general user
user01 is general user
named is sys users
u01 is general user
YUNWEI is general userawk -F: '{  if($3==0) {print $1":管理员"} else if($3>=1 && $3<500 || $3==65534 ) {print $1":是系统用户"} else {print $1":是普通用户"}}'   /etc/passwdawk -F: '{if($3==0) {i++} else if($3>=1 && $3<500 || $3==65534){j++} else {k++}};END{print "管理员个数为:" i RS "系统用户个数为:"j RS "普通用户的个数为:"k }' /etc/passwd
管理员个数为:1
系统用户个数为:28
普通用户的个数为:27# awk -F: '{ if($3==0) {print $1":是管理员"} else if($3>=500 && $3!=65534) {print $1":是普通用户"} else {print $1":是系统用户"}}' passwd awk -F: '{if($3==0){i++} else if($3>=500){k++} else{j++}} END{print i; print k; print j}' /etc/passwdawk -F: '{if($3==0){i++} else if($3>999){k++} else{j++}} END{print "管理员个数: "i; print "普通用个数: "k; print "系统用户: "j}' /etc/passwd 如果是普通用户打印默认shell,如果是系统用户打印用户名
# awk -F: '{if($3>=1 && $3<500 || $3 == 65534) {print $1} else if($3>=500 && $3<=60000 ) {print $NF} }' /etc/passwd

8.2 循环语句

while:
# awk 'BEGIN { i=1; while(i<=10) {print i;i++} }'文件里的每一行循环打印10次:
# awk -F: '{ i=1; while(i<=10) {print $0;i++} }' /etc/passwdfor:
# awk 'BEGIN { for(i=1;i<=5;i++) {print i} }'文件里的每一行循环打印10次:
# awk -F: '{ for(i=1;i<=10;i++) {print $0}}' /etc/passwd打印1~5
# awk 'BEGIN { for(i=1;i<=5;i++) {print i} }'# awk 'BEGIN { i=1;while(i<=5) {print i;i++} }'打印1~10中的奇数
# awk 'BEGIN{i=1;while(i<=10) {print i;i+=2} }'awk 选项 '{awk语句1 语句2 }'计算1-5的和:
# awk 'BEGIN { for(i=1;i<=5;i++) {(sum+=i)};{print sum} }'# awk 'BEGIN{for(i=1;i<=5;i++) (sum+=i);{print sum}}'
# awk 'BEGIN{for(i=1;i<=5;i++) (sum+=i);print sum}'
# awk 'BEGIN { i=1;while(i<=5) {(sum+=i) i++};print sum }'打印1-10的奇数和
for ((i=1;i<=10;i+=2));do echo $i;done|awk -v sum=0 '{sum+=$0};END{print sum}'嵌套循环:
#!/bin/bash
for ((y=1;y<=5;y++))
dofor ((x=1;x<=$y;x++))doecho -n $xdone
echo
done# awk 'BEGIN { for(y=1;y<=5;y++) { for(x=1;x<=y;x++) {printf x};print} }'
1
12
123
1234
12345# awk 'BEGIN{ y=1;while(y<=5) { for(x=1;x<=y;x++) {printf x};y++;print}}'
1
12
123
1234
1234599口诀表:
#awk 'BEGIN{for(y=1;y<=9;y++) { for(x=1;x<=y;x++) {printf x"*"y"="x*y"\t"};print} }'#awk 'BEGIN{for(y=1;y<=9;y++) { for(x=1;x<=y;x++) printf x"*"y"="x*y"\t";print} }'
#awk 'BEGIN{i=1;while(i<=9){for(j=1;j<=i;j++) {printf j"*"i"="j*i"\t"};print;i++ }}'#awk 'BEGIN{for(i=1;i<=9;i++){j=1;while(j<=i) {printf j"*"i"="i*j"\t";j++};print}}'循环控制:
break		条件满足的时候中断循环
continue	条件满足的时候跳过循环
# awk 'BEGIN{for(i=1;i<=5;i++) {if(i==3) break;print i} }'
1
2
# awk 'BEGIN{for(i=1;i<=5;i++){if(i==3) continue;print i}}'
1
2
4
5# awk 'BEGIN{i=1;while(i<=5){if(i==3) break;print i;i++}}'
1
2# awk 'BEGIN{i=0;while(i<5){i++;if(i==3) continue;print i}}'
1
2
4
5

8.3 算数运算

+ - * / %(模) ^(幂2^3)
可以在模式中执行计算,awk都将按浮点数方式执行算术运算
# awk 'BEGIN{print 1+1}'
# awk 'BEGIN{print 1**1}'
# awk 'BEGIN{print 2**3}'
# awk 'BEGIN{print 2/3}'
~~~二. awk统计~~~powershell
1. 统计/etc/passwd 中各种类型shell的数量
# awk -F: '{ shells[$NF]++ };END{for (i in shells) {print i,shells[i]} }' /etc/passwdbooks[linux]++
books[linux]=1
shells[/bin/bash]++
shells[/sbin/nologin]++/bin/bash 5
/sbin/nologin 6shells[/bin/bash]++			a
shells[/sbin/nologin]++		b
shells[/sbin/shutdown]++	cbooks[linux]++
books[php]++2. 网站访问状态统计 <当前时实状态 netstat>
# ss -antp|grep 80|awk '{states[$1]++};END{for(i in states){print i,states[i]}}'
TIME_WAIT 578
ESTABLISHED 1
LISTEN 1# ss -an |grep :80 |awk '{states[$2]++};END{for(i in states){print i,states[i]}}'
LISTEN 1
ESTAB 5
TIME-WAIT 25# ss -an |grep :80 |awk '{states[$2]++};END{for(i in states){print i,states[i]}}' |sort -k2 -rn
TIME-WAIT 18
ESTAB 8
LISTEN 13. 统计当前访问的每个IP的数量 <当前时实状态 netstat,ss>
# netstat -ant |grep :80 |awk -F: '{ip_count[$8]++};END{for(i in ip_count){print i,ip_count[i]} }' |sort# ss -an |grep :80 |awk -F":" '!/LISTEN/{ip_count[$(NF-1)]++} END{for(i in ip_count){print i,ip_count[i]}}' |sort -k2 -rn |head4. 统计Apache/Nginx日志中某一天的PV量  <统计日志>
# grep '27/Jul/2017' mysqladmin.cc-access_log |wc -l
145195. 统计Apache/Nginx日志中某一天不同IP的访问量 <统计日志>
# grep '27/Jul/2017' mysqladmin.cc-access_log |awk '{ips[$1]++};END{for(i in ips){print i,ips[i]} }' |sort -k2 -rn |head# grep '07/Aug/2017' access.log |awk '{ips[$1]++} END{for(i in ips){print i,ips[i]} }' |awk '$2>100' |sort -k2 -rn

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...