awk

1.awk语法格式

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
awk [options] 'commands' filename
awk [options] -f awk-script-file filenames
 
BEGIN行处理前动作   {}行处理      END行处理后动作
BEGIN{print 1/2}  {print "ok"} END{print "Over"}
如:
awk 'BEGIN{print 1/2} {print "ok"} END{print "Over"; print "Over2"}' /etc/passwd
 
匹配
awk 'pattern' filename
awk '/root/' /etc/passwd
 
处理动作
awk '{action}' filename
awk -F: '{print $1}' /etc/passwd
 
匹配+处理动作
awk 'pattern {action}' filename
awk 'BEGIN{FS=":"} /root/ {print $1,$3}' /etc/passwd
 
加判断语句
df | awk '/\boot/ {if ($2 < 300000) {print "1"} else {print "2"}}'

  

2. awk的工作原理

awk将文件中的每一行作为输入,awk会将每一行赋给内部变量$0,以换行符结束

awk开始进行字段分解,每个字段存储在已编号的变量中,从$1开始【默认空格分割】

awk默认字段分隔符是由内部FS变量来确定,可以使用-F修改

awk行处理时使用了print函数打印分割后的字段

awk在打印后的字段加上空格,因为$1,$3之间有一个逗号,逗号被映射至OFS内部变量中,称为输出分隔符,OFS默认为空格

awk输出后,将从文件中获取另一行,并将其存储在$0中,覆盖原来的内容,然后将新的字符串分割成字段并进行处理,该过程将持续到所有行处理完毕。

 

3.awk分隔符

复制代码
指定分隔符,一个冒号为分隔符
awk -F ":" '{print $1}' tmp

指定多个分隔符,一个冒号或一个空格为分隔符
awk -F "[: ]" '{print $2}' tmp

一个或多个冒号,空格为分隔符
awk -F "[: ]+" '{print $2}' tmp
eg 取ip
ifconfig | awk -F "[ :]+" '/\<inet\>/{print $4}'

OFS 指定输出时,逗号映射的内容,默认为空格
awk -F ":+" 'BEGIN{OFS="-----"}{print $1,$2,$3}' /etc/passwd
复制代码

 

4. awk内置变量

一行多少个元素  NF
awk '{print NF}' tmp

awk '{print $NF}' tmp

awk '{print $(NF-1)}' tmp

 

复制代码
NR 行号
awk '{print NR}' tmp

awk 'NR==1{print $0}' tmp

awk 'NR!=1{print $0}' tmp

awk 'NR>=1&&NR<=5{print $0}' tmp

FNR 也是行号,当处理多个文件时,文件分开计数
awk '{print FNR}' tmp1 tmp2
复制代码

 

5.模式匹配

复制代码
正则
~符号表示匹配,后面加正则,正则内容使用‘/’包括
awk '/^root/' tmp
awk '$0 ~ /^root/' tmp

awk ‘$1~/^root/’ tmp

比较符
awk '$1 == /bin/bash' tmp
awk '$1 < 10' tmp

条件表达式
awk '{if ($1 < 1000) {print "1"} else {print "2"}}' tmp

运算
awk '$1*1000 > 2000' tmp
awk '{print $1+100}' tmp

逻辑运算
awk '$1<100 && $2 >2000' tmp
复制代码

 

6. if

awk '{if ($1<100) {i++} else if ($2>200) {j++} else if ($3>100) {k++} else {n++}} END{print "i="i,"j="j,"k="k,"n="n}' tmp.log

 

7.while

awk 'BEGIN{i = 1; while(i<=10){print i; i++}}' tmp

 

8.for

awk -F: '{for (i = 1; i< 10; i++) {print $0}}' passwd

 

posted on   开心种树  阅读(201)  评论(0编辑  收藏  举报

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示