Linux 文本三剑客之 awk
Linux 系统中一切皆文件。
文件是个文本。可以读、可以写,如果是二进制文件,还能执行。
在使用Linux的时候,大都是要和各式各样文件打交道。熟悉文本的读取、编辑、筛选就是linux系统管理员的必备技能
文本处理工具:grep、awk、sed,本篇主要讲 awk
awk 列提取命令,虽是列提取命令,但也要一行一行的来读入。对于 awk 命令来说,只要分隔开,不管是空格还是制表符,都可以识别为一列
一般格式:awk '条件1 {动作 1}······ 条件n {动作 n} ' 文件
常用:df -h | awk '{ print $5 }' 截取df命令结果的第5列的值
注意:条件和动作由单引号包括起来,只要检测不到完整的单引号就不会执行
指定分隔符:-F 指定分隔符 ,指定为分隔符时用单引号,其它时候用双引号
cat student.txt | awk'$2 >= 80 {print $1}'
上图命令的执行过程:
1. 如果有 BEGIN 条件,则先执行 BEGIN 定义的动作。
2. 如果没有 BEGIN 条件,则读入第一行,把第一行的数据依次赋予 $0、$1、$2 等变量。其中,$0 代表此行的整体数据,$1 代表第一个字段,$2 代表第二个字段。
3. 依据条件类型判断动作是否执行。如果条件符合,则执行动作;否则读入下一行激据。如果没有条件,则每行都执行动作。
4. 读入下一行数据,重复执行社步骤。
awk流程制:
"awk'NR==2{php1 =$3}NR==3{php2=$3};totle=php1+php2;print ""总分:"" totle}' student.txt#统计PHP成绩的总分"
上面语句解释:
"NR==2{php1=$3}"(条件是NR==2,动作是php=$3) 是指如果输入数据是第二行(第一行是标题行),就把第二行的第三个字段的值赋予变量"php1"。
"NR==3{php2=$3}"同上;totle=php1+php2+php3;print"总分"totle定义变量 totle 的值是"php1+php2";最后输出"总分"关键字