Shell中的AWK

目录

1.awk的工作原理

2.awk的命令格式

3.awk基础命令

3.1过滤出包含指定内容的行

3.2  -F,指定分隔符,取列

3.3  BEGIN

3.4  END

3.5  文件导入,打印内容

3.6  “计算机”

3.7  awk取磁盘量

3.8  awk取IP地址

4. awk 常见的内置变量

4.1  FS

4.2  OFS

4.3  RS

4.4  NF

4.5  NR

4.6 找普通用户

4.7  FNR

5.自定义变量

6.模式匹配

7.找到10:00 到 11:00之间的日志

8.关系表达式

8.1  0为假;1为真

8.2  n++

8.3  !0

8.4  i=!i

8.5 !(i=!i)

9.条件判断

if条件判断

10.  for  

11.访问、赋值数值元素

12.遍历数组

13.小案例

1.  awk  '!line[$0]++'  test

2.  用for循环,打印端口号信息

3.  提取下面的字段中的 IP地址和时间

4.  提取host.txt主机名后再放回host.txt文件

5.  统计/etc/fstab文件中每个文件系统类型出现的次数

6.  统计/etc/fstab文件中每个真单词出现的次数

7.  提取出字符串Yd$C@M05MB%9&Bdh7dq+YVixp3vpw中的所有数字

8.  查出/tmp/的权限,以数字方式显示

9.  查出用户UID最大值的用户名、UID及shell类型


1.awk的工作原理

  • 逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。
  • awk倾向于将一行分成多个"字段"然后再进行处理。
  • awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示。
  • 使用awk命令的过程中,可以使用逻辑操作符"&&"表示"与"、"|"表示"或"、"!"表示"非",还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方。

2.awk的命令格式

  1. awk 选项 '模式或条件 {操作}' 文件1 文件2 ....
  2. 或者
  3. awk -f 脚本文件 文件1 文件2 .....

  • 第一步:执行BEGIN{action;… }语句块中的语句
  • 第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ action;… }语句块,它逐行扫描文件,
  • 从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
  • 第三步:当读至输入流末尾时,执行END{action;…}语句块
  • BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中
  • END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块
  • pattern语句块中的通用命令是最重要的部分,也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块 

3.awk基础命令

3.1过滤出包含指定内容的行

3.2  -F,指定分隔符,取列

3.3  BEGIN

3.4  END

3.5  文件导入,打印内容

3.6  “计算机”

3.7  awk取磁盘量

3.8  awk取IP地址

4. awk 常见的内置变量

awk 选项 '模式{print }'

  • FS :指定每行文本的字段分隔符,缺省默认为空格或制表符(tab)。与 “-F”作用相同 -v "FS=:"

  • OFS:输出时的分隔符

  • NF:当前处理的行的字段个数

  • NR:当前处理的行的行号(序数)

  • $0:当前处理的行的整行内容

  • $n:当前处理行的第n个字段(第n列)

  • FILENAME:被处理的文件名

  • RS:行分隔符。awk从文件上读取资料时,将根据RS的定义就把资料切割成许多条记录,而awk一次仅读入一条记录进行处理。预设值是\n

-v:定义变量  awk  中的变量

-F:指定分隔符

4.1  FS

4.2  OFS

4.3  RS

4.4  NF

4.5  NR

4.6 找普通用户

4.7  FNR

5.自定义变量

printf   
%s:显示字符串
%d, %i:显示十进制整数
%f:显示为浮点数
%e, %E:显示科学计数法数值 
%c:显示字符的ASCII码
%g, %G:以科学计数法或浮点形式显示数值
%u:无符号整数
%%:显示%自身

##############做成一个表格###########################

awk -F:   'BEGIN{printf "--------------------------------\n%-20s|%10s|\n--------------------------------\n","username","uid"}{printf "%-20s|%10d|\n--------------------------------\n",$1,$3}' /etc/passwd

6.模式匹配

awk '模式{处理动作}'

PATTERN:根据pattern条件,过滤匹配的行,再做处

7.找到10:00 到 11:00之间的日志

awk      '/10/,/11/'        文件名

sed      -nr    '/10/,/11/p'        文件名

8.关系表达式

  • 关系表达式结果为“真”才会被处理
  • 真:结果为非0值,非空字符串
  • 假:结果为空字符串或0值

8.1  0为假;1为真

8.2  n++

8.3  !0

8.4  i=!i

8.5 !(i=!i)

