您的位置:首页 > 其它

awk基础学习

2012-07-02 16:02 169 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: