10个linux awk文本处理经典案例,【linux编程】文本处理-awk

be0822daf35b

awk介绍

awk是Linux及Unix操作系统中非常优秀的数据及文本处理工具,它是一种编程语言。

特点:

功能强大

完整语法

进程控制

简短高效

作用

自动化运维

文本处理

1.awk行处理方式与格式

awk内嵌参数应用

awk内嵌程序应用

awk处理方式

awk一次处理一行内容

awk对每行可以切片处理

awk格式

命令行格式

awk 'command' file(s)

脚本格式

awk -f awk-script-file file(s)

基本格式

awk 'command' file(s)

command:pattern{awk操作命令}

pattern:正则表达式;逻辑判断式

command1:pattern{awk操作命令}

操作命令:

内置函数:print() printf() getline

控制指令:if() {...}else{...} ; while() (...);

awk内置变量1

$0 : 表示整个当前行

$1: 每行第一个字段

$2:每行第二个字段

$3:每行第三个字段(列)

awk内置参数:分隔符

option: -F filed-separator(默认为空格)

例如:$awk -F ':' '{print $3}'/etc/passwd

$awk -F ':' '{print $1,$3}' /et/passwd

或者

$awk -F ':' '{print $1 $3}' /et/passwd 打印空格

$awk -F ':' '{print $1 ‘\t' $3}' /et/passwd 打印制表符

打印第一列,第三列

$awk -F ':' '{print "User:"$1 "\t" "UID:"$3}' /et/passwd 增加打印字符

awk内置变量2

NR:每行的记录号

NF:字段数量变量

FILENAME:正在处理的文件名

例如

awk -F ‘:’ {print NR,NF}' passwd

打印行号,字段总数

awk -F ‘:’ {print FILENAME}' passwd

打印文件名

显示/etc/passwd每行的行号,每行的列数,对应行的用户名(print printf)

使用print的方法

awk -F ':' '{print "Line:"NR,"Col:NF,"User:"$1}' passwd

使用printf的方法

awk -F ':' '{printf("Line:%s Col:%s User:%s\n",NR,NF,$1)}' passwd

格式大小调整,整齐

awk -F ':' '{printf("Line:%s Col:%3s User:%s\n",NR,NF,$1)}' passwd

案例二:

显示/etc/passwd中用户ID大于100的行号和用户名(if...else...)

awk -F ':' '{if($3>100) printf("line:%s col:%s user:%s\n",NR,NF,$1)}' passwd

案例三

在服务器log中找出Error的方法日期(找到日志文件的Error行,提取第一列)

awk '/Error/{print $1}' fresh.log

command:pattern{awk操作命令}

pattern:正则表达式;逻辑判断式

awk 逻辑

,!: 匹配正则表达式

==,~=,: 判断逻辑表达式

例如

awk -F ':' '$1~/^m.*/{print $1}' passwd 匹配第一位m的字段,并打印第一个字段

如man

mainl

mooc

awk -F ':' '$1!~/^m.*/{print $1}' passwd 取反,非m开头的字段

awk -F ':' '$3>100{print $1,$3}' passwd 找到第三列大于100的行,打印第一列,第三列

awk -F ':' '$3==100{print $1,$3}' passwd 等于100的行

awk -F ':' '$3!=100{print $1,$3}' passwd 不等于100的行

awk的扩展格式

awk[options] 'command' file(s)

command2扩展:

BEGIN{print "start"}pattern{commands} END{print "end"} 在基本格式前加入

读入行操作前执行,循环执行命令,所有命令运行后,才执行 BEGIN和END不参与循环

案例:

制表显示/etc/passwd每行的行号,每行的列数,对应行的用户名

awk -F ':' ’BEGIN{print "Line Col User"}‘{print NR,NF,$1}END{print "--------------"FILENAME"--------"}' passwd

案例1

统计当前文件夹下的文件/文件夹占用的大小

ls -l | awk 'BEGIN{size=0}{size+=$5}END{print "size is"size}'

案例2

统计显示/etc/passwd的账户总人数

awk -F ':' 'BEGIN{count=0}$1!~/^$/{count++}END{print "count = "count}' /etc/passwd 匹配第一列 去除空行

统计显示UID大于100的用户名

判断,按次数追加第一列的nam,遍历打印name

awk -F ':' 'BEGIN'{count=0}{if ($3>100) name[count++]=$1}END{for (i=0;i

案例3

统计netstat -anp 状态下为LISTEN和CONNECTED的连接数量

netstat -anp |awk '$6~/CONNECTED|LISTTEN/{sum[$6]++}END{for (i in sum)print i,sum[i]}'

awd vs sed比较

都是处理文本

awk侧重于复杂逻辑处理

sed侧重于正则处理

awk和sed共同使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值