25. 文本处理工具之awk
- Date:
2018-09-02
25.1. awk简介
awk是linux文本处理工具的三件套之一。
awk擅长文本处理中取列操作。
25.2. awk详解
25.2.1. 命令格式
- 命令格式:
awk [POSIX 或 GNU 风格选项] -f 脚本文件 [–] 文件 …
awk [POSIX 或 GNU 风格选项] [–] ‘程序’ 文件 …
awk默认是通过空格分割的多列。第一列是 $1 第二列是 $2``其中 ``NF 是分割的列数,所以 $NF 是最后一列。
如果倒数第二列就是 $(NF-1)。
awk处理的结果输出可以用print然后加对应的列数。如果全部输出就可以用 $0
注意
awk也是一门脚本语言。所以可以编写专门的awk脚本。但是此处省略。
25.2.2. 命令参数
-F |
指定字段分隔符 |
–field-separator |
指定字段分隔符,同-F |
-f |
指定源awk脚本文件 |
–file |
指定源awk脚本文件,同-f |
-v |
设定变量,使用-v var1-“test” |
–debug |
调试awk |
-l |
加载扩展 |
–load |
加载扩展,同-l |
备注
我这里使用的环境是centos7,机器上带的是gawk。默认的AWKPATH在/usr/share/awk,我们需要修改AWKPATH为`/usr/share/awk`即可
[root@centos74 test]$ vim ~/.bash_profile
[root@centos74 test]$ cat ~/.bash_profile |grep AWK
export AWKPATH="/usr/share/awk"
25.2.3. awk内置函数及内置常量
以下是参数详解:
小技巧
下面参数最重要的是 -F 指定分隔符。
-f 脚本文件 |
–file=脚本文件 |
|
-F fs |
–field-separator-fs |
指定输入文本分隔符,fs是一个字符串或者是一个正则表达式 |
-v var-val |
–assign-var-val |
将外部变量值付给var |
-m[fr] val |
||
-O |
–optimize |
启用一些优化程序的内部表示。 |
-W compat |
–compat |
在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。 |
-W copyleft |
–copyleft |
打印简短的版权信息 |
-W copyright |
–copyright |
打印短版的通用公共许可证,然后退出 |
-W dump-variables[-file] |
–dump-variables[-file] |
打印全局变量,其类型,提交的最终值的排序列表。 |
-W exec-file |
–exec-file |
与-f类似,但与他有两点不同,(我回头把相关文档上传,太长) |
-W gen-po |
–gen-po |
此时不执行脚本文件。 |
-W help |
–help |
打印帮助 |
-W lint[-fatal] |
–lint[-fatal] |
警告可疑或不移植到其他的awk实现的结构 |
-W lint-old |
–lint-old |
打印关于不能向传统unix平台移植的结构的警告 |
-W non-decimal-data |
–non-decimal-data |
启用自动输入数据的解释,八进制和十六进制值 |
-W profile[-file] |
–profile[-file] |
启用awk程序剖析 |
-W posix |
–posix |
在严格意义上的POSIX模式运作。 |
-W re-interval |
–re-interval |
允许间隔表达式在正则表达式上 |
-W source-program-text |
–source-program-text |
|
-W traditional |
–traditional |
传统的Unix awk的正则表达式匹配 |
-W usage |
–usage |
|
-W use-lc-numeric |
–use-lc-numeric |
解析数字输入时,强制使用的语言环境中的小数点字符数据 |
-W version |
–version |
提交错误报告请参考 “gawk.info” 中的 “Bugs” 页,它位于打印版本中的 “Reporting Problems and Bugs” 一节 |
下面是内置的常量及常量含义说明
变量 |
说明 |
$n |
当前记录的第n个字段,字段间由FS分隔。 |
$0 |
完整的输入记录。 |
ARGC |
命令行参数的数目。 |
ARGIND |
命令行中当前文件的位置(从0开始算)。 |
ARGV |
包含命令行参数的数组。 |
BINMODE |
在非POSIX系统上,这个变量指定的所有I / O使用二进制模式 |
CONVFMT |
数字转换格式(默认值为%.6g) |
ENVIRON |
环境变量关联数组。 |
ERRNO |
最后一个系统错误的描述。 |
FIELDWIDTHS |
字段宽度列表(用空格键分隔)。 |
FILENAME |
当前文件名。 |
FNR |
同NR,但相对于当前文件 |
FPAT |
这是一个正则表达式(字符串),告诉gawk基于匹配正则表达式的文本来创建字段 |
FS |
字段分隔符(默认是任何空格)。 |
IGNORECASE |
如果为真,则进行忽略大小写的匹配。 |
LINT |
当这个变量为真(非零或非空),gawk的行为犹如”–lint”命令行选项 |
NF |
当前记录中的字段数。 |
NR |
当前记录数。 |
OFMT |
数字的输出格式(默认值是%.6g)。 |
OFS |
输出字段分隔符(默认值是一个空格)。 |
ORS |
输出记录分隔符(默认值是一个换行符)。 |
PROCINFO |
这个数组的元素提供访问运行awk程序的信息 |
RLENGTH |
由match函数所匹配的字符串的长度。 |
RS |
记录分隔符(默认是一个换行符)。 |
RT |
每次一条记录被读取的设置 |
RSTART |
由match函数所匹配的字符串的第一个位置。 |
SUBSEP |
数组下标分隔符(默认值是034)。 |
TEXTDOMAIN |
此变量用于程序的国际化 |
常用内置函数
length(string) |
返回字符串的长度 |
index(string,serch_string) |
返回search_string在字符串中出现的位置 |
split(string,array,delimiter) |
用定界符生成一个字符串列表,并将该列表存入数组 |
substr(string,array,delimiter) |
在字符串中用字符起止便宜量生成子串,并返回该子串 |
sub(regex,replacement_str,string) |
将正则表达式匹配到的第一处内容替换成replacement_str |
gsub(regex,replacement_str,string) |
和sub()类似。不过该函数会替换正则表达式匹配到的所有内容 |
match(regex,string) |
检查正则表达式是否能够匹配字符串。如果能够匹配,返回非0值; 否则,返回0.match()有两个相关的特殊变量,分别是RSTART和RLENGTH。 变量RSTART包含正则表达式所匹配内容的其实位置,而变量RLENGTH包含正则表达式所匹配内容的长度。 |
函数名 |
功能作用 |
atan2(y,x) |
返回y/x弧的反正切 |
cos(x) |
返回x的余弦 |
exp(x) |
返回x的指数 |
int(x) |
返回最靠近的整数,风向标指向0 |
log(x) |
返回x的自然对数 |
rand() |
返回随机数 |
sin(x) |
返回x的正弦 |
sqrt(x) |
返回x的正平方根 |
srand([x]) |
生成随机数,可以设置起点 |
函数名 |
功能作用 |
asort(source [, dest [, how ] ]) |
返回数组元素数(内容较多),gawk特有,awk没有此函数功能。 |
asorti(source [, dest [, how ] ]) |
同asort,(有细微差别),gawk特有,awk没有此函数功能。 |
gensub(regexp, replacement, how [, target]) |
搜索正则表达式RegExp匹配的regexp,gawk特有,awk没有此函数功能。 |
gsub(regexp, replacement [, target]) |
将正则表达式匹配的第一处内容替换成replacement_str |
index(in, find) |
返回find在字符串in中出现的位置 |
length([string]) |
string 中的字符数 |
match(string, regexp [, array]) |
检查正则表达式能否匹配字符串 |
patsplit(string, array [, fieldpat [, seps ] ]) |
划分件到由fieldpat定义的字符串,并存储在array里, 分隔字符串存在在seps数组,gawk特有,awk没有此函数功能。 |
split(string, array [, fieldsep [, seps ] ]) |
用定界符生成一个字符串列表,并将该列表存入数组 |
sprintf(format, expression1, …) |
打印 |
strtonum(str) |
字符转转换成数字 |
sub(regexp, replacement [, target]) |
将正则表达式匹配到的第一处内容替换成replacement |
substr(string, start [, length]) |
分割字符串,根据其实位置和长度 |
tolower(string) |
转换成小写 |
toupper(string) |
转换成大写 |
close(filename [, how]) |
关闭文件输入输出流 |
fflush([filename]) |
刷新与文件名相关的任何缓冲输出 |
system(command) |
执行操作系统命令,返回值给awk程序时间函数(Time Functions) |
mktime(datespec) |
datespec为时间戳格式,与systime()格式一样 |
strftime([format [, timestamp [, utc-flag]]]) |
格式化timestamp的内容,返回日期格式 |
systime() |
返回系统时间,精确到秒 |
and(v1, v2) |
v1,v2的与操作结果 |
compl(val) |
val的反码 |
lshift(val, count) |
返回val左移count位的值 |
or(v1, v2) |
v1,v2的或操作 |
rshift(val, count) |
返回val右移count位的值 |
xor(v1, v2) |
返回v1,v2的异或的值 |
isarray(x) |
如果x是数组,返回true.否则false |
bindtextdomain(directory [, domain]) |
设置awk要搜寻信息的目录和域 |
dcgettext(string [, domain [, category]]) |
返回的字符串string 翻译文本域domain 的语言环境类别category |
dcngettext(string1, string2, number [, domain [, category]]) |
返回string1和string2的翻译数量的复数形式,string1,string2在语言环境类别的文本域里 |
25.3. awk实例
把用户文件
/et/passwd的最后的10个用户的用户名和对应的shell取出来取出来以后中间用四个空格分割:
1[root@zzjlogin ~]# tail /etc/passwd
2saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
3postfix:x:89:89::/var/spool/postfix:/sbin/nologin
4sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
5tcpdump:x:72:72::/:/sbin/nologin
6named:x:25:25:Named:/var/named:/sbin/nologin
7apache:x:48:48:Apache:/var/www:/sbin/nologin
8mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
9zabbix:x:500:500::/home/zabbix:/sbin/nologin
10nginx:x:498:499:nginx user:/var/cache/nginx:/sbin/nologin
11test:x:501:501::/home/test:/bin/bash
12
13[root@zzjlogin ~]# tail /etc/passwd | awk -F ":" '{print $1 " " $NF}'
14saslauth /sbin/nologin
15postfix /sbin/nologin
16sshd /sbin/nologin
17tcpdump /sbin/nologin
18named /sbin/nologin
19apache /sbin/nologin
20mysql /bin/bash
21zabbix /sbin/nologin
22nginx /sbin/nologin
23test /bin/bash
24
25- 取出来以后第一列用20个字符宽度左对齐,第二列30个字符宽度左对齐:
1[root@zzjlogin ~]# tail /etc/passwd
2saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
3postfix:x:89:89::/var/spool/postfix:/sbin/nologin
4sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
5tcpdump:x:72:72::/:/sbin/nologin
6named:x:25:25:Named:/var/named:/sbin/nologin
7apache:x:48:48:Apache:/var/www:/sbin/nologin
8mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
9zabbix:x:500:500::/home/zabbix:/sbin/nologin
10nginx:x:498:499:nginx user:/var/cache/nginx:/sbin/nologin
11test:x:501:501::/home/test:/bin/bash
12[root@zzjlogin ~]# tail /etc/passwd | awk -F ":" '{printf "%-20s%-30s\n", $1,$NF}'
13saslauth /sbin/nologin
14postfix /sbin/nologin
15sshd /sbin/nologin
16tcpdump /sbin/nologin
17named /sbin/nologin
18apache /sbin/nologin
19mysql /bin/bash
20zabbix /sbin/nologin
21nginx /sbin/nologin
22test /bin/bash
把用户文件
/et/passwd用户名长度大于5的用户名取出来并且打印是否配置了密码。
小技巧
/et/passwd 文件用 : 分割,第一列是用户名第二列如果有 x 则表示此用户配置了密码,如果没有 x 则表示没有密码。
1[root@zzjlogin ~]# cat /etc/passwd | awk -F ':' '{if(length($1)>5) print $0}'|awk -F ':' '{if($2=="x") print $1 "\t have password"; else print $1 "\t no password" fi}'
2daemon have password
3shutdown have password
4operator have password
5gopher have password
6nobody have password
7haldaemon have password
8saslauth have password
9postfix have password
10tcpdump have password
11apache have password
12zabbix have password
nginx日志分析
配置文件中的日志格式:
1log_format main '$remote_addr - $remote_user [$time_local] "$request" '
2 '$status $body_bytes_sent "$http_referer" '
3 '"$http_user_agent" "$http_x_forwarded_for" "$time_local" "$request_time" ';
4
5
6- 根据响应时间来筛选:
- 需求1:
响应时间在0.300秒以内的日志过滤出来:
1[root@zzjlogin ~]# cat /var/log/nginx/access.log
2192.168.161.2 - - [25/Sep/2018:17:24:00 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "25/Sep/2018:17:24:00 +0800" "0.900"
3192.168.161.10 - - [24/Sep/2018:22:26:53 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:26:53 +0800" "0.040"
4192.168.161.100 - - [24/Sep/2018:22:28:59 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:28:59 +0800" "0.120"
5192.168.161.1 - - [24/Sep/2018:22:26:53 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:26:53 +0800" "0.001"
6192.168.161.1 - - [24/Sep/2018:22:28:59 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:28:59 +0800" "0.020"
7192.168.161.50 - - [24/Sep/2018:22:26:53 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:26:53 +0800" "0.400"
8192.168.161.1 - - [24/Sep/2018:22:28:59 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:28:59 +0800" "0.100"
9192.168.161.1 - - [24/Sep/2018:22:26:53 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:26:53 +0800" "0.400"
10192.168.161.1 - - [24/Sep/2018:22:28:59 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:28:59 +0800" "0.300"
11
12[root@zzjlogin ~]# cat /var/log/nginx/access.log | awk -F '"' '{if($(NF-1)<0.3) print $0 }'
13192.168.161.10 - - [24/Sep/2018:22:26:53 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:26:53 +0800" "0.040"
14192.168.161.100 - - [24/Sep/2018:22:28:59 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:28:59 +0800" "0.120"
15192.168.161.1 - - [24/Sep/2018:22:26:53 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:26:53 +0800" "0.001"
16192.168.161.1 - - [24/Sep/2018:22:28:59 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:28:59 +0800" "0.020"
17192.168.161.1 - - [24/Sep/2018:22:28:59 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:28:59 +0800" "0.100"
18[root@zzjlogin ~]#
- 需求2:
相应时间在0.3秒以内的日志的IP地址,过滤重复IP地址:
1[root@zzjlogin ~]# cat /var/log/nginx/access.log
2192.168.161.2 - - [25/Sep/2018:17:24:00 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "25/Sep/2018:17:24:00 +0800" "0.900"
3192.168.161.10 - - [24/Sep/2018:22:26:53 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:26:53 +0800" "0.040"
4192.168.161.100 - - [24/Sep/2018:22:28:59 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:28:59 +0800" "0.120"
5192.168.161.1 - - [24/Sep/2018:22:26:53 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:26:53 +0800" "0.001"
6192.168.161.1 - - [24/Sep/2018:22:28:59 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:28:59 +0800" "0.020"
7192.168.161.50 - - [24/Sep/2018:22:26:53 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:26:53 +0800" "0.400"
8192.168.161.1 - - [24/Sep/2018:22:28:59 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:28:59 +0800" "0.100"
9192.168.161.1 - - [24/Sep/2018:22:26:53 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:26:53 +0800" "0.400"
10192.168.161.1 - - [24/Sep/2018:22:28:59 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:28:59 +0800" "0.300"
11
12[root@zzjlogin ~]# cat /var/log/nginx/access.log | awk -F '"' '{if($(NF-1)<0.3) print $0 }'|awk '{print $1}'
13192.168.161.10
14192.168.161.100
15192.168.161.1
16192.168.161.1
17192.168.161.1
18
19[root@zzjlogin ~]# cat /var/log/nginx/access.log | awk -F '"' '{if($(NF-1)<0.3) print $0 }'|awk '{print $1}'|sort
20192.168.161.1
21192.168.161.1
22192.168.161.1
23192.168.161.10
24192.168.161.100
25
26[root@zzjlogin ~]# cat /var/log/nginx/access.log | awk -F '"' '{if($(NF-1)<0.3) print $0 }'|awk '{print $1}'|sort|uniq
27192.168.161.1
28192.168.161.10
29192.168.161.100
- 需求3:
根据状态码,过滤访问正常的访问日志(状态码200和304)。
1[root@zzjlogin ~]# cat /var/log/nginx/access.log
2192.168.161.2 - - [25/Sep/2018:17:24:00 +0800] "GET / HTTP/1.1" 500 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "25/Sep/2018:17:24:00 +0800" "0.900"
3192.168.161.10 - - [24/Sep/2018:22:26:53 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:26:53 +0800" "0.040"
4192.168.161.100 - - [24/Sep/2018:22:28:59 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:28:59 +0800" "0.120"
5192.168.161.1 - - [24/Sep/2018:22:26:53 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:26:53 +0800" "0.001"
6192.168.161.1 - - [24/Sep/2018:22:28:59 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:28:59 +0800" "0.020"
7192.168.161.50 - - [24/Sep/2018:22:26:53 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:26:53 +0800" "0.400"
8192.168.161.1 - - [24/Sep/2018:22:28:59 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:28:59 +0800" "0.100"
9192.168.161.1 - - [24/Sep/2018:22:26:53 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:26:53 +0800" "0.400"
10192.168.161.1 - - [24/Sep/2018:22:28:59 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:28:59 +0800" "0.300"
11[root@zzjlogin ~]#
12[root@zzjlogin ~]# cat /var/log/nginx/access.log | awk '{if($9==200 || $9 == 304) print $0}'
13192.168.161.10 - - [24/Sep/2018:22:26:53 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:26:53 +0800" "0.040"
14192.168.161.100 - - [24/Sep/2018:22:28:59 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:28:59 +0800" "0.120"
15192.168.161.1 - - [24/Sep/2018:22:26:53 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:26:53 +0800" "0.001"
16192.168.161.1 - - [24/Sep/2018:22:28:59 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:28:59 +0800" "0.020"
17192.168.161.50 - - [24/Sep/2018:22:26:53 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:26:53 +0800" "0.400"
18192.168.161.1 - - [24/Sep/2018:22:28:59 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:28:59 +0800" "0.100"
19192.168.161.1 - - [24/Sep/2018:22:26:53 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:26:53 +0800" "0.400"
20192.168.161.1 - - [24/Sep/2018:22:28:59 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-" "24/Sep/2018:22:28:59 +0800" "0.300"
21[root@zzjlogin ~]#
注意
状态码含义参考: http状态码详解
- 需求4:
根据状态码,过滤访问正常的访问日志(状态码200和304)条数,访问异常的数量:
1[root@zzjlogin ~]# cat /var/log/nginx/access.log | awk '{if($9==200 || $9 == 304) print $0}'|wc -l
28
3[root@zzjlogin ~]# cat /var/log/nginx/access.log | awk '{if($9!=200 && $9 != 304) print $0}'|wc -l
41
输出所有偶数行的内容/输出制定行的内容
1[root@zzjlogin ~]# cat /etc/passwd | awk '{if(NR%2 == 0) print NR "\t" $0 }'
22 bin:x:1:1:bin:/bin:/sbin/nologin
34 adm:x:3:4:adm:/var/adm:/sbin/nologin
46 sync:x:5:0:sync:/sbin:/bin/sync
58 halt:x:7:0:halt:/sbin:/sbin/halt
610 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
712 games:x:12:100:games:/usr/games:/sbin/nologin
814 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
916 dbus:x:81:81:System message bus:/:/sbin/nologin
1018 abrt:x:173:173::/etc/abrt:/sbin/nologin
1120 ntp:x:38:38::/etc/ntp:/sbin/nologin
1222 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
1324 tcpdump:x:72:72::/:/sbin/nologin
1426 apache:x:48:48:Apache:/var/www:/sbin/nologin
1528 zabbix:x:500:500::/home/zabbix:/sbin/nologin
1630 test:x:501:501::/home/test:/bin/bash
17
18[root@zzjlogin ~]# cat /etc/passwd | awk '{if(NR == 10) print NR "\t" $0 }'
1910 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin