linux下熟悉使用awk的指令结构

linux下熟悉使用awk的指令结构

正则里分为基础正则,和扩展正则。基础正则一般的命令就是grep和sed。而awk和egrep不止可以在基础正则内使用,还可以在扩展正则内使用。之前咱们见过sed了,其实grep和sed差不多,只是基本的语法有出入。而今天和大家说的awk,其实使用方法和egrep也差不多。


awk 指令结构格式

1、确保整个awk命令用单引号括起来

2、确保命令内所有引号成对出现

3、确保用花括号括起动作语句,用圆括号括起条件语句

4、确保动作语句打印的字符串及转义字符用双引号引起来。


awk条件操作符

|操作符 |描述     |操作符    |描述     |
|------|---------|---------|---------|
|<     |小于     |==        |等于     |
|>=    |大于等于  |~        |匹配正则  |
|<=    |大于等于  |!=       |不等于    |
|>     |大于      |!~       |不匹配正则|

awk条件逻辑操作符

| 操作符   | 描述    |
|---------|---------|
| &&       | 与运算  |
| ||       | 或运算  |
| !        | 非运算  |

awk内置变量

内置变量名称   |  描述
--------------|--------------
ARGC          |命令行参数个数
ARGV          |命令行参数排列
ENVIRON       |支持队列中系统环境变量的使用
FILENAME      |awk浏览的文件名称
FNR           |浏览文件的记录数
FS            |设置输入域分隔符,等价命令行-F选项
NF            |记录浏览域的个数
NR            |已读的记录数
OFS           |输出域分隔符
ORS           |输出记录分隔符
RS            |控制记录分隔符

awk中使用操作符,基本表达式可以划分为数字型,字符串型,变量型,域,数组元素

赋值操作符 = += *= /- %= ^=
条件表达操作符 ?
并、与、非 || && !
匹配操作符 ~ !~
关系操作符 < <= == != >>
算术操作符 + - * / % ^
前缀和后缀 ++ --

awk的常用内置字符串函数

  函数         |  描述
---------------|---------------
gsub(r,s)      |在整个$0中用s替代r(全局替换)
gsub(r,s,t)    |在整个t中用s替换r(全局替换)
index(s,t)     |返回s中字符串的t的第一位置
length(s)      |返回s长度
match(s,r)     |测试s是否包含匹配r的字符串
gsplit(s,a,fs) |在fs上将s分成序列
sprint(fmt,exp)|返回经fmt格式化后的exp
sub(r,s)       |用$0中最左边最长的字符串代替s(只替换第一匹配的字符串)
sub(s,p)       |返回字符串s中从p开始的后缀部分(只替换第一匹配的字符串)
subtr(s,p,n)   |返回字符串s中从p开始长度位n的后缀部分(只替换第一匹配的字符串)

例如:

>[root@localhost ~]# cat wow
>
>M.Tansley 05/99 48311 Green 8 40 44
>
>J.Lulu 06/99 48317 green 9 24 26
>
>P.Bunny 02/99 48 Yellow 12 35 28
>
>J.Troll 07/99 4842 Brown-3 12 26 26
>
>L.Tansley 05/99 4712 Brown-2 12 30 28
  • 将整篇wow中的4全局替换成999

    [root@localhost ~]# awk ‘gsub(/4/,999)’ wow M.Tansley 05/99 9998311 Green 8 9990 999999

    J.Lulu 06/99 9998317 green 9 2999 26

    P.Bunny 02/99 9998 Yellow 12 35 28

    J.Troll 07/99 99989992 Brown-3 12 26 26

    L.Tansley 05/99 999712 Brown-2 12 30 28

或者