9.条件判断

  • if语句:awk的if语句也分为单分支、双分支和多分支
  • 单分支为if(判断条件){执行语句}
  • 双分支为if(判断条件){执行语句}else{执行语句}
  • 多分支为if(判断条件){执行语句}else if(判断条件){执行语句}else if(判断条件){执行语句}else if(判断条件){执行语句 

if条件判断

10.  for  

11.访问、赋值数值元素

12.遍历数组

13.小案例

1.  awk  '!line[$0]++'  test

2.  用for循环,打印端口号信息

ss -natp| awk 'NR!=1{print  $1}'  | sort |uniq  -c

ss -natp | awk  'NR!=1{a[$1]++}END{for(i in a)print  i,a[i]}'

3.  提取下面的字段中的 IP地址和时间

58.87.87.99 - - [09/Jun/2020:03:42:43 +0800] "POST /wp-cron.php?doing_wp_cron=1591645363.2316548824310302734375 HTTP/1.1" ""sendfileon
128.14.209.154 - - [09/Jun/2020:03:42:43 +0800] "GET / HTTP/1.1" ""sendfileon
64.90.40.100 - - [09/Jun/2020:03:43:11 +0800] "GET /wp-login.php HTTP/1.1"""sendfileo
 

4.  提取host.txt主机名后再放回host.txt文件

1 www.kgc.com
2 mail.kgc.com
3 ftp.kgc.com
4 linux.kgc.com
5 blog.kgc.com

5.  统计/etc/fstab文件中每个文件系统类型出现的次数

6.  统计/etc/fstab文件中每个真单词出现的次数

7.  提取出字符串Yd$C@M05MB%9&Bdh7dq+YVixp3vpw中的所有数字

8.  查出/tmp/的权限,以数字方式显示

9.  查出用户UID最大值的用户名、UID及shell类型

<think>嗯,用户想了解如何在Shell中使用awk命令进行文本处理。首先,我需要回顾一下awk的基本概念和常用功能。根据提供的引用内容,用户可能已经看过一些基础介绍,但需要更详细的步骤和示例。 首先,我应该从awk的基本语法开始。用户可能需要知道如何编写简单的awk命令,比如打印特定字段或整行。引用[1]提到了打印整行和特定字段的示例,这可能是个好的起点。同时,引用[2]和[3]展示了如何引用shell变量和使用自定义分隔符,这些也是重要的知识点。 接下来,用户可能需要具体的例子来理解不同选项的用法。例如,如何根据条件筛选行,比如输出第三列大于50的行。这里需要说明条件表达式的位置在模式和动作之间,比如$3 > 50 {print}。 然后,自定义分隔符也是一个常见需求。引用[3]中的例子使用了-F选项,可以演示如何用-F指定分隔符,比如冒号或者逗号,处理不同的文本结构。 另外,用户可能对内置变量感兴趣,比如NR、NF、FS、OFS等。需要解释这些变量的作用,并给出例子,比如使用NR输出行号,或者用NF处理最后一列的数据。 还有,如何处理外部变量传递的问题,如引用[2]所示,使用-v选项将shell变量传递给awk脚本,这在实际脚本编写中很实用,应该详细说明。 可能还需要提到更高级的用法,比如BEGIN和END块,用于初始化和结束处理,例如计算总和或平均值。同时,结合其他命令如grep或sort,展示awk在管道中的使用场景。 用户的问题可能还涉及性能或效率方面的考虑,但提供的引用中没有太多相关信息,可能需要简要提及awk处理大文件的优势。 最后,确保所有示例符合用户的要求,使用正确的LaTeX格式,行内公式用$...$,独立公式用$$...$$。同时,生成的相关问题要覆盖用户可能进一步探索的方向,比如内置变量、性能优化、复杂文本处理等。 需要检查是否所有要点都覆盖到了:基本语法、常用选项、内置变量、示例用法、变量传递、高级功能。避免遗漏关键步骤,确保回答结构清晰,逐步引导用户从基础到进阶应用。</think>### 如何在Shell中使用`awk`命令进行文本处理? `awk`是一种强大的文本处理工具,适用于数据提取、格式转换和统计分析。以下是逐步指南: --- #### **1. 基础语法** `awk`命令的基本结构为: ```bash awk '模式 {动作}' 文件名 ``` - **模式**:筛选条件(如正则表达式或逻辑判断) - **动作**:对匹配行执行的操作(如打印、计算) --- #### **2. 常用功能与示例** ##### **2.1 打印整行或特定字段** - **打印整行**(默认行为): ```bash awk '{print}' file.txt # 等效于 cat file.txt ``` - **打印特定字段**(默认以空格/Tab分隔): ```bash awk '{print $1, $3}' file.txt # 输出第1和第3列 ``` > 引用示例:打印特定字段[^1] ##### **2.2 根据条件筛选行** - **输出包含关键词的行**: ```bash awk '/error/ {print}' log.txt # 输出含"error"的行 ``` - **输出第三列大于50的行**: ```bash awk '$3 > 50 {print $0}' data.txt ``` ##### **2.3 自定义分隔符** - **指定输入分隔符**: ```bash awk -F':' '{print $1}' /etc/passwd # 以冒号分隔,输出用户名 ``` - **指定输出分隔符**: ```bash awk -F',' 'BEGIN{OFS="|"} {print $1, $3}' data.csv ``` ##### **2.4 使用内置变量** - `NR`:当前行号 ```bash awk '{print NR, $0}' file.txt # 输出行号+内容 ``` - `NF`:当前行的字段数 ```bash awk '{print $NF}' file.txt # 输出每行最后一个字段 ``` ##### **2.5 引用Shell变量** 通过`-v`传递变量: ```bash name="Alice" awk -v user="$name" '{print user, $1}' file.txt ``` > 引用示例:在`awk`中引用Shell变量[^2] --- #### **3. 高级用法** ##### **3.1 统计与计算** - **计算文件行数**: ```bash awk 'END{print NR}' file.txt ``` - **求和某一列**: ```bash awk '{sum += $2} END{print sum}' data.txt ``` ##### **3.2 结合`BEGIN`和`END`块** 初始化与收尾操作: ```bash awk 'BEGIN{print "Start"} {print $0} END{print "End"}' file.txt ``` ##### **3.3 脚本文件处理** 将复杂逻辑写入脚本文件(如`script.awk`): ```awk # script.awk BEGIN {FS=":"} $3 > 1000 {print $1, $3} ``` 执行脚本: ```bash awk -f script.awk /etc/passwd ``` > 引用示例:从文件读取`awk`脚本[^1] --- #### **4. 实际应用场景** - **分析日志**:提取特定时间段的错误日志 - **处理CSV数据**:计算某列的平均值 - **系统监控**:解析`/proc/uptime`获取运行时长[^3] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值