每天一个Linux命令awk

2023年 8月 13日 11.1k 0

一、命令概述

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

image.png

  • 修改分隔符
# 无效修改输出分隔符
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}'

每天一个Linux命令-awk-1

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

image.png

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

image.png

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

image.png

3.BEGIN+模式+操作

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

每天一个Linux命令-awk-2

4.BEGIN+模式+操作+END

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

image.png

5.脚本文件

awk脚本

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

{
  total=o
  i=2
  while(imax){
    max=total
  }
}

END{
  printf "最高分为:%-4dn",max
}

image.png

相关文章

服务器端口转发,带你了解服务器端口转发
服务器开放端口,服务器开放端口的步骤
产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
如何使用 WinGet 下载 Microsoft Store 应用
百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

发布评论