linux命令学习-awk命令

1. 基本概念与语法

awk 是一种编程语言和命令行工具,主要用于文本处理。它处理输入流或文件中的每一行,并根据指定的模式和操作进行处理。

  1. 与sed一样, 均是一行一行的读取、处理 。
  2. sed作用于一整行的处理, 而awk将一行分成数个字段来处理 。

1.1 基本语法

awk [选项] [选项值] 'pattern{action}' file

常用的选项主要分为:

  • -F fs:指定字段分隔符 fs(默认是空白字符),可以指定多个分隔符,比如 -F ‘[;,]’。
  • -v var=value:为 awk 脚本中的变量赋值。
    pattern:匹配文件中行的模式,可以是正则表达式、关系表达式、或组合条件。
  • 正则表达式比如:[bash$]以bash结尾的行;如果模式是正则表达式要用/定界符
  • 关系表达是:>,<,>=等等
    • 数学运算:+,-,*,/, %,++,- -
    • 逻辑关系符:&&, ||, !
    • 比较操作符:>,<,>=,!=,<=,== ~ !~
    • 文本数据表达式:== (精确匹配)
    • ~波浪号表示匹配后面的模式
  • 组合条件就是上面两种的组合或者单种的多重条件
    action:在匹配的行上执行的操作。可以是打印、计算、修改字段等。
  • awk的动作一定要用花括号括起
  • 多个动作之间用;号分开
    特殊的变量:
  • $0:当前行的内容。
  • $1, $2, …, $n:当前行的第 n 个字段。
  • NR:当前行号(Number of Record)。
  • NF:当前行的字段数(Number of Fields)。
  • FS:当前的分隔符,默认是空白字符
  • OFS:当前的输出分隔符,默认是空白字符

1.2 awk完整语法解析

awk 'BEGIN{commands}pattern{commands}END{commands}' file;
#需要注意的是,commands不是shell里的命令而是awk的子命令
#假设有文件如下comma_separated.csv:
Name,Age,Occupation
Alice,30,Engineer
Bob,25,Designer
Charlie,35,Teacher
David,28,Developer
Eve,40,Manager
Frank,22,Intern
Grace,33,Scientist
Heidi,29,Analyst
Ivan,34,Consultant
Judy,31,Architect
Mallory,27,Technician
Niaj,26,Researcher
awk -F , 'BEGIN{i=0;print "############"}$2 <= 29 && NR > 1{print $1,$3;i++}END{print "@@@@@@@@@@@@\n",i}' comma_separated.csv

输出结果

############
Bob Designer
David Developer
Frank Intern
Heidi Analyst
Mallory Technician
Niaj Researcher
@@@@@@@@@@@@
 6

awk命令的执行过程【-F , 说明按照,进行列的分割】:

  1. 先执行BEGIN{commands}语句块中的语句
    a. 第一个命令:定义一个变量i
    b. 多个命令用;分隔开
    c. 第二个命令输出############
  2. 开始读取输入的内容,一般是文件或者标准输入,并且从第一行开始处理,根据分隔符,分成若干列分析处理,如果满足pattern,则执行动作,否则接着读取下一行。
    a. 校验pattern的条件:$2也就是第二列,对应文本中的年龄,$2<=29也就是筛选出年龄小于29的;
    b. NR代表行号,因为第一行是标题,所以去掉第一行就是NR>1
    c. {action}就是输出第一列和第三列,也就是输出姓名和职业
    d. i++,也就是统计符合这个条件的行数
  3. 执行END{commands}语句块中的语句
    a. 输出@@@@@@@@@@@@和满足pattern的个数。
  4. 执行完毕输出结果。

2 命令的使用练习

文件和命令都给出,运行结果文字有描述,可以自行测试验证。

2.1 文件准备

#假设有文件如下comma_separated.csv:
Name,Age,Occupation
Alice,30,Engineer
Bob,25,Designer
Charlie,35,Teacher
David,28,Developer
Eve,40,Manager
Frank,22,Intern
Grace,33,Scientist
Heidi,29,Analyst
Ivan,34,Consultant
Judy,31,Architect
Mallory,27,Technician
Niaj,26,Researcher

2.2 基本文本打印

awk '{print $0}' comma_separated.csv

2.3 字符分隔符

awk -F , '{OFS="----";print $1, $2, $3}' comma_separated.csv

#OFS是设置输出时候的分隔符号,该命令输出
Name----Age----Occupation
Alice----30----Engineer
Bob----25----Designer
Charlie----35----Teacher
David----28----Developer
Eve----40----Manager
Frank----22----Intern
Grace----33----Scientist
Heidi----29----Analyst
Ivan----34----Consultant
Judy----31----Architect
Mallory----27----Technician
Niaj----26----Researcher

2.4 模式添加条件判断

awk -F , '$2 >= 29 {print $2}' comma_separated.csv #年龄大于等于29岁的

awk -F , 'length($1) > 4 {print $1}' comma_separated.csv #姓名的字符串长度大于4的姓名

2.5 内置变量的使用

awk '{print NR, $0}' comma_separated.csv #输出行号和每一行的内容

awk '{print NF, $0}' comma_separated.csv #输出每一行的列数和内容

2.6 ~的使用,模式匹配

awk -F , '$1 ~ /y/{print $1}' comma_separated.csv #输出姓名中带有字母y的

awk '/y/' comma_separated.csv  #只有模式,没动作的会将每一行有y的输出

2.7 每一行的字段计数

awk -F , '{print NF}' comma_separated.csv #按照 , 进行分列后的段数

awk '{print NF}' comma_separated.csv #默认分列【空格或者tab】的段数

2.8 算术运算

awk -F , 'BEGIN{sum=0}{sum += $2}END{print sum}' comma_separated.csv #计算所有年龄之和

#如果是计算某一行的所有之和,格式如下,如果想判断字符串和数组,可以搜索对应的内置函数
awk '{sum = 0; for (i = 1; i <= NF; i++) sum += $i; print sum}' filename.txt  

2.9 字符串操作

awk -F , '{print length($1)}' comma_separated.csv #输出每一行姓名这个字符串的长度

2.10 内置函数toupper和tolower

awk -F , '{print toupper($1)}' comma_separated.csv #将姓名转换为大写

2.11 数组和计数

awk -F , '{count[$1]++}END{for (num in count) print num, count[num]}' comma_separated.csv
#统计是否存在同名的人,并且将同一个名字的个数打印处理。可以过滤掉为1的,也就是没有重名的

awk -F , '{count[$1]++}END{for (num in count) if (count[num] > 1) print num, count[num]}' comma_separated.csv

2.12 正则表达式匹配

awk '$2 ~ /[0-9]/' filename.txt  #输出第二列中存在数字的

awk '$2 !~ /[0-9]/' filename.txt #输出第二列中不包含数字的行

2.13 按列排序打印

awk -F , '{OFS=","; print $2,$0}' comma_separated.csv | sort -n | awk -F , '{print $3,$2,$4}'
#sort -n 就是按照数字大小排序, sort也可以指定列排序,通过-k n指定第n列,使用-t ,指定分隔符

2.14 字符串替换

awk -F , '$1=="Bob"{$1="Baby"}{print}' comma_separated.csv

更多详情参考链接:https://blog.csdn.net/qq_18312025/article/details/78247101

  • 20
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SAO&asuna

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

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

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

打赏作者

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

抵扣说明:

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

余额充值