Linux——awk命令

基本语法

awk [opion] 'awk_script' input_file1 [input_file2 ...]

常用option:

  • -F fs 使用fs作为输入记录的字段分隔符,默认为环境变量IFS的值
  • -f filename 从文件filename中读取awk_script
  • -v var=value 为awk_script设置变量

运行方式:

  1. 把awk的脚本命令直接放在命令中
  2. 把awk的所有的脚本命令放在一个脚本文件中,然后用-f选项来指定要运行的脚本命令文件
  3. 将awk_script放入脚本文件并以 #!/bin/awk -f 作为首行,给予该脚本可执行权限,然后在shell下通过键入该脚本的脚本名调用之

awk_script

awk脚本可以由一条或多条awk_cmd组成,对于多个awk_cmd,一个awk_cmd完成后,应该另起一行,以便进行隔。
awk_cmd由两部分组成: awk_pattern { actions }
另外,在awk命令中直接使用awk_script时,awk_script也可以被分成多行书写,但必须确保整个awk_script被单引号括起来。

awk命令的一般形式:

awk 'BEGIN{ actions }
awk_pattern1{ actions }
......
awk_patternN{ actions }
END{ actions }'
inputfile

#其中 BEGIN { actions } 和 END { actions } 是可选的。

内建变量

变量 描述
$n 当前记录的第n个字段,字段间由FS分隔
$0 完整的输入记录
ARGC 命令行参数的数目
ARGIND 命令行中当前文件的位置(从0开始算)
ARGV 包含命令行参数的数组
CONVFMT 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组
ERRNO 最后一个系统错误的描述
FIELDWIDTHS 字段宽度列表(用空格键分隔)
FILENAME 当前文件名
FNR 各文件分别计数的行号
FS 字段分隔符(默认是任何空格)
IGNORECASE 如果为真,则进行忽略大小写的匹配
NF 一条记录的字段的数目
NR 已经读出的记录数,就是行号,从1开始
OFMT 数字的输出格式(默认值是%.6g)
OFS 输出字段分隔符,默认值与输入字段分隔符一致。
ORS 输出记录分隔符(默认值是一个换行符)
RLENGTH 由match函数所匹配的字符串的长度
RS 记录分隔符(默认是一个换行符)
RSTART 由match函数所匹配的字符串的第一个位置
SUBSEP 数组下标分隔符(默认值是/034)

运行过程

  1. 如果BEGIN 区块存在,awk执行它指定的actions。
  2. awk从输入文件中读取一行,称为一条输入记录。(如果输入文件省略,将从标准输入读取)
  3. awk将读入的记录分割成字段,将第1个字段放入变量$1中,第2个字段放入$2,以此类推。$0表示整条记录。字段分隔符使用shell环境变量IFS或由参数指定。
  4. 把当前输入记录依次与每一个awk_cmd中awk_pattern比较,看是否匹配,如果相匹配,就执行对应的actions。如果不匹配,就跳过对应的actions,直到比较完所有的awk_cmd。
  5. 当一条输入记录比较了所有的awk_cmd后,awk读取输入的下一行,继续重复步骤③和④,这个过程一直持续,直到awk读取到文件尾。
  6. 当awk读完所有的输入行后,如果存在END,就执行相应的actions。
1)input_file可以是多于一个文件的文件列表,awk将按顺序处理列表中的每个文件。
2)一条awk_cmd的awk_pattern可以省略,省略时不对输入记录进行匹配比较就执行相应的actions。一条awk_cmd的actions 也可以省略,省略时默认的动作为打印当前输入记录,即{print $0} 。一条awk_cmd中的awk_pattern和actions不能同时省略。
3) BEGIN区块和END区块别位于awk_script的开头和结尾。awk_script中只有END区块或者只有BEGIN区块是被允许的。如果awk_script中只有BEGIN { actions } ,awk不会读取input_file。
4) awk把输入文件的数据读入内存,然后操作内存中的输入数据副本,awk不会修改输入文件的内容。
5) awk的总是输出到标准输出,如果想让awk输出到文件,可以使用重定向。

awk_pattern

awk_pattern模式部分决定actions动作部分何时触发及触发actions。
awk_pattern可以是以下几种类型:

一、 正则表达式用作awk_pattern: /regexp/

注意,正则表达式regexp必须被/包起来
awk中正则表达式匹配操作中经常用到的字符:

  • \ ^ $ . [] | () * //:通用的regexp元字符
  • +: 匹配其前的单个字符一次以上,是awk自有的元字符,不适用于grep或sed等
  • ? : 匹配其前的单个字符1次或0次,是awk自有的元字符,不适用于grep或sed等

二、布尔表达式用作awk_pattern,表达式成立时,触发相应的actions执行

① 表达式中可以使用变量(如字段变量$1,$2等)和/regexp/

② 布尔表达式中的操作符:

  • 关系操作符: < > <= >= == !=
  • 匹配操作符: value ~ /regexp/ 如果value匹配/regexp/,则返回真
  • value !~ /regexp/ 如果value不匹配/regexp/,则返回真

&&(与) 和 ||(或) 可以连接两个/regexp/或者布尔表达式,构成混合表达式。!(非) 可以用于布尔表达式或者/regexp/之前。

④ 其它表达式用作awk_script,如赋值表达式等

取行

NR==1 取出某一行
NR>=1 && NR<=5 取出1到5行 范围
/pattern/ 正则
/pattern1/,/pattern2/ 正则 范围
符号 > < >= <= == !=

在这里插入图片描述

取列

  • -F 指定分隔符,指定每一列结束标记(默认是空格、连续空格、tab)
  • $数字 取出某一列
  • $0 表示一整行(所有的列)
  • $NF 表示最后一列

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

同时取行取列

取/etc/passwd的第一行第六列

在这里插入图片描述
在这里插入图片描述

  • ~包含
  • !~ 不包含

在这里插入图片描述

特殊模式BEGIN{}和END{}

模式 含义 应用场景
BEGIN{} 在awk读取之前执行 1. 进行简单统计,计算,不涉及读取文件
2. 用来处理文件之前,添加表头
3. 定义awk变量(很少用,一般用-v)
END{} 在awk读取文件之后执行 1. 进行统计
2. awk使用数组,用来输出数组结果

统计/etc/services 里面有多少个空行

在这里插入图片描述
计算1到100的和

在这里插入图片描述

aek数组

形式 array[0]=a array[1]=b
使用 print array[0]
批量输出数组内容 for(i in array)
print array[i]
i为数组下标,从0开始
array[]++ 数组分类计数

在这里插入图片描述

处理以下文件内容,将域名取出并根据域名进行计数排序处理:
在这里插入图片描述

在这里插入图片描述

for循环

for(i=1; i<=10;i++)
print i
可以用来循环每个字段

在这里插入图片描述

if判断

单分支 if(条件)
print “obj”
多分支 if(条件)
print "obj1"
else
print “obj2”

统计磁盘空间使用率
在这里插入图片描述

统计下面字段中,单词中字符小于6的单词,显示出来

在这里插入图片描述

Guess you like

Origin blog.csdn.net/cold___play/article/details/121057463