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

此变量用于程序的国际化

常用内置函数

常用awk内置函数

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包含正则表达式所匹配内容的长度。

数字函数(Numeric Functions)

函数名

功能作用

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])

生成随机数,可以设置起点

字符串操作函数(String-Manipulation Functions)

函数名

功能作用

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)

转换成大写

输入输出函数(Input/Output Functions)

close(filename [, how])

关闭文件输入输出流

fflush([filename])

刷新与文件名相关的任何缓冲输出

system(command)

执行操作系统命令,返回值给awk程序时间函数(Time Functions)

时间函数(Time Functions)

mktime(datespec)

datespec为时间戳格式,与systime()格式一样

strftime([format [, timestamp [, utc-flag]]])

格式化timestamp的内容,返回日期格式

systime()

返回系统时间,精确到秒

位操作函数(Bit-Manipulation Functions)

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的异或的值

获取类型信息(Getting Type Information)

isarray(x)

如果x是数组,返回true.否则false

字符串转换函数(String-Translation Functions)

bindtextdomain(directory [, domain])

设置awk要搜寻信息的目录和域

dcgettext(string [, domain [, category]])

返回的字符串string 翻译文本域domain 的语言环境类别category

dcngettext(string1, string2, number [, domain [, category]])

返回string1和string2的翻译数量的复数形式,string1,string2在语言环境类别的文本域里

25.3. awk实例

  1. 把用户文件 /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
  1. 把用户文件 /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
  1. 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. 输出所有偶数行的内容/输出制定行的内容

 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