awk 基本用法
基本用法:
- awk [options] program var=value file
- awk [options] -f programfile var=value file
- awk [options] BEGIN{ action; } pattern{ action; } END{ action; } file ...
awk 程序通常由: BEGIN 语句块能够使用模式匹配的通用语句块 END 语句块, 共 3 部 分组成 program 通常是被单引号或双引号中
选项: -F 指明输入时用到的字段分隔符 -v var=value: 自定义变量
awk 语言
基本格式: awk [options] program file ?
program:pattern{action statements;..} ?
pattern 和 action:
? pattern 部分决定动作语句何时触发及触发事件 BEGIN,END
? action statements 对数据进行处理, 放在 {} 内指明 print, printf
分割符域和记录
? awk 执行时, 由分隔符分隔的字段 (域) 标记 $1,$2..$n 称为 域标识 $0 为所有域,
注意: 和 shell 中变量 $ 符含义不同 ? 文件的每一行称为记录 ? 省略 action, 则默认执行 print $0 的操作
? 第一步: 执行 BEGIN{action; }语句块中的语句
? 第二步: 从文件或标准输入 (stdin) 读取一行, 然后执行 pattern{ action; }语句块, 它逐行扫描文件, 从第一行到最后一 行重复这个过程, 直到文件全部被读取完毕
? 第三步: 当读至输入流末尾时, 执行 END{action;}语句块
? BEGIN 语句块在 awk 开始从输入流中读取行之前被执行, 这是一个 可选的语句块, 比如变量初始化打印输出表格的表头等语句通常 可以写在 BEGIN 语句块中
? END 语句块在 awk 从输入流中读取完所有的行之后即被执行, 比如 打印所有行的分析结果这类信息汇总都是在 END 语句块中完成, 它 也是一个可选语句块
? pattern 语句块中的通用命令是最重要的部分, 也是可选的如果没 有提供 pattern 语句块, 则默认执行{ print }, 即打印每一个读取到的 行, awk 读取的每一行都会执行该语句块
awk 变量
? 变量: 内置和自定义变量
? FS: 输入字段分隔符, 默认为空白字符 awk -v FS=: {print $1,FS,$3} /etc/passwd awk F: {print $1,$3,$7} /etc/passwd
? OFS: 输出字段分隔符, 默认为空白字符 awk -v FS=: -v OFS=: {print $1,$3,$7} /etc/passwd
? RS: 输入记录分隔符, 指定输入时的换行符 awk -v RS= {print } /etc/passwd
? ORS: 输出记录分隔符, 输出时用指定符号代替换行符 awk -v RS= -v ORS=###{print } /etc/passwd
? NF: 字段数量 awk -F: {print NF} /etc/fstab, 引用内置变量不用 $ awk -F: {print $(NF-1)} /etc/passwd
? NR: 记录号 awk {print NR} /etc/fstab ; awk END{print NR} /etc/fstab
?FNR: 各文件分别计数, 记录号 awk {print FNR} /etc/fstab /etc/inittab
?FILENAME: 当前文件名 awk {print FILENAME} /etc/fstab
?ARGC: 命令行参数的个数
- awk {print ARGC} /etc/fstab /etc/inittab
- awk BEGIN {print ARGC} /etc/fstab /etc/inittab
?ARGV: 数组, 保存的是命令行所给定的各参数
- awk BEGIN {print ARGV[0]} /etc/fstab /etc/inittab
- awk BEGIN {print ARGV[1]} /etc/fstab /etc/inittab
awk 自定义变量
? 自定义变量(区分字符大小写)
(1) -v var=value
(2) 在 program 中直接定义
? 示例:
- (1)awk -v test=hello gawk {print test} /etc/fstab
- (2)awk -v test=hello gawk BEGIN{print test}
- (3)awk BEGIN{test="hello,gawk";print test}
- (4)awk F:{sex=male;print $1,sex,age;age=18} /etc/passwd
- (5)cat awkscript
- (6){print script,$1,$2}
- (7)awk -F: -f awkscript script=awk /etc/passwd
awk 模式匹配
? 模式匹配符:
(1) ~: 左边是否和右边匹配包含 !~: 是否不匹配
? 示例:
- (1)awk F: $0 ~ /root/{print $1} /etc/passwd
- (2)awk $0~^root" /etc/passwd awk $0 !~ /root$etc/passwd
- (3)awk F: $3==0 /etc/passwd
来源: http://www.bubuko.com/infodetail-2530693.html