linux-awk练习

1.只处理用户ID为奇数的行,并打印用户名和uid号

代码:

awk -F: '$3%2 != 0{print $1,$3}' /etc/passwd

运行结果:
在这里插入图片描述

2.显示系统的普通用户,并打印用户名和ID

代码:

awk -F: '$1! = "root" {print $1,$3}' /etc/passwd

运行结果:

在这里插入图片描述

3.显示用户shell是’/bin/bash’的用户,并打印用户名

代码:

awk -F: '$7 == "/bin/bash"{print $1}' /etc/passwd

运行结果:

在这里插入图片描述

4.统计普通用户的个数

代码:

awk -F: '$1!="root" {print $1,$3}' /etc/passwd | wc -l

运行结果:

在这里插入图片描述

5.统计文本的总行数

代码:

awk -F: '{print}' /etc/passwd | wc -l

运行结果:

在这里插入图片描述

6.显示文件名

代码:

ll |awk  '{print $9}'

运行结果:

在这里插入图片描述

7.显示UID为1001用户的相关信息

代码:

awk -F: '$3 == 1001{print $0}' /etc/passwd

运行结果:

在这里插入图片描述

8.利用awk模拟tail -1的效果

代码:

awk 'END{print $0}' /etc/passwd

运行结果:

在这里插入图片描述

9.看懂数组两个练习(统计tcp链接数)

代码:

1.统计tcp的链接数

netstat -ant | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'

统计tcp两个状态(LISTEN\ESTABLISHED)的链接个数,用数组state计数

2.分别统计不同ip的tcp连接

netstat -ant | awk '/^tcp/ {n=split($(NF-1),array,":");if(n<=2)++S[array[(1)]];else++S[array[(4)]];++s[$NF];++N} END {for(a in S){printf("%-20s %s\n", a, S[a]);++I}printf("%-20s %s\n","TOTAL_IP",I);for(a in s) printf("%-20s %s\n",a, s[a]);printf("%-20s %s\n","TOTAL_LINK",N);}'

split( ( N F − 1 ) , a r r a y , " : " ) 将 倒 数 第 二 个 字 段 按 照 " : " 分 割 成 a r r a y 数 组 , S [ ] 数 组 下 标 是 i p 地 址 , 元 素 是 每 个 i p 地 址 的 链 接 个 数 , , s [ (NF-1),array,":")将倒数第二个字段按照":"分割成array数组,S[]数组下标是ip地址,元素是每个ip地址的链接个数,,s[ (NF1),array,":")":"arrayS[]ipips[NF]下标是状态(LISTEN\ESTABLISHED),元素是每个状态链接个数;N是总链接数。

10.将test2文件中的行追加到test1的同一行后,并保存到文件test3

test1文本内容:

haha
hehe
alice
bob

test2文本内容:

20
25
18
30

test3文本内容:

haha:20
hehe:25
alice:18
bob:30

代码:

awk '{printf "%s: ",$1; getline t < "test2" ; printf " %s\n",t}' test1 > test3

运行结果:
在这里插入图片描述

11.某产品的CDN带宽运营成本迅猛增涨,其带宽主要由各种类型的图片组成,为了对某产品的图片流量带宽进行优化,现需要对该产品的图片和号码特性做一些分析,已有的日志文件test.log供分析使用,格式:

号码|请求大小|请求id,内容如下:

001|100|abc.gif
002|80|abd.jpg
003|150|abe.gif
001|60|abf.gif

003|30|abg.jpg

其中带有gif表示是gif图片的请求,带有jpg表示是jpg图片的请求,请使用(python/shell/awk/sort)编写程序实现如下分析思路(1,2为中间步骤,可以只输出3,4结果):

1.找出所有gif图片请求的所有号码

2.找出所有gif图片请求的号码和其对应的请求大小总和及请求数总和.

3.找出所有gif图片请求的号码,并按照其请求大小总和从大到小排序.

4.找出所有gif图片请求的号码,并按其请求平均图片大小从大到小排序.

代码:

awk -F '|' '/gif$/{print$1}' test.log |sort -n | uniq
awk -F '|' '/gif$/{arg[$1] += $2}END{for(i in arg){print i,arg[i]}}' test.log 
awk -F '|' '/gif$/{arg[$1] += $2}END{for(i in arg){print i,arg[i]}}' test.log |sort -k2nr

