Linux -- Ubuntulinux运维

Day19操作系统三剑客命令-awk

2019-11-06  本文已影响0人  a幕城

01.三剑客awk命令概念介绍、*

概念说明:` pattern scanning and processing  language
           模式识别和脚本编写`
执行原理:`按行处理文件信息, 根据匹配条件信息, 完成相应操作动作`
语法结构: `awk [参数] '模式信息(条件) {动作}'  文件信息`

02.三剑客awk命令使用方法

`cat >> awk_test.txt <<EOF
Zhang  Dandan    41117397    :250:100:175
Zhang  Xiaoyu    390320151   :155:90:201
Meng   Feixue    80042789    :250:60:50
Wu     Waiwai    70271111    :250:80:75
Liu    Bingbing  41117483    :250:100:175
Wang   Xiaoai    3515064655  :50:95:135
Zi     Gege      1986787350  :250:168:200
Li     Youjiu    918391635   :175:75:300
Lao    Nanhai    918391635   :250:100:175   
EOF`
**练习题**
1):显示xiaoyu的姓氏和ID号码
`[root@localhost ~]# awk 'NR==2 {print $1,$3}' awk_test.txt 
Zhang 390320151`
2):显示姓氏是张的的人,显示他的第二次捐款的金额
`[root@localhost ~]#  awk '/^Zhang/ {print $1,$2,$4}' awk_test.txt | awk -F ':' '{print $1,$3}
Zhang Dandan  100
Zhang Xiaoyu  90`
3)显示所有以41开头的ID号码的人的全名和ID号码
`[root@localhost ~]# awk '/41/{print $1,$2,$3}' awk_test.txt 
Zhang Dandan 41117397
Liu Bingbing 41117483`
4)显示所有ID号码后面是1和5的人的全名
`[root@localhost ~]# awk '$3~/[15]$/{print$1,$2}' awk_test.txt 
Zhang Xiaoyu
Wu Waiwai
Wang Xiaoai
Li Youjiu
Lao Nanhai`
5)显示所有ID号码后面不是1和5的人的全名
`[root@localhost ~]# awk '$3~/[^15]$/{print $1,$2,$3}' awk_test.txt |column -t
Zhang  Dandan    41117397
Meng   Feixue    80042789
Liu    Bingbing  41117483
Zi     Gege      1986787350`
6)显示Xiaoyu的捐款,每个时都有以$开头, 如$110$220$330
`[root@localhost ~]# awk '/Xiaoyu/{print $4}' awk_test.txt |sed 's#:#$#g'
$155$90$201`

print:输出指定的信息
gusb : 替换指定的信息 gawk substitute -- gsub
gsub(// , "" , x) --> gsub (/要替换的信息) gusb(/:/ ,"",)
说明:NF表示列信息,NF表示最后一列, ?倒数第二列 ==3
NF ==4 - 1
oldboy linux edu 50
(NF-1) (NF)
(4-1)4 4==NF==50 $NF-1==50-1=49
总结:
awk用到参数: -F 指定列分隔符号
awk用到的动作: print 指定输出的信息
gsub 替换指定的信息
awk内置的变量: NR 表示行号的信息
NF 表示列号的信息

print:输出指定的信息
gusb : 替换指定的信息   gawk substitute -- gsub
       gsub(// , "" , $x) --> gsub (/要替换的信息) 
       gusb(/:/ ,"$",)
说明:NF表示列信息,$NF表示最后一列, ?倒数第二列   == $3
$NF == $4 - 1 
oldboy  linux  edu       50 
$(NF-1)  ($NF)
$(4-1)    $4    $4==$NF==50  $NF-1==50-1=49
总结:
awk用到参数: -F 指定列分隔符号
awk用到的动作: print 指定输出的信息
                gsub  替换指定的信息
awk内置的变量: NR    表示行号的信息
                NF    表示列号的信息

特殊模式
BEGIN: 在文件处理之前完成相应操作
[root@linux67 oldboy]# awk 'BEGIN{print "姓","名","ID","捐款记录"}{print 0}' awk_test.txt |column -t 姓 名 ID 捐款记录 Zhang Dandan 41117397 :250:100:175 Zhang Xiaoyu 390320151 :155:90:201 Meng Feixue 80042789 :250:60:50 Wu Waiwai 70271111 :250:80:75 Liu Bingbing 41117483 :250:100:175 Wang Xiaoai 3515064655 :50:95:135 Zi Gege 1986787350 :250:168:200 Li Youjiu 918391635 :175:75:300 Lao Nanhai 918391635 :250:100:175 特殊模式 BEGIN: 在文件处理之前完成相应操作 [root@linux67 oldboy]# awk 'BEGIN{print "姓","名","ID","捐款记录"}{print0}' awk_test.txt |column -t
姓 名 ID 捐款记录
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175

   作用: 
   1) 可以实现数值运算  --- 计算器
      [root@linux67 oldboy]# awk 'BEGIN{print 2+3}'
      5
      [root@linux67 oldboy]# awk 'BEGIN{print 2-3}'
      -1
      [root@linux67 oldboy]# awk 'BEGIN{print 2*3}'
      6
      [root@linux67 oldboy]# awk 'BEGIN{print 2^3}'
      8
      [root@linux67 oldboy]# awk 'BEGIN{print 2/3}'
      0.666667  
   
   2) 可以实现变量设置
   [root@linux67 oldboy]# awk 'BEGIN{name="oldgirl"}$2~/Xiaoyu/{print name,$1,$2}' awk_test.txt 
   oldgirl Zhang Xiaoyu
   [root@linux67 oldboy]# awk 'BEGIN{name="oldgirl"}$2~/Xiaoyu/{print "name",$1,$2}' awk_test.txt 
   name Zhang Xiaoyu
   
   [root@linux67 oldboy]# awk -F "[ :]+" '$1~/Zhang/{print $1,$2,$5}' awk_test.txt 
   Zhang Dandan 100
   Zhang Xiaoyu 90
   [root@linux67 oldboy]# awk  'BEGIN{FS="[ :]+"}$1~/Zhang/{print $1,$2,$5}' awk_test.txt 
   Zhang Dandan 100
   Zhang Xiaoyu 90
   [root@linux67 oldboy]# awk -vFS="[ :]+" '$1~/Zhang/{print $1,$2,$5}' awk_test.txt 
   Zhang Dandan 100
   Zhang Xiaoyu 90
   
   内置变量:
   NR : 表示行的信息
   NF : 表示列的信息
   FS : 表示指定分隔符号
      
 `3) 可以实现信息统计
      如何进行累加运算  -->  i=i+1   初始i=0  经过一次运算 i=1  经过运算 i=2
上一篇 下一篇

猜你喜欢

热点阅读