awk(一)

awk 一种编程语言、文本编辑器、也是一种非交互式的编辑器

 功能:对文本数据进行汇总和处理,是一个报告的生成器,能够对数据进行排版

一、awk的语法

   awk [选项] '/模式匹配(定址)/{处理动作1;处理动作2;... ...; 处理动作n}'  文件列表
   要点:
    1)逗号分隔,print item1,item2
    2)输出的item可以是字符串,变量,数值,字段,自己的表达式
    3)省略item(对象),相当于执行print$0

1、设定输入分隔符 -F

分隔符可以是数字、字母、符号和空白
可以同时指定多个分隔符    :     /     ,
-F ""  以空为分隔符
-F :   单个符号的分隔符
-F :/  复合分隔符,多个字符组成一个分隔符
对pass.txt(取/etc/passwd文件前十行)文件以:/为分隔符,打印第一个字段,如下:
[root@bogon ~]# awk -F :/ '{print $1}' pass.txt 
root:x:0:0:root
bin:x:1:1:bin
daemon:x:2:2:daemon
adm:x:3:4:adm
lp:x:4:7:lp
sync:x:5:0:sync
shutdown:x:6:0:shutdown
halt:x:7:0:halt
mail:x:8:12:mail
operator:x:11:0:operator

2、awk输出

1)print
    打印内容的,内容可以是文件中的内容,也可以跟文件内容毫无关系
[root@bogon ~]# awk '{print "hello"}' pass.txt 
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
//打印内容和文件不相关,只是借用了pass文件的行,有多少行内容,hello就会被打印多少次
  • print要点
    a、各个输出字段之间用逗号分隔,而输出的时候默认是以空白为分隔符的
    b、print后面如果不跟字段,那么默认打印整行
    c、print输出时默认是有换行的
2)printf 可以格式化输出的,默认没有换行
    使用格式
     printf format,item1,item2,... ...,itemn
format的指示符都是以%开头的,后面跟一个字符,如:
  %s:表示是字符串
  %d:表示十进制数
  %f:表示浮点数,其实就是小数    float
  %%:表示%本身
  %x:表示十六进制数
  %o:表示八进制数
  %c:表示字符
修饰符:N(数字) 表示显示宽度                %10s   
        -      表示左对齐,默认是右对齐      %-10s
对于浮点数:
  %5.2f  : 其中5表示总的显示宽度(整数位+小数位),2表示小数位的位数
  %.2f :表示整数位全部保留,小数位保留两位
[root@bogon ~]# awk -F : '{printf "%10s%5d",$1,$3}' pass.txt  //默认printf是没有换行的
      root    0       bin    1    daemon    2       adm    3        lp    4      sync    5  shutdown    6      halt    7      mail    8  operator   11
  • printf要点
    a、与print不同的是,printf需要指定格式
    b、格式其实是用来指定后面每个条目的输出格式的
    c、printf默认不会自动打印换行符的,有需要时候手动指定”\n”
    d、默认没有输出分隔符

3、awk的操作符

1)算数运算符
-x:表示负数       +x(x):表示正数
x+y    x-y   x*y  x/y   x%y       x**y 等价于 x^y(x的y次幂)
2)关系运算符
  a、数值之间的关系运算符
>     <   >=    <=    ==   !=
    打印uid小于等于5的行
[root@bogon ~]# awk -F: '$3<=5{print $0}' pass.txt 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
awk -F: '$3<=5{print}' pass.txt  //打印uid小于等于5的行
awk -F: '$3<=5' pass.txt         //打印uid小于等于5的行

  b、字符串之间的关系运算符
    ==      !=
x ~ /y/  匹配正则   其中y可以是正则表达式
打印用户名中含有o的用户的名字
[root@bogon ~]# awk -F: '$1 ~ /o/{print $1}' pass.txt 
root
daemon
shutdown
operator
x !~ /y/  不匹配正则      
[root@bogon ~]# awk -F: '$1 !~ /o/{print $1}' pass.txt 
bin
adm
lp
sync
halt
mail
3)逻辑运算符
&& 与  || 或  ! 非

打印uid在5到8之间的用户的用户名,UID
[root@bogon ~]# awk -F: '$3>=5 && $3<=10{print $1,$3}' pass.txt 
sync 5
shutdown 6
halt 7
mail 8
打印uid大于7或者uid小于5的用户名,UID
[root@bogon ~]# awk -F: '$3>7 || $3<5{print $1,$3}' pass.txt 
root 0
bin 1
daemon 2
adm 3
lp 4
mail 8
operator 11
打印uid不大于4的用户名,UID
[root@bogon ~]# awk -F: '! ($3>4){print $1,$3}' pass.txt 
root 0
bin 1
daemon 2
adm 3
lp 4

4)赋值运算符

常见的模式
1)空模式:也就是每一行都要做处理的模式
[root@bogon ~]# awk -F: '{print $1}' pass.txt
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
2)正则表达式
a、固定定址
[root@bogon ~]# awk -F: '/^ro/{print $1}' pass.txt
root
b、范围定址
[root@bogon ~]# awk -F: '/^ro/,/^lp/{print $1}' pass.txt
root
bin
daemon
adm
lp
3)赋值运算
 -=   *=    /=   %=  ^= 
 a++ (先引用a原来的值然后再自增1)    ++a(先自增1然后再引用a的值)   
 a-- (先引用a原来的值然后再自减1)    --a(先自减1然后再引用a的值)

4、awk的变量

  种类:内置变量、自定义的变量
  1.内置变量(內建变量)
   (1)$0    表示一整行的内容

   (2)$1 ~ $100
    $1:第一列

   (3)与记录相关的变量(记录就是行)
    FS(field separator):输入字段分隔符,默认是空白
    FS=":"
    OFS(Output):输出字段分隔符
    RS(record):记录的分隔符,即行的分隔符,输入行分隔

   (4)与数据相关的变量
    NR(Number of Record):记录数,awk的处理的行的总数,NR在很多情况下可以看成行号
    FNR:行号,不会叠加
    NF(Number of Field):当前行的字段数   
    $NF:当前行的最后一个字段的值
    $(NF-1):当前行的倒数第二个字段                  
[root@bogon ~]# awk -F : '{print NR":"NF":"$NF}' pass.txt 
1:7:/bin/bash
2:7:/sbin/nologin
3:7:/sbin/nologin
4:7:/sbin/nologin
5:7:/sbin/nologin
6:7:/bin/sync
7:7:/sbin/shutdown
8:7:/sbin/halt
9:7:/sbin/nologin
10:7:/sbin/nologin
[root@bogon ~]# awk 'NR==2' pass.txt  //打印pass.txt文件的第2行
bin:x:1:1:bin:/bin:/sbin/nologin
   2.自定义变量
   命名:由字母、数字、下划线组成,不能以数字开头,不能使用关键字,最好见名知意
   变量名区分大小写
   变量可以先定义再使用,也可以直接使用
   给变量赋值

   变量名=数值
   a=5
   变量名="字符串"    //注意:此处一定有引号
   username="root"  
[root@bogon ~]# echo hello | awk '{num=2;pass="loyal";print num,pass}'
2 loyal

猜你喜欢

转载自blog.csdn.net/weini1111/article/details/72898579
awk