Linux中awk命令

awk 是一个强大的文本处理工具和编程语言,专门用于处理和解析文本文件。它以行和列的形式处理文本,并提供了强大的模式匹配和报告生成能力awk 得名于其创建者 Alfred Aho、Peter Weinberger 和 Brian Kernighan 的名字。

基本语法

awk 'pattern { action }' file
  • pattern:可选的模式,用于匹配行。
  • action:对匹配行要执行的操作。如果未指定动作,awk 将默认打印所有匹配行。

常用选项

  • -F:指定输入字段分隔符。
  • -v:定义变量。
  • -f:从文件读取脚本。

基本操作

  1. 打印特定字段

    如果有一个文件 data.txt 的内容如下:

    Alice 30 female
    Bob 25 male
    Carol 28 female
    

    打印文件的第二列(年龄):

    awk '{ print $2 }' data.txt
    

    输出:

    30
    25
    28
    
  2. 指定字段分隔符

    若文件内容为 CSV 格式:

    name,age,gender
    Alice,30,female
    Bob,25,male
    Carol,28,female
    

    使用逗号作为字段分隔符并打印第一和第三列:

    awk -F ',' '{ print $1, $3 }' data.csv
    

    输出:

    name gender
    Alice female
    Bob male
    Carol female
    
  3. 使用模式匹配

    仅打印年龄大于 26 的行:

    awk '$2 > 26 { print $1, $2 }' data.txt
    

    输出:

    Alice 30
    Carol 28
    
  4. 使用内置变量

    打印行号:

    awk '{ print NR, $0 }' data.txt
    

    输出:

    1 Alice 30 female
    2 Bob 25 male
    3 Carol 28 female
    

常见模式和操作

  1. 条件语句

    使用条件语句进行复杂判断:

    awk '{ if ($2 > 25) print $1 " is older than 25." }' data.txt
    
  2. 累加和计算

    计算年龄的总和:

    awk '{ sum += $2 } END { print sum }' data.txt
    

    计算平均年龄:

    awk '{ sum += $2; count++ } END { print sum/count }' data.txt
    
  3. 输出格式化

    格式化输出:

    awk '{ printf "%-10s %s\n", $1, $2 }' data.txt
    

高级用法

  1. 从文件读取脚本

    将以下内容保存为 script.awk

    {
        if ($2 > 26) {
            print $1 " is older than 26."
        }
    }
    

    在命令行中调用:

    awk -f script.awk data.txt
    
  2. 使用变量

    awk -v age=30 '$2 > age { print $1 " is older than " age }' data.txt
    
  3. 报告生成

    生成简单的报告:

    awk -F ',' 'NR > 1 { age_sum += $2; count++ } END { printf "Average age: %.2f\n", age_sum/count }' data.csv
    

文件处理示例

示例 1: 统计文件中的行数
awk 'END { print NR }' data.txt
示例 2: 查找特定文本

查找包含 “female” 的行:

awk '/female/ { print $0 }' data.txt
示例 3: 计算字段总和

如果你有一个包含价格的文件 prices.txt

10.5
20.0
15.75

计算总和:

awk '{ total += $1 } END { print total }' prices.txt

当然可以!下面是一些具体的 awk 实例,涵盖常见用法和复杂操作,以帮助你更好地理解和使用 awk

示例 1: 打印特定字段

假设有一个文件 data.txt,内容如下:

Alice 30 female
Bob 25 male
Carol 28 female
  1. 打印第二列(年龄)

    awk '{ print $2 }' data.txt
    

    输出:

    30
    25
    28
    
  2. 打印第一列(名字)和第三列(性别)

    awk '{ print $1, $3 }' data.txt
    

    输出:

    Alice female
    Bob male
    Carol female
    

示例 2: 使用不同分隔符

假设有一个 CSV 文件 data.csv,内容如下:

name,age,gender
Alice,30,female
Bob,25,male
Carol,28,female
  1. 使用逗号作为字段分隔符,打印第一和第三列
    awk -F ',' '{ print $1, $3 }' data.csv
    
    输出:
    name gender
    Alice female
    Bob male
    Carol female
    

