做网站的公司应该税率多少,优秀的手机网站案例分析,我的网站百度搜不到,wordpress文字修改目录
一、插入几个新字段
二、格式化个空白
三、筛选IPV4地址
命令及结果
第一种查询方式
第二种查询方式
第三种查询方式
四、读取.ini配置文件中的某段
命令及结果
第一种查询方式
第二种查询方式
五、根据某字段去重
命令及结果
第一种方式
第二种方式
六、…目录
一、插入几个新字段
二、格式化个空白
三、筛选IPV4地址
命令及结果
第一种查询方式
第二种查询方式
第三种查询方式
四、读取.ini配置文件中的某段
命令及结果
第一种查询方式
第二种查询方式
五、根据某字段去重
命令及结果
第一种方式
第二种方式
六、系数统计
命令及结果
七、统计TCP连接状态数量
命令及结果
第一种查询方式
第二种查询方式
八、统计日志中各IP访问非200状态码的次数
命令及结果
第一种查询方式
第二种查询方式
九、统计独立IP
命令及结果
十、处理字段缺失的数据
命令及结果
十一、处理字段中包含了字段分隔符的数据
命令及结果
十二、取字段中指定字符数量
命令及结果
第一种查询方式
第二种查询方式
十三、行列转换
命令及结果
十四、行列转换2
命令及结果
十五、筛选给定时间范围内的日志 一、插入几个新字段
在a b c d的b后面插入3个e f g
[rootwww test]# echo a b c d | awk {$2$2 e f g ;print}
a b e f g c d[rootwww test]# echo a b c d | awk {$2$2 e f g;print} #在awk中重新赋值后awk会重新构建$0也就是重构后的一行的数据
a b e f g c d 二、格式化个空白
移除每行的前缀、后缀空白并将各部分左对齐
[rootwww test]# cat 2.txt #查看2.txt文件中的内容aaaa bbbb ccccbbb aaa ccc
ddd fff eee ggg hhhh iii jjj [rootwww test]# awk {$1$1;print} 2.txt #通过$1$1的方式来进行格式化空白默认输出的格式为一个空格因此看到的是每个字段之间都是通过一个空格来进行分隔
aaaa bbbb cccc
bbb aaa ccc
ddd fff eee ggg hhhh iii jjj[rootwww test]# awk BEGIN{OFS\t}{$1$1;print} 2.txt #通过将输出字段分隔符修改为制表符\t来进行格式化因此看到的是每个字段之间都是通过一个制表符来进行分隔
aaaa bbbb cccc
bbb aaa ccc
ddd fff eee ggg hhhh iii jjj
[rootwww test]# 三、筛选IPV4地址
从ifcofig命令的结果中筛选出除了lo网卡外的所有IPV4地址
本机的所有网卡的IP地址
[rootwww test]# ifconfig
br-4d64a44d0b5a: flags4099UP,BROADCAST,MULTICAST mtu 1500inet 172.18.0.1 netmask 255.255.0.0 broadcast 172.18.255.255ether 02:42:05:3f:6a:7f txqueuelen 0 (Ethernet)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0docker0: flags4099UP,BROADCAST,MULTICAST mtu 1500inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255ether 02:42:64:72:b8:e9 txqueuelen 0 (Ethernet)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0ens33: flags4163UP,BROADCAST,RUNNING,MULTICAST mtu 1500inet 192.168.75.142 netmask 255.255.255.0 broadcast 192.168.75.255inet6 fe80::e78c:a86e:3457:f77b prefixlen 64 scopeid 0x20linkether 00:0c:29:b5:49:c8 txqueuelen 1000 (Ethernet)RX packets 37520 bytes 3100182 (2.9 MiB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 99410 bytes 7526954 (7.1 MiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0lo: flags73UP,LOOPBACK,RUNNING mtu 65536inet 127.0.0.1 netmask 255.0.0.0inet6 ::1 prefixlen 128 scopeid 0x10hostloop txqueuelen 1000 (Local Loopback)RX packets 2448 bytes 274656 (268.2 KiB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 2448 bytes 274656 (268.2 KiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0virbr0: flags4099UP,BROADCAST,MULTICAST mtu 1500inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255ether 52:54:00:f7:4f:47 txqueuelen 1000 (Ethernet)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0命令及结果
第一种查询方式
[rootwww test]# ifconfig | awk /inet / !($2 ~ /^127/){print $2} #通过判断是否有/inet /关键字和匹配第二列不包含127开头的数字来进行匹配满足前面的两个条件则打印第二列
172.18.0.1
172.17.0.1
192.168.75.142
192.168.122.1
第二种查询方式
[rootwww test]# ifconfig | awk BEGIN{RS}!/lo/{print $6} #RS代表是以段落划分此时每个网卡算是一个整体也就是以每个段落之间的空行来作为分隔符因此第6列就是我们需要找的IPV4地址。
172.18.0.1
172.17.0.1
192.168.75.142
192.168.122.1
第三种查询方式
[rootwww test]# ifconfig | awk BEGIN{RS;FS\n}/ens33/{$0$2;FS ;$0$0;print $2} #首先使用RS进行段分隔然后使用FS对段进行换行分隔。对ens33的第二列赋值给第一列(第二列将整个段落进行替换现在只剩下第二列)再次对赋值后的第二列进行分割通过FS为一个空格进行分隔此时这里出现$0$0的原因是awk的机制问题在awk中如果使用赋值重构就必须通过重新赋值就是通过$0$0这种方式进行重新渲染。此时在打印第二列就是我们所想查到的值
192.168.75.142 四、读取.ini配置文件中的某段
[base]
nameos_repo
baseurlhttps://xxx/centos/$releasever/os/$basearch
gpgcheck0enable1[mysql]
namemysql_repo
baseurlhttps://xxx/mysql-repo/yum/mysql-5.7-community/el/$releasever/$basearchgpgcheck0
enable1[epel]
nameepel_repo
baseurlhttps://xxx/epel/$releasever/$basearch
gpgcheck0
enable1
[percona]
namepercona_repo
baseurl https://xxx/percona/release/$releasever/RPMS/$basearch
enabled 1
gpgcheck 0
查询配置文件中mysql字段的内容
命令及结果
第一种查询方式
[rootwww test]# cat mysql.awk
index($0, [mysql]){ #$0是整个文本找到mysql字段且打印出来。下面是一个判断语句getline代表的是只要0就一直往下读这里是定义了一个变量var只要var0就一直往下读读到出现[.*]的时候就退出并且打印出var也就是一直读到的内容printwhile((getline var)0){if(var ~/\[.*\]/){exit}print var
}
}
# getline返回值0表示已经读取到数据0表示遇到结尾EOF没有读到的东西0读取错误[rootwww test]# awk -f mysql.awk a.txt
[mysql]
namemysql_repo
baseurlhttps://xxx/mysql-repo/yum/mysql-5.7-community/el/$releasever/$basearchgpgcheck0
enable1第二种查询方式
[rootwww test]# awk BEGIN{RS}/\[mysql\]/{print;while((getline)0){if(/\[.*\]/){exit}print}} a.txt
[mysql]
namemysql_repo
baseurlhttps://xxx/mysql-repo/yum/mysql-5.7-community/el/$releasever/$basearch
gpgcheck0
enable1 五、根据某字段去重
去掉uidxxx重复的行
2019-01-13_12:00_index?uid123
2019-01-13_13:00_index?uid123
2019-01-13_14:00_index?uid333
2019-01-13_15:00_index?uid9710
2019-01-14_12:00_index?uid123
2019-01-14_13:00_index?uid123
2019-01-15_14:00_index?uid333
2019-01-16_15:00_index?uid9710
首先利用uid去重我们需要利用?进行划分然后将uidxxx保存再数组当中这是判断重复的依据然后统计uid出现次数第一次出现统计第二次不统计
命令及结果
第一种方式
[rootwww test]# awk -F? !arr[$2]{print} b.txt
2019-01-13_12:00_index?uid123
2019-01-13_14:00_index?uid333
2019-01-13_15:00_index?uid9710 第二种方式
[rootwww test]# awk -F? {arr[$2]arr[$2]1;if(arr[$2]1){print}} b.txt
2019-01-13_12:00_index?uid123
2019-01-13_14:00_index?uid333
2019-01-13_15:00_index?uid9710 六、系数统计
portmapper
portmapper
portmapper
portmapper
portmapper
portmapper
status
status
mountd
mountd
mountd
mountd
mountd
mountd
nfs
nfs
nfs_acl
nfs
nfs
nfs_acl
nlockmgr
nlockmgr
nlockmgr
nlockmgr
nlockmgr
命令及结果
[rootwww test]# awk {arr[$0]}END{OFS\t;for(i in arr){print arr[i], i}} d.txt
4 nfs
2 status
5 nlockmgr
6 portmapper
2 nfs_acl
6 mountd 七、统计TCP连接状态数量 命令及结果
第一种查询方式
[rootwww test]# netstat -antp | awk /^tcp/{arr[$6]}END{for(i in arr){print arr[i], i}}
8 LISTEN
2 ESTABLISHED
第二种查询方式
[rootwww test]# netstat -antp | grep tcp | awk {print $6} | sort | uniq -c2 ESTABLISHED8 LISTEN 八、统计日志中各IP访问非200状态码的次数
日志示例数据
[rootwww logs]# cat access.log
192.168.75.1 - - [22/Mar/2023:17:05:21 0800] GET / HTTP/1.1 200 645 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 -
192.168.75.1 - - [22/Mar/2023:17:05:21 0800] GET /favicon.ico HTTP/1.1 404 555 http://192.168.75.142/ Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 -
192.168.75.148 - - [22/Mar/2023:17:09:52 0800] GET / HTTP/1.1 200 645 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.76 -
192.168.75.148 - - [22/Mar/2023:17:09:52 0800] GET /favicon.ico HTTP/1.1 404 555 http://192.168.75.142/ Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.76 - 统计非200状态码的IP并且取次数最多的前10个IP
命令及结果
第一种查询方式
[rootwww logs]# awk $8!200{arr[$1]}END{for (i in arr){print arr[i],i}} access.log | sort -k1nr | head -n 10
176 192.168.75.1
2 192.168.75.148
第二种查询方式
[rootwww logs]# awk $8!200{arr[$1]}END{PROCINFO[sorted_in]val_num_desc;for(i in arr){if(cnt10){exit}print arr[i],i}} access.log
176 192.168.75.1
2 192.168.75.148 九、统计独立IP
url 访问IP 访问时间 访问人
a.com.cn|202.109.134.23|2015-11-20 20:34:43|guest
b.com.cn|202.109.134.23|2015-11-20 20:34:48|guest
c.com.cn|202.109.134.24|2015-11-20 20:34:48|guest
a.com.cn|202.109.134.23|2015-11-20 20:34:43|guest
a.com.cn|202.109.134.24|2015-11-20 20:34:43|guest
b.com.cn|202.109.134.25|2015-11-20 20:34:48|guest
需求统计每个URL的独立访问IP有多少个(去重)并且要为每个URL保存一个对应的文件得到的结果类似
a.com.cn 2
b.com.cn 2
c.com.cn 1
并且有三个对应的文件
a.com.cn.txt
b.com.cn.txt
c.com.cn.txt 命令及结果
BEGIN{ #命令FS|
}!arr[$1,$2]{arr1[$1]
}END{for(i in arr1){print i,arr1[i] (i.txt)}
}[rootwww test]# cat a.com.cn.txt #查看结果
a.com.cn 2
[rootwww test]# cat b.com.cn.txt
b.com.cn 2
[rootwww test]# cat c.com.cn.txt
c.com.cn 1 十、处理字段缺失的数据
ID name gender age email phone
1 Bob male 28 abcqq.com 18023394012
2 Alice female 24 defgmail.com 18084925203
3 Tony male 21 17048792503
4 Kevin male 21 bbb189.com 17023929033
5 Alex male 18 cccxyz.com 18185904230
6 Andy female ddd139.com 18923902352
7 Jerry female 25 exdsa189.com 18785234906
8 Peter male 20 baxqq.com 17729348758
9 Steven 23 bcsohu.com 15947893212
10 Bruce female 27 bcbd139.com 13942943905
当字段缺失时直接使用FS划分字段来处理会非常棘手。gawk为了解决这种特殊需求提供了FIELDWIDTHS变量
FIELDWIDTH可以按照字符数量划分字段 命令及结果
awk {print $0} FIELDWIDTHS2 2:6 2:6 2:3 2:13 2:11 a.txt
1 Bob male 28 abcqq.com 18023394012
2 Alice female 24 defgmail.com 18084925203
3 Tony male 21 17048792503
4 Kevin male 21 bbb189.com 17023929033
5 Alex male 18 cccxyz.com 18185904230
6 Andy female ddd139.com 18923902352
7 Jerry female 25 exdsa189.com 18785234906
8 Peter male 20 baxqq.com 17729348758
9 Steven 23 bcsohu.com 15947893212
10 Bruce female 27 bcbd139.com 13942943905 十一、处理字段中包含了字段分隔符的数据
下面是CSV文件中的一行该CSV文件以逗号分隔各个字段
Robbins,Arnold,1234 A Pretty Street, NE,MyTown,MyState,12345-6789,USA
需求取得第三个字段1234 A Pretty Street,NE
当字段中包含了字段分隔符时直接使用FS划分字段来处理会非常棘手。gawk为了解决这种特殊需求提供了FPAT变量。
FPAT可以收集正则匹配的结果并将它们保存在各个字段中。(就像grep匹配成功的部分会加颜色显示而使用FPAT划分字段则是将匹配成功的部分保存在字段$1 $2 $3...中) 命令及结果
[rootwww test]# awk BEGIN{FPAT[^,]|\.*\}{print $3} 6.txt
1234 A Pretty Street, NE 十二、取字段中指定字符数量
16 001agdcdafasd
16 002agdcxxxxxx
23 001adfadfahoh
23 001fsdadggggg
awk字符索引从1开始 命令及结果
第一种查询方式
[rootwww test]# awk {print $1,substr($2,1,3)} 7.txt
16 001
16 002
23 001
23 001
第二种查询方式
awk BEGIN{FIELDWIDTHS2 2:3}{print $1,$2} 7.txt
16 001
16 002
23 001
23 001 十三、行列转换
文件内容
name age
alice 21
ryan 30 命令及结果
[rootwww test]# awk {for(i1;iNF;i){if(!(i in arr)){arr[i]$i}else{arr[i]arr[i] $i}}}END{for(i1;iNF;i){print arr[i]}} 8.txt
name alice ryan
age 21 30分析
awk {for(i1;iNF;i){ #NF代表这字段数量所以此时的NF为2因为只有两列if(!(i in arr)){arr[i]$i}else{arr[i]arr[i] $i} }}END{for(i1;iNF;i){print arr[i]}}8.txt 十四、行列转换2
文件内容
74683 1001
74683 1002
74683 1011
74684 1000
74684 1001
74684 1002
74685 1001
74685 1011
74686 1000
将文件实现成如下格式
74683 1001 1002 1011
74684 1000 1001 1002 命令及结果
[rootwww test]# cat 9.awk
{if($1 in arr){arr[$1] arr[$1] $2}else{arr[$1] $2}
}END{for(i in arr){printf %s %s\n,i,arr[i]}
}[rootwww test]# awk -f 9.awk 9.txt #查看结果
74686 1000
74683 1001 1002 1011
74684 1000 1001 1002
74685 1001 1011 十五、筛选给定时间范围内的日志
grep/sed/awk用正则去筛选日志时如果要精确到小时、分钟、秒则非常难以实现。
但是awk提供了mktime()函数它可以将时间转为epoch(1970年到现在)时间值
# 2019-11-10 03:42:40转换成epoch
$ awk BEGIN{print mktime(2019 11 10 03 42 40)}
1573328560
借此。可以取得日志中的时间字符串部分再将它们的年、月、日、时、分、秒都读取出来然后放入nktim()构建对应的epoch值。因为epoch值是数值所以可以比较发小、从而决定时间的大小。
下面strptime1()实现的是将10/Nov/2019:23:53:4408:00格式的字符串转换为epoch值然后和which_tinme比较大小即可筛选出精确到秒的日志。
BEGIN{#要筛选什么时间的日志将其时间构造成epoch值which_time mktime(2023 01 30 17 20 40)
}{#取出日志中的日期哦时间字符串部分match($0,^.*\\[(.*)\\].*,arr)#将日期时间字符串转换为epoch值tmp_time strptime2(arr[1])#通过比较epoch值来比较时间大小if(tmp_time whixh_time){arr1[$1]
}
}END{PROCINFO[sorted_in]val_num_dexc;for(i in arr1){#设置计数器if(cnt10){exit}print arr1[i],i}
}#构建的时间字符串格式为:10/Nov/2019:23:53:4408:00
function strptime2(str,dt_str,arr,Y,M,D,H,m,S){dt_str gensub([/:], ,g,str)#gt_str 10 Nov 2019 23 53 44 08 00split(dt_str,arr, )Yarr[3]Mmon_map(arr[2])Darr[1]Harr[4]marr[5]Sarr[6]return mktime(sprintf(%s %s %s %s %s %s,Y,M,D,H,m,S))
}function mon_map(str,mons){mons[Jan]1mons[Feb]2mons[Mar]3mons[Apr]4mons[May]5mons[Jun]6mons[Jul]7mons[Aug]8mons[Sep]9mons[Oct]10mons[Nov]11mons[Dec]12return mons[str]
}