>[root@localhost ~]# awk 'gsub(/4/,999,$0)' wow              //默认就是$0,可以不加
>
>M.Tansley 05/99 9998311 Green 8 9990 999999
>
>J.Lulu 06/99 9998317 green 9 2999 26
>
>P.Bunny 02/99 9998 Yellow 12 35 28
>
>J.Troll 07/99 99989992 Brown-3 12 26 26
>
>L.Tansley 05/99 999712 Brown-2 12 30 28
  • 将用户名为M.Tansley所在行所有4替换成999

    [root@localhost ~]# awk ‘{if( 1=="M.Tansley")gsub(/4/,999);print 1 ==" M . T a n s l e y " ) g s u b ( / 4 / , 999 ) ; p r i n t 0}’ wow (这里的是$0)

    M.Tansley 05/99 9998311 Green 8 9990 999999

    J.Lulu 06/99 48317 green 9 24 26

    P.Bunny 02/99 48 Yellow 12 35 28

    J.Troll 07/99 4842 Brown-3 12 26 26

    L.Tansley 05/99 4712 Brown-2 12 30 28

  • 将用户名为M.Tansley所在行第三列的所有4替换成999

    [root@localhost ~]# awk ‘{if( 1=="M.Tansley")gsub(/4/,999, 1 ==" M . T a n s l e y " ) g s u b ( / 4 / , 999 , 3); print 0}' wow    (这里的1和3都是 0}' wow    (这里的1和3都是 的,加不上。以下类推)

    M.Tansley 05/99 9998311 Green 8 40 44

    J.Lulu 06/99 48317 green 9 24 26

    P.Bunny 02/99 48 Yellow 12 35 28

    J.Troll 07/99 4842 Brown-3 12 26 26

    L.Tansley 05/99 4712 Brown-2 12 30 28

  • 将用户名为M.Tansley所在行第三列的所有4替换成999,并且仅显示替换行

    [root@localhost ~]# awk ‘{if(1=="M.Tansley"){gsub(/4/,999, 1=="M.Tansley"){gsub(/4/,999, 3); print $0}}’ wow

    M.Tansley 05/99 9998311 Green 8 40 44

  • 将用户名为M.Tansley所在行第一个出现的4替换成999,

    [root@localhost ~]# awk ‘{if( 1=="M.Tansley")sub(/4/,999);print 1 ==" M . T a n s l e y " ) s u b ( / 4 / , 999 ) ; p r i n t 0}’ wow

    M.Tansley 05/99 9998311 Green 8 40 44

    J.Lulu 06/99 48317 green 9 24 26

    P.Bunny 02/99 48 Yellow 12 35 28

    J.Troll 07/99 4842 Brown-3 12 26 26
    L.Tansley 05/99 4712 Brown-2 12 30 28

  • 查询字符串Bunny中ny是第几个出现的字符。

    [root@localhost ~]# awk ‘BEGIN {print index(“Bunny”,”ny”)}’ grade.txt

    4

  • 查询字符串J.Troll的字符长度是多少?

    [root@localhost ~]# awk ‘1=="J.Troll" {print length( 1=="J.Troll" {print length( 1),$1}’ grade.txt

    7 J.Troll

  • 分别测试字符串“ANCD”中是否包含字符 d 或 C 或 D,如果没包含返回字符0,如果包含返回时第几个出现
    字符。

    [root@localhost ~]# awk ‘BEGIN {print match(“ANCD”,/d/)}’

    0

    [root@localhost ~]# awk ‘BEGIN {print match(“ANCD”,/C/)}’

    3

    [root@localhost ~]# awk ‘BEGIN {print match(“ANCD”,/D/)}’

    4

  • 显示字符串L.Tansley中从第1个字符(包含)开始的后面共5个字符

    [root@localhost ~]# awk ‘1=="L.Tansley" {print substr( 1=="L.Tansley" {print substr( 1,1,5)}’ grade.txt

    L.Tan

  • 用printf格式化awk的输出

    [root@localhost ~]# awk ‘BEGIN{printf “%-60s\n”,”——————–”}{printf “%-15s %s %-15s %s %s\n”, 1,"|", 1 , " | " , 3,”|”,$5}’ grade.txt

    M.Tansley | 48311 | 8

    J.Lulu | 48317 | 9

    P.Bunny | 48 | 12

    J.Troll | 4842 | 12

    L.Tansley | 4712 | 12


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值