linux 的awk命令

本文详细介绍了AWK这一强大的行文本处理工具,包括其基本原理、语法、内置变量与函数、控制流程等内容,并通过实例展示了如何使用AWK进行数据处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.什么是AWK

(1)Aho、Weinberger、Kernighan三位发明者名字首字母;

(2)一个行文本处理工具;

2.AWK基本原理

2.1原理:

逐行处理文件中的数据

2.2语法:

awk 'pattern + {action}'
说明:

  • (1)单引号''是为了和shell命令区分开;
  • (2)大括号{}表示一个命令分组;
  • (3)pattern是一个过滤器,表示命中pattern的行才进行action处理;
  • (4)action是处理动作;
  • (5)使用#作为注释;
    例子:显示hello.txt中的第3行至第5行
cat hello.txt | awk 'NR==3, NR==5{print;}'
2.3pattern说明

pattern参数可以是egrep正则中的一个,正则使用/pattern/
例子:显示hello.txt中,正则匹配hello的行

cat hello.txt | awk '/hello/'

说明:

  • (1)pattern和action可以只有其一,但不能两者都没有;
  • (2)默认的action是print;
    例子:显示hello.txt中,长度大于100的行号
cat hello.txt | awk 'length($0)>80{print NR}'

3.内置变量

FS 分隔符,默认是空格
NR 当前行数,从1开始
NF 当前记录字段个数
$0 当前记录
$1~$n 当前记录第n个字段

例子:显示hello.txt中的第3行至第5行的第一列与最后一列

cat hello.txt | awk 'NR==3, NR==5{print $1,$NF}'
4.内置函数

gsub(r,s):在$0中用s代替r
index(s,t):返回s中t的第一个位置
length(s):s的长度
match(s,r):s是否匹配r
split(s,a,fs):在fs上将s分成序列a
substr(s,p):返回s从p开始的子串

5.操作符

5.1运算符

类似于c,支持+、-、*、/、%、++、–、+=、-=等诸多操作;

5.2判断符

类似于c,支持==、!=、>、=>、~(匹配于)等诸多判断操作;

6.控制流程

6.1.BEGIN和END

BEGIN和END本质是一个pattern。
BEGIN用于awk程序开始开始前,做一些初始化的工作;
END用于awk程序结束前,做一些收尾的工作。
例子:统计字符个数

awk '
BEGIN
{
count=0;
}
{
count+=length($0);
}
END
{
print count;
}'
6.2流程控制语句
  • (1)if(condition){}else{}
  • (2)while{}
  • (3)do{}while(condition);
  • (4)for(init;condition;step){}
  • (5)break/continue:如果有END,会执行END中的收尾工作
    流程控制语句用法几乎与c相同。

7.awk与shell的交互

  • (1)awk中使用shell中定义的变量:使用单引号即可;
#!/bin/bash
STR="hello"
echo | awk '{
print "'${STR}'";
}'
  • (2)awk中使用shell命令:使用双引号,或者system命令;
#!/bin/bash
echo hello | awk '{
print $0 | "cat"
}'

或者

#!/bin/bash
echo | awk '{
system("date > date.txt")
}'
  • (3)awk中的变量传出至shell:没有什么好方法,老老实实用文件吧;
  • (4)getline:awk里,从文件中读取变量到awk中
