awk的基础用法

awk

awk语句由模式(pattern)和动作(action)组成。

awk 支持 ”?” 和 “+” 两个扩展元字符,而grep和sed并不支持。

 

awk的三种用法

    awk   -F’分隔符’  “awk程序段”   inputfile

    awk   -f  awk脚本   inputfile

    ./awk   脚本文件  inputfile

 

cp  /etc/passwd  ./input

 

1.awk第1种调用方法(打印空行)

    awk  '/^$/  {print "this is a blankline."}'   input

 

2.第2种调用awk方法

    [root@attzz test]#cat  src.awk

/^$/{print"this is a blank line."}

[root@attzz test]# awk -f src.awk input

 

3.第3种调用awk方法

    [root@attzz test]# cat  src.awk

#!/bin/awk-f

/^$/{print"this is a blank line."}

[root@attzz test]#  chmod u+x src.awk;  ./src.awk input

 

awk     默认以空格为分割符

awk  -F ‘\t’   发tab键为分割符

1awk  -FS=”\t”   以一个tab键为分割符

2awk  -FS=”\t+”   以一个或多个tab键为分割符

ifelz\t\tzz     1解析为 ifelz、空域、zz

            2解析为 ifelz和zz,两个域

$1表示第一个域    $0表示所有的域

 

awk关系运算符及其意义

<   >   <=  >=  ==  !=  ~   !~      ~匹配正则表达式

 

4.例使用正则表达式~,打印出/etc/passwd文件中第一个域为’root’的记录

    [root@attzz test]# awk 'FS=":" $1~/root/' input    == awk 'BEGIN {FS=":"} $1~/root/'input

root:x:0:0:root:/root:/bin/bash

    awk 'FS=":"$0~/root/' input        匹配所有包含’root’的行

    awk 'FS=":"$0!~/nologin/' input

   

awk中的if语句

    awk 'FS=":"{if ($3>$4) print $0}' input

 

grep  ^[^$] input|  awk 'FS=":" {print $3}'|  sort –n     grep  ^[^$] inputg不过滤空行

awk 'FS=":"  { if ($3<10)print $3 }'

 

4.awk布尔运算符及其意义

||      &&      !

 

==精确     ~模糊

awk  'FS=":" {if  ($3==9 && $4==0)  print $0}' input   精确匹配

awk  'FS=":" {if  ($3~9 && $4~0)  print $0}' input         模糊匹配

 

awk算术运算及其意义

+       -       *       /       %       ^或**       ++x     x++

 

[root@attzz test]# awk'/^$/ {print ++x}' input

1

2

3

[root@attzz test]# awk'/^$/ {print x+=1}' input

1

2

3

[root@attzz test]# awk '/^$/ {print x++}' input

0

1

2

[root@attzz test]# awk '/^$/ {print x++1}' input

01

11

21

 

5.系统变量

ARGV

命令行参数数组

ENVIRON

环境变量数组

FILENAME

当前输入文件名

FNR

当前文件中的记录号

FS

字段分隔符

IGNORECASE

忽略正则表达式和串的大小写

NF

当前记录中的字段数

NR

至今读取的记录数

OFMT

数的输出格式,缺省为"%.6g"

OFS

输出字段分隔符

ORS

输出记录分隔符

RS

输入记录分隔符

RSTART

由match() 匹配的第一个字符的索引

RLENGTH

由match() 匹配的串的长度

SUBSEP

下标分隔符,缺省为”\34”

 

[root@attzz test]# tail -3 input |awk  'FS=":"  { print NF,NR,$0}'     NF:符串段数

8 1 oprofile:x:16:16:Special user account to be used byOProfile:/home/oprofile:/sbin/nologin

7 2 jack:x:500:500::/home/jack:/bin/bash

7 3 tom:x:501:501::/home/tom:/bin/bash

[root@attzz test]#

 

awk  'BEGIN{FS=":"}  {print NF,NR,$0}  END  {print FILENAME}'  input

 

6.printf修饰符及基意义

    -           左对齐

    width           域的步长

    .prec           小数点右边的位数

 printf格式符及基意义

    %c      ASCII字符                   %o      八进制数

    %d      整型数                  %s      字符串

    %e      浮点数,科学记数法          %x      十六进制数

    %f      浮点数

 

