本帖最后由 ocean 于 2014-8-28 11:51 编辑
gawk: unix中的GNU版本,完成grep和sed的工作
支持数学运算,流程该控制内置大量的变量和函数
awk命令工作原理
与sed一样,均是一行一行的读取,处理
sed作用与一整行的处理,而awk将一行分成数个字段来处理
awk的数据字段变量
$0 表示整行文本
$1 表示文本中的第一个数据字段
$n 表示文本中的第n个数据字段
awk的用-F来指定分割符
默认的字段分割符是任意空白字符(空格或TAB)
awk的完整语法
awk 'BEGIN{commands}pattern{commands}END{commands}' file
awk命令执行的过程
执行BEGIN{commands}语句块中的语句 //处理数据前执行
从文件或stdin中读取第一行,
有无模式匹配,若无则执行{}中的语句,
若有则检查该整行与pattan是否匹配,若匹配,则执行{}中的语句,
若不匹配则不执行{}中的语句,接着读取下一行
重复这个过程,直到所有行被读取完毕
执行END{commands}语句块的语句
awk基本语法
awk -F 分割符 '/模式/{动作}' 输入文件
awk的 指令一定要用单引号括起
awk 的动作一定要用花括号括起
模式可以是正则表达式。条件表达式或者两种组合
如果模式是正则表达式要用/定界符
多个动作之间用;号风开
实例
awk '/bash/' /etc/passwd
awk -F: '/^h/{print $1, $7}' /etc/passwd
awk -F: '/^[^h]/{print $1,$7}' /etc/passwd
awk -F: '[:/]' '{print $1,$10}' /etc/passwd
以: 或者以/作为分割符显示第一列和第10列
awk命令的操作符
正则表达式和bash一致
数学运算: +,-,*, /,%,++,--
逻辑关系符:&&,||,!
比较操作符:>,<,>=,<=,!=,==,~,!~
~波浪号表示匹配后面的模式
awk -F: '$3 ~ /\<...\>/ {print $1,$3}' /etc/passwd //匹配第三个字段
awk -F: '$3>=500{print $1}' /etc/passwd
awk -F: '/^h/ && /bash/ {print $1}' /etc/passwd
awk 'BEGIN{print "line one\nline two\nline three"}' //按ctrl+d显示后面三行
awk 'BEGIN{print "start..."}{print $1}END{print "end..."}' test
awk 'BEGIN{i=0}{i++}END{print i}' /etc/passwd //显示文件的行数
awk命令的内部变量
NF :每行的字段数
NR :当前处理的行号
FS :当前的分割符,默认是空白字符
OFS :当前的输出分割符,默认空白字符
awk '{print NF}' /etc/grub.conf
awk '{print $1,$NF}' /etc/grub.conf
awk '{print NR,$0}' /etc/grub.conf
awk -F: 'BEGIN{OFS="---"}{print $1,$7}' /etc/passwd
awk 'BEGIN{FS=":"}/bash$/{print NR,$1}END{print NR}' /etc/passwd
{:5_121:}
gawk: unix中的GNU版本,完成grep和sed的工作
支持数学运算,流程该控制内置大量的变量和函数
awk命令工作原理
与sed一样,均是一行一行的读取,处理
sed作用与一整行的处理,而awk将一行分成数个字段来处理
awk的数据字段变量
$0 表示整行文本
$1 表示文本中的第一个数据字段
$n 表示文本中的第n个数据字段
awk的用-F来指定分割符
默认的字段分割符是任意空白字符(空格或TAB)
awk的完整语法
awk 'BEGIN{commands}pattern{commands}END{commands}' file
awk命令执行的过程
执行BEGIN{commands}语句块中的语句 //处理数据前执行
从文件或stdin中读取第一行,
有无模式匹配,若无则执行{}中的语句,
若有则检查该整行与pattan是否匹配,若匹配,则执行{}中的语句,
若不匹配则不执行{}中的语句,接着读取下一行
重复这个过程,直到所有行被读取完毕
执行END{commands}语句块的语句
awk基本语法
awk -F 分割符 '/模式/{动作}' 输入文件
awk的 指令一定要用单引号括起
awk 的动作一定要用花括号括起
模式可以是正则表达式。条件表达式或者两种组合
如果模式是正则表达式要用/定界符
多个动作之间用;号风开
实例
awk '/bash/' /etc/passwd
awk -F: '/^h/{print $1, $7}' /etc/passwd
awk -F: '/^[^h]/{print $1,$7}' /etc/passwd
awk -F: '[:/]' '{print $1,$10}' /etc/passwd
以: 或者以/作为分割符显示第一列和第10列
awk命令的操作符
正则表达式和bash一致
数学运算: +,-,*, /,%,++,--
逻辑关系符:&&,||,!
比较操作符:>,<,>=,<=,!=,==,~,!~
~波浪号表示匹配后面的模式
awk -F: '$3 ~ /\<...\>/ {print $1,$3}' /etc/passwd //匹配第三个字段
awk -F: '$3>=500{print $1}' /etc/passwd
awk -F: '/^h/ && /bash/ {print $1}' /etc/passwd
awk 'BEGIN{print "line one\nline two\nline three"}' //按ctrl+d显示后面三行
awk 'BEGIN{print "start..."}{print $1}END{print "end..."}' test
awk 'BEGIN{i=0}{i++}END{print i}' /etc/passwd //显示文件的行数
awk命令的内部变量
NF :每行的字段数
NR :当前处理的行号
FS :当前的分割符,默认是空白字符
OFS :当前的输出分割符,默认空白字符
awk '{print NF}' /etc/grub.conf
awk '{print $1,$NF}' /etc/grub.conf
awk '{print NR,$0}' /etc/grub.conf
awk -F: 'BEGIN{OFS="---"}{print $1,$7}' /etc/passwd
awk 'BEGIN{FS=":"}/bash$/{print NR,$1}END{print NR}' /etc/passwd
{:5_121:}
编辑回复