#!/bin/bash
echo | awk '{
while(getline < "date.txt")
{
print $0;
}
}'
<think>好的,我现在需要帮助用户学习Linux中的awk命令。首先,用户提到他们想了解使用教程和示例,所以我要确保覆盖基础到进阶的内容,并且提供实际的例子。根据用户提供的引用资料,引用[1]和引用[2]都是关于awk的教程,特别是格式化输出和内存管理相关的内容,可能需要重点提到这些部分。 首先,我应该从awk的基本概念开始,让用户明白awk是什么,主要用途是什么。然后按照结构化的方式分步骤讲解,比如基本语法、字段引用、模式匹配、常用变量、格式化输出(printf)、处理多个文件、进阶用法等。每个部分都需要有示例代码,这样用户更容易理解。 接下来,用户可能需要知道如何实际应用这些命令,比如文本处理、数据提取、统计等。因此,我需要准备一些常见的使用场景示例,比如统计日志中的访问次数,或者计算文件中的数值总和。同时,用户提供的引用中提到了格式化输出,比如使用printf来调整输出格式,这部分需要详细说明,可能包括如何指定字段宽度、对齐方式等。 另外,用户提供的示例中提到了BEGIN和END块的使用,这在处理文件前后执行操作时非常有用,比如初始化变量或输出总结信息。我应该在教程中专门介绍这两个关键字,并给出具体的例子,比如在BEGIN中设置标题,在END中输出总行数。 还要注意用户可能对如何结合其他命令使用awk感兴趣,比如与netstat结合分析网络连接情况。引用[2]中的例子使用了netstat和awk的组合,展示如何格式化输出连接信息,这样的例子非常实用,应该包含在教程中。 同时,需要确保所有的代码示例都正确,使用正确的语法,并且符合用户要求的格式,比如行内数学表达式用$...$,独立公式用$$...$$,但在这里可能主要是代码块,所以需要用代码框包裹。此外,要使用中文回答,保持结构清晰,分步骤讲解。 最后,生成相关问题时要考虑用户可能进一步想知道的内容,比如awk的优化技巧、高级功能或者与其他工具的比较等。这样可以帮助用户深入学习。 总结一下,我需要按照用户的要求,结构清晰、分步骤地介绍awk的基本用法、常用功能、格式化输出、实际应用示例,并结合用户提供的引用资料中的例子,确保内容准确且实用。同时,生成的相关问题应覆盖用户可能感兴趣的后续学习点。</think># Linux awk 命令使用教程及示例 ## 一、awk 简介 awk 是一种专为文本处理设计的编程语言,支持**字段分割**、**模式匹配**和**数据运算**。它以行为单位处理文本,默认按空格或制表符分割字段,常用于日志分析、数据提取和报表生成[^1]。 --- ## 二、基础语法 ### 1. 基本格式 ```bash awk 'pattern {action}' 文件名 ``` - **pattern**:条件表达式(可选) - **action**:匹配后执行的操作 ### 2. 字段引用 - `$0`:整行内容 - `$1`:第1列,`$2`:第2列,依此类推 示例:提取日志第3列 ```bash awk '{print $3}' access.log ``` --- ## 三、核心功能演示 ### 1. 模式匹配 筛选包含"ERROR"的行: ```bash awk '/ERROR/ {print $0}' app.log ``` ### 2. 内置变量 - `NF`:当前行字段数 - `NR`:当前行号 示例:显示行号及最后字段 ```bash awk '{print NR, $NF}' data.txt ``` ### 3. 格式化输出 使用`printf`控制输出格式[^2]: ```bash netstat -anp | awk '{printf "%-8s %-8s %-10s\n",$1,$2,$3}' ``` --- ## 四、进阶用法 ### 1. BEGIN/END 块 预处理和后处理操作: ```bash awk 'BEGIN {sum=0} {sum+=$1} END {print "总和:",sum}' numbers.txt ``` ### 2. 自定义分隔符 使用`-F`指定分隔符: ```bash awk -F':' '{print $1}' /etc/passwd ``` ### 3. 条件判断 统计HTTP 500错误次数: ```bash awk '$9==500 {count++} END {print count}' access.log ``` --- ## 五、综合应用示例 ### 1. 统计用户访问频次 ```bash awk '{ip_count[$1]++} END {for(ip in ip_count) print ip, ip_count[ip]}' access.log ``` ### 2. 数据格式转换 将CSV转为对齐表格: ```bash awk -F',' 'BEGIN {print "姓名\t年龄"} {printf "%-10s %-3d\n", $1, $2}' data.csv ``` ### 3. 多文件处理 合并统计两个日志文件: ```bash awk '{total+=$3} END {print "总流量:", total}' log1.log log2.log ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值