awk 'FS=":"  {  printf  ("%d\t%s\n",$3,$6)  }'        “printf“

[root@attzz test]# awk 'BEGIN{printf ("%c\t%f\n",89,99)}'     此时必须打BEGIN  

Y   99.000000

[root@attzz test]#

 

[root@attzz test]# awk  'BEGIN {FS=","} { printf("%-15s\t%s\n",$1,$3)}' file    “BEGIN“

li hao             027-2348797

zh jdu             027-7463528

ds fwk             027-2890763

ld wek             027-1987634

 

“%10.3f“   默认为右对齐

 

7.内置字符串函数

gsub(r,s,t)

在字符串t中,用字符串s替换和正则表达式r匹配的所有字符串。返回替换的个数。如果没有给出t,缺省为$0

index(s,t)

返回s 中字符串t 的位置,不出现时为0

length(s)

返回字符串s 的长度,当没有给出s时,返回$0的长度

match(s,r)

返回r 在s 中出现的位置,不出现时为0。设置RSTARTRLENGTH的值

split(s,a,r)

利用r 把s 分裂成数组a,返回元素的个数。如果没有给出r,则使用FS。数组分割和字段分割采用同样的方式

sprintf(fmt,expr_list)

根据格式串fmt,返回经过格式编排的expr_list

sub(r,s,t)

在字符串t中用s替换正则表达式t的首次匹配。如果成功则返回1,否则返回0。如果没有给出t,默认为$0

substr(s,p,n)

返回字符串s中从位置p开始最大长度为n的字串。如果没有给出n,返回从p开始剩余的字符串

tolower(s)

将串s 中的大写字母改为小写,返回新串

toupper(s)

将串s 中的小写字母改为大写,返回新串

 

gsub   替换

[root@attzz test]# awk ' BEGIN{ FS=":";OFS="---"} gsub(/root/,"gridsphere",$1){print $0}' input

gridsphere---x---0---0---root---/root---/bin/bash

[root@attzz test]#

 

[root@attzz test]# awk ' BEGIN {FS=":";OFS=":"} gsub(/root/,"gridsphere") {print$0}' input

gridsphere:x:0:0:gridsphere:/gridsphere:/bin/bash

operator:x:11:0:operator:/gridsphere:/sbin/nologin

 

index和length

[root@attzz test]# awk 'BEGIN{print index("gridsphere","ph")}'第2个字符在字符串出现位置

6

[root@attzz test]# awk 'BEGIN {printlength("gridsphere")}'     返回字符串的长度

10

 

match(s,t),t可以为正则

[root@attzz test]# awk 'BEGIN{print match("gridsphere",/D/)}' 返回字符所在位置

0

[root@attzz test]# awk 'BEGIN{IGNORECASE=1;print match("gridsphere",/D/)}'

4

IGNORECASE=1      忽略大小写(awk严格区分大小写)

 

sub函数

[root@attzz test]# awk 'BEGIN {FS=","} { $1~/li/sub(/10/,"99",$0);print $0}' file

li hao,fsd,027-2379799,45,67,78,35

zh jdu,dks,027-7499528,67,25,98,76

ds fwk,sfd,027-2890763,89,56,72,18

ld wek,fsd,027-1989910,87,34,13,65

 

substr函数

[root@attzz test]# awk 'BEGIN{str="multiprocessor programming"; print substr(str,6)}'

processor programming

[root@attzz test]# awk 'BEGIN{str="multiprocessor programming"; print substr(str,6,9)}'

processor

[root@attzz test]#

附算术运算符

x^y x的y次幂 
x**y
同上 
x%y
计算x/y的余数(求模) 
x+y x
加y 
x-y x
减y 
x*y x
乘y 
x/y x
除y 
-y
负y(y的开关符号);也称一目减 
++y y
加1后使用y(前置加) 
y++
使用y值后加1(后缀加) 
–y y减1后使用y(前置减) 
y
– 使用后y减1(后缀减) 
x=y
将y的值赋给x 
x+=y
将x+y的值赋给x 
x-=y
将x-y的值赋给x 
x*=y
将x*y的值赋给x 
x/=y
将x/y的值赋给x x%=y 将x%y的值赋给x 
x^=y
将x^y的值赋给x 
x**=y
将x**y的值赋给x

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值