在这里插入图片描述
4.

awk -F '|' '/gif$/{++sum[$1];arg[$1] += $2}END{for(i in arg){print i,arg[i]/sum[i]}}' test.log |sort -k2nr

在这里插入图片描述
参考改进:awk脚本作业

<think>嗯,用户想学习或练习Linux下的awk用法,需要提供示例教程。首先,我得回忆一下awk的基本概念工作原理。记得awk是一种文本处理工具,逐行处理据,按字段进行操作。用户可能需要从基础开始,逐步深入。 然后,看看用户给的参考引用。引用[1]提到awk的工作原理,引用[2]展示了一个打印字段的例子,引用[3]则是一些更复杂的应用,比如处理ifconfig的输出。这些例子应该可以拆解成不同的练习题目,帮助用户逐步掌握。 接下来,得确保回答结构清晰。先介绍awk的基本用法,再提供由浅入深的示例。比如,从打印特定字段开始,到条件过滤、计算统计,再到文本处理的高级技巧,比如处理多行记录或正则表达式匹配。 还要注意用户的练习需求,可能需要实际问题来练习。例如,处理学生成绩表、日志分析、系统信息提取等,这些实际场景能帮助用户巩固知识。同时,结合参考中的例子,比如处理ifconfig的输出,可以设计相应的练习题。 另外,用户提到的示例中的多行处理(使用RS变量)字段处理(FS变量)也很重要。需要详细说明这些概念,并提供示例代码解释,确保用户理解如何修改记录分隔符字段分隔符。 最后,生成相关问题,帮助用户进一步探索awk的高级功能,比如性能优化、复杂文本处理等。还要确保所有命令示例符合LaTeX格式要求,行内公式用$...$,独立公式用$$...$$,并且正确引用来源。</think>### Linux awk 基础与进阶练习指南 ### 一、awk 基础用法 1. **核心原理** awk 按记录(默认行)处理文本,每条记录自动分割为字段(默认空格分隔),支持模式匹配与动作执行[^1]。基本结构: ```bash awk 'pattern {action}' file ``` 2. **字段操作示例** ```bash awk '{print $1, $3}' data.txt # 输出第1第3列[^2] awk -F: '{print $1,$6}' /etc/passwd # 使用冒号分隔符 ``` ### 二、进阶练习示例 #### 1. 条件过滤 ```bash # 筛选成绩大于80的学生 awk '$3 > 80 {print $1, $3}' scores.txt # 排除空行 awk '!/^$/ {print}' log.txt ``` #### 2. 值计算 ```bash # 计算文件总行 awk 'END {print NR}' data.txt # 求第2列平均值 awk '{sum+=$2} END {print sum/NR}' numbers.txt ``` #### 3. 多字段处理 ```bash # 组合字段输出 awk '{print "用户:" $1, "UID:" $3}' /etc/passwd # 字段重排(交换第2、3列) awk '{tmp=$2; $2=$3; $3=tmp; print}' data.txt ``` #### 4. 系统信息提取(参考[^3]) ```bash # 获取所有IPv4地址(排除127) ifconfig | awk '/inet / && !($2 ~ /^127/) {print $2}' # 统计TCP连接 netstat -ant | awk '$6 == "ESTABLISHED" {count++} END {print count}' ``` ### 三、高级技巧 1. **多行记录处理** 修改记录分隔符 `RS`: ```bash awk 'BEGIN{RS=""; FS="\n"} {print $2}' multi.txt # 处理段落格式据 ``` 2. **组应用** ```bash # 统计词频 awk '{for(i=1;i<=NF;i++) words[$i]++} END {for(w in words) print w, words[w]}' text.txt ``` 3. **正则表达式匹配** ```bash # 匹配带版本号的行 awk '/[0-9]+\.[0-9]+\.[0-9]+/ {print}' version.log ``` ### 四、实践项目 1. **日志分析** 分析 Nginx 访问日志: ```bash awk '$9 == 404 {print $7}' access.log | sort | uniq -c | sort -nr ``` 2. **据报表生成** ```bash awk 'BEGIN{print "姓名\t总分"} {sum=$2+$3+$4; print $1 "\t" sum}' scores.txt ``` 3. **系统监控脚本** ```bash df | awk '$5 > 80 {print "警告: " $1 " 使用率 " $5}' ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值