每天一个Linux命令-awk

一、命令概述

awk是文本和数据进行处理的编程语言,取了其三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的姓的第一个字符。

二、命令语法

awk [命令选项] [脚本] [文件名]

1.常用命令选项

  • -F fs field separator的缩写,(输入)字段分隔符
  • -v var=value 用于自定义变量
  • -f file 脚本文件

2.脚本语法

'BEGIN{} [模式]{[操作]} END{}'
  • 脚本通常写在单引号中间
  • 脚本的处理流程为:从输入流读取内容之前,先执行BEGIN语句块,然后逐行读取并按模式语句块处理,所有行读取并处理完成之后,最后执行END语句块
  • 三个语句块可以任选其一、其二、其三,模式和操作也可以只存在其一

3.常用内置变量

  • $0 完整的一条记录
  • $n 本条记录中的第n个字段
  • NR number of records 已经读入的行数
  • NF number of fileds 当前行拥有的字段数
  • FS field separator 输入字段分隔符,默认为所有空格
  • RS records separator 输入记录分隔符,默认是一个换行
  • OFS output filed separator 输出字段分隔符,默认与输入字段分隔符一致
  • ORS output record separator 输出记录分隔符,默认是一个换行

4.常用内置函数

  • index(a,b) 返回b在a中的起始位置,字符串要用双引号
  • length(a) 返回a的长度

三、常用操作

testfile.txt

xm 11 12 13
xmm 31 32 33
xh 22 23 24

1.操作

  • 获取文件指定列
# 打印第一列
awk '{print $0}' testfile.txt
# 打印第二列
awk '{print $1}' testfile.txt
# 打印第三列
awk '{print $2}' testfile.txt
# 打印最后一列
awk '{print $NF}' testfile.txt

在这里插入图片描述

  • 修改分隔符
# 无效修改输出分隔符
awk '{OFS="#";print $0}' testfile.txt
# 有效修改输出分隔符
awk '{OFS="#";$1=$1;print $0}' testfile.txt
awk -v OFS=# '{$1=$1;print $0}' testfile.txt
awk '{OFS="#";print $1,$2,$3,$4}' testfile.txt
# 修改输入分隔符为#
awk '{OFS="#";print $1,$2,$3,$4}' testfile.txt | awk -F '#' '{print $1}'

在这里插入图片描述

  • printf控制输出格式
# 格式化打印输出
awk '{printf "%-3s %-2d %-2d %-2d\n",$1,$2,$3,$4}' testfile.txt

在这里插入图片描述

  • 流程控制
# 打印第三行最后一个字段,其他行打印“不是第三行”
awk '{if(NR==3){print $NF} else {print "不是第三行"} }' testfile.txt

在这里插入图片描述

2.模式+操作

# 打印第二行的第一个字段
awk 'NR==2 {print $1}' testfile.txt
# 打印第1-3行的第一个字段
awk 'NR==1,NR==3 {print $1}' testfile.txt
# 打印第1行和第三行的第一个字段
awk 'NR==1||NR==3 {print $1}' testfile.txt
# 匹配以xm开头的行
awk '/xm/ {print $0}' testfile.txt
# 以xm开头的记录,第二个字段中,1所在的位置的索引
awk '/xm/{print index($2,1)}' testfile.txt
# 以xm开头的记录的长度
awk '/xm/{print length($0)}' testfile.txt

在这里插入图片描述

3.BEGIN+模式+操作

# 设置变量
awk 'BEGIN{OFS="#"} {$1=$1;print $0}' testfile.txt
# 添加标题
awk 'BEGIN{printf "%2s %2s %2s %2s\n","姓名","语文","数学","英语"} {printf "%-4s %-4d %-4d %-4d\n",$1,$2,$3,$3}' testfile.txt

在这里插入图片描述

4.BEGIN+模式+操作+END

# 最后添加一共有多少行
awk 'BEGIN{printf "%2s %2s %2s %2s\n","姓名","语文","数学","英语"} NR>1 {printf "%-4s %-4d %-4d %-4d\n",$1,$1,$3,$4} END{printf "%3s:%2d%1s\n","一共有",NR,"行" }' testfile.txt
# 找到第二行,打印最后一个字段
awk 'BEGIN{ print  "姓名" } NR==2{ print $1 } END{print "找到第2行啦"}' testfile.txt

在这里插入图片描述

5.脚本文件

awk脚本

BEGIN{
  print "--------start awk--------"
  printf "%2s %2s %2s %2s %2s\n","姓名","语文","数学","英语","总分"
}

{
  total=o
  i=2
  while(i<=NF){
    total+=$i
    i++
  }
  printf "%-4s %-4d %-4d %-4d %-4d\n",$1,$2,$3,$4,total
  if(total>max){
    max=total
  }
}

END{
  printf "最高分为:%-4d\n",max
}

脚本执行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ternurafl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值