示例 3: 条件语句

  1. 打印年龄大于 26 的行

    awk '$2 > 26 { print $1, $2 }' data.txt
    

    输出:

    Alice 30
    Carol 28
    
  2. 打印性别为 ‘female’ 的行

    awk '$3 == "female" { print $1 }' data.txt
    

    输出:

    Alice
    Carol
    

示例 4: 使用内置变量

  1. 打印行号和行内容

    awk '{ print NR, $0 }' data.txt
    

    输出:

    1 Alice 30 female
    2 Bob 25 male
    3 Carol 28 female
    
  2. 统计总行数

    awk 'END { print NR }' data.txt
    

    输出:

    3
    

示例 5: 计算和平均值

  1. 计算年龄总和

    awk '{ sum += $2 } END { print sum }' data.txt
    

    输出:

    83
    
  2. 计算平均年龄

    awk '{ sum += $2; count++ } END { print sum/count }' data.txt
    

    输出:

    27.6667
    

示例 6: 输出格式化

  1. 格式化输出
    awk '{ printf "%-10s %s\n", $1, $2 }' data.txt
    
    输出:
    Alice      30
    Bob        25
    Carol      28
    

示例 7: 查找特定文本

在文件 log.txt 中,假设内容如下:

INFO: User Alice logged in
ERROR: Bob failed to log in
INFO: Carol logged out
WARN: Bob takes too long to login
  1. 查找包含 ‘ERROR’ 的行

    awk '/ERROR/ { print $0 }' log.txt
    

    输出:

    ERROR: Bob failed to log in
    
  2. 从每行提取用户的名字

    awk '/User|failed/ { print $3 }' log.txt
    

    输出:

    Alice
    Bob
    

示例 8: 复杂操作公式

  1. 计算各列的最大值(假设每一行有多个数值):

    awk '{
        for (i=1; i<=NF; i++) {
            if ($i > max[i]) {
                max[i] = $i;
            }
        }
    } END {
        for (i=1; i<=NF; i++) {
            print "Max for column " i ": " max[i];
        }
    }' numbers.txt
    
  2. 统计每个用户的登录次数

awk '{ count[$3]++ } END { for (user in count) print user ": " count[user] }' log.txt

示例 9: 使用用户名作为字段

将用户信息存储在 users.txt 中:

username:password:uid:gid:description
user1:pass1:1001:1001:User One
user2:pass2:1002:1001:User Two
user3:pass3:1003:1002:User Three
  1. 打印用户名和描述
    awk -F ':' '{ print $1, $5 }' users.txt
    
    输出:
    username description
    user1 User One
    user2 User Two
    user3 User Three
    

示例 10: 从文件读取脚本

如果你有一个脚本 script.awk,内容如下:

{
    if ($2 > 25) {
        print $1 " is older than 25."
    }
}

使用以下命令调用它:

awk -f script.awk data.txt

示例 11: 使用 -v 选项定义变量

awk -v threshold=25 '$2 > threshold { print $1 " is older than " threshold }' data.txt

示例 12: 结合其他命令

  1. 查找某个词并计算行数

    grep "Alice" data.txt | awk '{ print $1 }'
    
  2. 统计文件中不同名字的数量

    cut -d ' ' -f 1 data.txt | sort | uniq | wc -l
    

示例 13: 处理多个文件

假设有多个文件 data1.txtdata2.txt,共同格式如下:

cat data*.txt | awk '{ print $1, $2 }'  # 打印每个文件的前两列

示例 14: 通过 FIELDWIDTHS 使用定宽字段

如果文件 fixed_width.txt 是这样的:

Alice    30 female
Bob      25 male
Carol    28 female

可以使用FIELDWIDTHS来处理固定宽度的字段:

awk 'BEGIN { FIELDWIDTHS = "10 3 6" } { print $1, $2 }' fixed_width.txt

示例 15: 输出到文件

将计算结果输出到文件:

awk '{ print $1, $2 }' data.txt > output.txt

总结

awk 是一个强大且灵活的文本处理工具。无论是简单的列提取,还是复杂的数据处理和报告生成,awk 都能高效地完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值