文本三剑客之AWK

awk原理

  • 是一种文本处理工具

  • 加载一行处理一行

awk命令格式:

1.awk [选项]   '表达式  {处理动作}' 文件1  文件2 ……

   满足表达式就处理,不满足表达式就不处理

2.awk -f  脚本文件   文件1  文件2……

awk选项:

-F : 指定分隔符

-v : 指定变量

表达式:

awk的语言的表达式

1.不写就没有效果

2.找到特定的行

处理动作:

print 打印

printf 打印

计算:100+200

awk '{print $n}'                      以空格为分隔符,取第n列

awk -F: '{print $n}'                 以冒号为分隔符 取第n列

awk内置变量

awk 内置变量和设立了环境中 的变量会有冲突,所以用'{  }'

         如:awk '{print $2}'     以空格为分隔符取第二列

语法:awk [选项] '模式{处理动作 }'

如果模式为空,则每一行都要处理

模式:

  • FS :列分割符。指定每行文本的字段分隔符,默认为空格或制表位。与"-F"作用相同

  • OFS:决定输出时的分隔符

  • RS: 决定行分隔符,RS=":" 指定冒号为行分隔符。

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

    示例:倒数第二列:$(NF-1)

    倒数第一列:$(NF)

  • NR:显示行号

         示例:NR==2,只显示第二行

         awk 'NR==2{print $1}'

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

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

    $0:一整行或者一整列

    $1:第一列

    $2:第二列

  • FILENAME:显示处理的文件名

关系表达式

关系表达式结果为真才会被处理

真:结果为非0值,非空字符串

假:结果为空字符串或0值

seq 10|awk 'i=!i' 奇数行

seq 10|awk '!(i=!i)'偶数行

条件判断

awk [选项] '模式{条件判断}'

案例题:

1.NR==1,NR==4取区间行

 awk -F: "NR==1,NR==4 {print $1}'  /etc/passwd

'NR==1,NR==4 {print $1}'           取1-4行的第一列

2.打印所有/etc/passwd所有用户名(根据-F指定分隔符)

     cat /etc/passwd|awk -F":" '{print $1}'

-F":"                   以冒号作为分隔符

print  $1             打印出第一列

3.打印磁盘已使用情况,去除%

df|awk '{print $5}'|awk -F% '{print $1}'

df|awk -F"[ %]+" '{print $5}'

df|awk -F"( |%)+" '{print $5}'

实例题:

1.找到10点到11点之间的日志

awk '/10:00/,/11:00/{print $0}'

2.删除test里重复的行

awk '!a[$0]++' test

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

cat /etc/fstab |awk '^[^#]/{print}' |awk '{print $3}' |sort |uniq -c

'/^[^#]/          提取不以#开头的行

$3                提取第三个字段

sort              排序

uniq -c          去重并统计次数

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

grep -o "\b[a-zA-Z]+\b" /etc/fstab

"\b[a-zA-Z]+\b"              以aA为开头到以zZ为结尾的整字符

+                                    代表一个以上的字符

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

echo "Yd$C@MO5MB%9&Bdh7dq+YVixp3vpw" |grep -o [0-9]

  grep -o [0-9]              只输出匹配的内容,0-9的数字全部显示

6.提取主机名并放入原文件 test.txt

http://mail.kgc.com/index.html http://www.kgc.com/test.html http://study.kgc.com/index.html http://blog.kgc.com/index.html http://www.kgc.com/images/logo.jpg http://blog.kgc.com/20080102.html http://www.kgc.com/images/kgc.jpg

第一种写法:

cat test |awk -F"[/ .]+" '{print $3}' >>test

"[.  /]"        以  .  或   /  为分隔符

$3             取第三个字段 

第二种写法:

cat test |cut -d "/" -f3|cut -d "." -f1

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

stat /tmp/|awk -F"[(/]" 'NR==4{print $2}'

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

cat /etc/passwd |sort -t: -n -k3 |tail -n1

<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}' ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值