强大的awk 更适合格式化文本,对文本进行较复杂格式处理

本文介绍了Linux下grep、sed和awk三个强大的文本处理工具,分别适用于查找匹配文本、编辑文本和格式化处理复杂文本。通过示例展示了如何使用awk找出文本文件中出现频率最高的IP地址和用户名。

grep 、sed、awk被称为linux中的"三剑客"。

我们总结一下这三个"剑客"的特长。

grep 更适合单纯的查找或匹配文本

sed  更适合编辑匹配到的文本

awk  更适合格式化文本,对文本进行较复杂格式处理

这样描述还看不出awk的强大之处,直接上面试题吧

题目简单,就是找到第一列中出现最多的ip,第二列中出现最多的用户名,之前的grep,sed无从下手,vi/vim更加不可能,怎么办呢,这时就需要强大awk了。这里我先给出答案,千万不要看到答案就晕了。再细讲awk的功能

1、找到第一列中出现最多的ip,命令如下:

awk 'BEGIN{max_h=0}{hostname[$2]++;};END{for(i in hostname){if(hostname[i]>max_i){max_i=hostname[i];ip_m=i}}print max_i,ip_m;}' awk.txt

 

2、第二列中出现最多的用户名,命令如下:

[test@iZ2zejcroqcaascckrpnw5Z log]$ more awk.txt

1.1.1.1 st_000012 ajgoahgoahgoahgghg2.2.2.2 st_000014 ajgoaoghaughughgu3.3.3.3 st_000015 alfjoigrhuogrub4.4.4.4 st_000016 ajgoaghkaahgoahgghg1.1.1.1 st_000019 ajgoalllllghughgu5.5.5.5 st_000015 alfjoigrhuogru[test@iZ2zejcroqcaascckrpnw5Z log]$ awk 'BEGIN{max_h=0}{hostname[$2]++;};END{for(i in hostname){if(hostname[i]>max_i){max_i=hostname[i];ip_m=i}}print max_i,ip_m;}' awk.txt2 st_000015

估计好多小伙伴已经晕了

没错,哪怕有点基础的,看到这个也会晕一会晕一会,这是什么鬼操作,看着像js,还有for循环,没错,要想进阶更深一点的linux,就必须了解这些,掌握了就是钱呀,因为面试过了好提工资吧

看在钱的份上,跟我一起来学习awk吧。本次就让大家晕一会,想深入学习的关注"起点测试"公众号

### 如何在 Shell 中使用 awk 处理复杂文本格式 `awk` 是一种强大文本处理工具,尤其适用于处理结构化数据,例如 key-value 格式、CSV、TSV 等复杂文本格式。它支持字段分隔、模式匹配、条件判断、变量定义、数学运算、正则表达式等多种功能,使得在 Shell 中处理复杂文本格式变得高效且灵活。 #### 字段分隔与内置变量 `awk` 默认使用空格或 Tab 作为字段分隔符,但可以通过 `FS` 变量或 `-F` 选项自定义分隔符。例如,处理以冒号 `:` 分隔的文件: ```bash awk -F: '{print $1, $3}' /etc/passwd ``` 该命令将 `/etc/passwd` 文件中的每一行按冒号分割,并打印第一个和第三个字段。类似地,可以使用 `FS` 内建变量实现相同功能: ```bash awk 'BEGIN {FS=":"} {print $1, $3}' /etc/passwd ``` `awk` 提供了多个内建变量用于处理文本结构,如 `NF` 表示当前行的字段数量,`NR` 表示当前行号,`FILENAME` 表示当前处理的文件名等。这些变量可以用于动态控制输出和处理逻辑[^3]。 #### 条件判断与模式匹配 `awk` 支持基于正则表达式的模式匹配,可用于筛选特定行。例如,以下命令将打印以字母开头的行: ```bash awk '/^[a-zA-Z]/ { print }' file ``` 此外,可以结合逻辑运算符进行条件判断。例如,以下命令将输出字段 2 大于 100 且字段 3 等于 "active" 的行: ```bash awk '$2 > 100 && $3 == "active" {print}' file ``` #### 变量定义与数学运算 `awk` 允许用户定义变量并进行数学运算。例如,以下命令将计算文件中所有数字字段的总和: ```bash awk '{ sum += $1 } END { print sum }' file ``` 此功能常用于统计和汇总数据,例如统计日志文件中的访问次数、计算销售额等。 #### 多文件处理与关联操作 `awk` 可以同时处理多个文件,并通过 `NR==FNR` 判断当前是否在处理第一个文件。例如,比较两个 key-value 文件: ```bash awk 'NR==FNR { a[$1]=$2; next } { if ($1 in a) { if (a[$1] != $2) print "Mismatch:", $1, a[$1], $2 } else print "Only in file2:", $1, $2 }' file1 file2 ``` 此命令将 `file1` 的内容加载到数组 `a` 中,然后逐行比较 `file2` 中的 key-value 是否匹配,适用于处理大型数据集的差异检测[^1]。 #### 自定义输出与格式化 `awk` 支持灵活的输出格式控制,可以使用 `printf` 实现对齐、格式化输出。例如,以下命令将按格式输出字段 1 和字段 2: ```bash awk '{ printf "%-10s %s\n", $1, $2 }' file ``` 这在生成报告或日志分析时非常有用。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值