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的用户

linux命令更新-文本处理awk_服务器

3 算术运算
awk -F ':' '{print $1,$3*1024}' passwd  # 将第三个字段乘以1024

linux命令更新-文本处理awk_运维_02

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。