awk命令简介
awk是一种强大的文本处理工具,可以对文本文件进行格式化、统计、计算等操作。它逐行读取文本文件,并对每一行进行处理。awk的语法相对简单,但功能非常强大,是Linux系统中常用的文本处理工具之一。
awk命令基本语法
awk的基本语法格式如下:
awk 'pattern {action}' input-file
- pattern: 模式,用于匹配特定的行。
- action: 动作,对匹配的行进行的操作。
- input-file: 输入文件。
awk命令常用参数
- -F fs: 指定字段分隔符,默认是空格或Tab。
- -v var=value: 定义变量。
- -f script: 从脚本文件中读取awk程序。
awk命令常用功能
1 打印指定字段
awk -F ':' '{print $1,$3}' passwd # 打印passwd文件中每一行的第一个和第三个字段
2 条件过滤
awk -F ':' '$3 >= 500 {print $1}' passwd # 打印uid大于等于500的用户
3 算术运算
awk -F ':' '{print $1,$3*1024}' passwd # 将第三个字段乘以1024
4 字符串操作
awk -F ':' '$1 ~ /root/ {print $0}' passwd # 匹配用户名为root的行
5 自定义函数
awk -F ':' 'function sum(a,b) {return a+b} {print sum($2,$3)}' passwd # 自定义求和函数
6 BEGIN和END块
awk 'BEGIN {print "User\tUID"} {print $1"\t"$3} END {print "Total users:" NR}' passwd
awk命令运维案例
1 统计日志文件中的错误次数
假设有一个日志文件access.log,格式如下:
192.168.1.1 - - [06/Apr/2004:00:01:02 -0400] "GET /index.html HTTP/1.1" 200 12345
192.168.1.2 - - [06/Apr/2004:00:02:03 -0400] "GET /error.html HTTP/1.1" 404 567
统计出现404错误的次数:
awk -F ' ' '$9 == "404" {count++} END {print "Total 404 errors:", count}' access.log
2 计算文件大小总和
假设有一个文件列表file_list.txt,每一行是一个文件名和大小(以字节为单位),格式如下:
file1.txt 12345
file2.txt 67890
计算所有文件的大小总和:
awk '{sum+=$2} END {print "Total size:", sum}' file_list.txt
3 格式化输出
假设有一个CSV文件user.csv,包含用户名、年龄和性别,格式如下:
张三,25,男
李四,30,女
将数据格式化为表格形式输出:
awk -F ',' 'BEGIN {print "姓名\t年龄\t性别"} {print $1"\t"$2"\t"$3}' user.csv
脚本用例
脚本一:分析系统日志,找出异常登录行为
脚本功能:
- 分析系统日志,找出连续多次登录失败的 IP 地址。
- 将异常登录信息写入日志文件。
#!/bin/bash
# 日志文件
logfile="/var/log/secure"
# 连续登录失败次数阈值
fail_count=5
# 输出日志文件
output_log="failed_login.log"
# 使用 awk 分析日志,找出满足条件的记录
awk -v fail_count="$fail_count" -v output="$output_log" '
BEGIN {
count = 0
}
/Failed password for/ {
ip = $11
if (ip in failed_ips) {
failed_ips[ip]++
} else {
failed_ips[ip] = 1
}
if (failed_ips[ip] >= fail_count) {
print $0 >> output
delete failed_ips[ip]
}
}
' "$logfile"
脚本解释:
- 变量:
logfile
:指定要分析的日志文件。fail_count
:设置连续登录失败的次数阈值。output_log
:指定输出日志文件的路径。- awk 部分:
BEGIN
块:初始化变量count
和关联数组failed_ips
。/Failed password for/
模式:匹配包含 “Failed password for” 的行,即登录失败的行。- 提取 IP 地址,并更新
failed_ips
数组中的计数。 - 当某个 IP 的失败次数达到阈值时,将该行写入输出日志文件,并从
failed_ips
中删除该 IP。
脚本二:分析 Nginx 访问日志,查找异常请求
脚本功能:
- 分析 Nginx 访问日志,找出访问频率过高的 IP 地址。
- 将异常请求信息写入日志文件。
#!/bin/bash
# 日志文件
logfile="/var/log/nginx/access.log"
# 时间窗口(秒)
time_window=600
# 请求次数阈值
request_count=100
# 输出日志文件
output_log="abnormal_requests.log"
# 使用 awk 分析日志,找出满足条件的记录
awk -v window="$time_window" -v count="$request_count" -v output="$output_log" '
BEGIN {
start_time = systime()
}
{
if (systime() - start_time > window) {
for (ip in requests) {
if (requests[ip] >= count) {
print ip, requests[ip] >> output
}
delete requests[ip]
}
start_time = systime()
}
ip = $1
requests[ip]++
}
END {
for (ip in requests) {
if (requests[ip] >= count) {
print ip, requests[ip] >> output
}
}
}
' "$logfile"
脚本解释:
- 变量:
logfile
:指定要分析的日志文件。time_window
:设置时间窗口,即统计请求次数的时间段。request_count
:设置请求次数阈值。output_log
:指定输出日志文件的路径。- awk 部分:
BEGIN
块:初始化start_time
。- 每处理一行日志:
- 判断是否超过时间窗口,如果是,则输出超过请求次数阈值的 IP。
- 更新
requests
数组,记录每个 IP 的请求次数。 END
块:处理最后剩余的请求数据。
总结
awk命令是Linux系统中非常强大的文本处理工具,通过灵活运用其模式匹配、变量、函数等功能,可以实现各种文本处理任务。本文仅介绍了awk命令的基本用法和一些常见的运维案例,awk的功能远不止于此。建议读者通过查阅相关资料和实践来深入学习awk。