awk基础学习

awk 处理流的形式也是一行一行的,读取一行然后按照指定的模式进行处理,处理完成后默认输出到终端。

awk [-F fild:separator] 'command' filename
[-F fild-separator ]是可选的,awk默认以空格作为缺省的分隔符号,在脚本中可以通过FS=“X”来设定,X是任意分割符。
表达式匹配的特殊字符
\ ^ $ . [ ] | ( ) * + ?

awk 内置变量


ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk 浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行- F 选项
NF 浏览记录的域个数,用$NF可以表示最后一个域
NR 已读的记录数
OFS 输出域分隔符,OFS="#",输出分隔符就是#
ORS 输出记录分隔符
RS 控制记录分隔符

awk的正则表达式在//里面,模式匹配的sed差不多
找到所有含有root的行,打印第一个域
awk -F : '/root/{print $1}' /etc/passwd

找到行首是root的行,打印第一个域
awk -F : '/^root/{print $1}' /etc/passwd

用~来进行字段匹配,第一个域是root的行
awk -F : '$1~/root/' /etc/passwd
找到第一个域不是root的行
awk -F : '$1!~/root/' /etc/passwd

用print的时候,不同参数之间用逗号作分割符号,则输出以空格作为分割符号;若以空格作为参数分割符号,输出被不存在分隔符号
echo "etc/fire/test.c" | awk -F / '{print $1,$2,$3}'  ==>> home fire test.c
echo "etc/fire/test.c" | awk -F / '{print $1 $2 $3}'  ==>> homefiretest.c

开始结束都加hello,中间打印第一个域
awk -F: 'BEGIN{print "......hello.......\n"} {print $1} END{print ".........hello........\n"}' /etc/passwd

使用if语句进行匹配


找出第一个域是root的行,注意不能写成=,如果写出=,那么就把所有行的第一个域都赋值为root,所有行都匹配
awk -F: '{if($1=="root")} print $0' /etc/passwd

找出第三个域值是32的行
awk -F: '{if($3=="32") print $0}' /etc/passwd

不等于
找出第一个域不是root的行
awk -F: '{if($1!="root") print $0}' /etc/passwd


找出第一个域是root并且第五个域也是root的行
awk -F: '{if($1=="root"&&$5=="root") print $0}' /etc/passwd

NF:每行记录域的总个数
awk -F: '{print NF}' /etc/passwd

NR:已读记录域的数目
awk -F: '{print NR}' /etc/passwd

每行首加总域数和已读域数
awk -F: '{print NF,NR,$0}' /etc/passwd

在保证一行的域大于0,一个域是root的情况下,打印所在行号和行
awk -F: '{if(NF>0 && $1=="root") print NR,$0}' /etc/passwd

显示当前目录的名字,用$NF来显示最后一个域
pwd | awk -F / '{print $NF}'
显示一个目录的文件名字
echo "/home/firefoxbug/test.c" | awk -F / '{print $NF}'

找到第一个域是root行,并把第三个域加3,第四个域加4
可以用{}对匹配的行进行操作,若要执行多条语句,用;分割
awk -F: '{if($1=="root"){$3=$3+3;$4=$4+4;print $0}}' /etc/passwd

在每行最后添加一个域,域值是第三个域值和第四个域值的和
awk -F: '{$(NF+1)=$3+$4;print $(NF)}' /etc/passwd

统计当前目录下所有文件长度,首先排除目录,然后求得ls -l 的第五个域总和
ls -l | grep '^[^d]' | awk '{print $5;total=total+$5} END{print total}'

awk的printf函数,printf函数用法和C语言类似
awk 'BEGIN{printf ("%s\n","hello")}'

awk命令中传递参数
awk '模式' 变量=值 filename
比如查看 df -k 第四个域大于TARGET的项,其中TARGET是用户指定的
df -k | awk '{ if($4>TARGET) {printf ("%s : %d\n",$6,$4) } }' TARGET=650000

查看/etc/passwd下第一个域是USER的行,其中USER由用户指定
awk -F : '{if ($1==USER) {printf ("HAVE %s\n",$1) }}' USER=root /etc/passwd

标签:Linux, Shell

评论已关闭