2019-06-19

1. awk三剑客命令概述

            # which awk--------查看awk在哪个目录下

显示:  /usr/bin/awk

            # ll /usr/bin/awk

显示: lrwxrwxrwx. 1 root root 4 May 31 16:06 /usr/bin/awk -> gawk    ------查看awk更详细的信息

            # man awk

显示: gawk - pattern scanning and processing language

            解析: 模式扫描(条件匹配)and 程序语言

awk: 擅长取列  擅长统计分析(nginx zabbix tomcat ... SSH)ELK awk

03. awk三剑客命令执行原理

    参见示意图

04. awk三件可命令语法结构

    awk [参数] '模式(条件){动作}(指令)'  文件信息

05. awk三剑客命令实践操作:查询 排除 替换

    部署准备环境

cat > oldboy.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

2. 实践操作练习:

    01. 显示xiaoyu的姓氏和ID号码

    # awk '/Xiaoyu/{print $1 $3}' oldboy.txt

    Zhang390320151

    # awk '/Xiaoyu/{print $1,$3}' oldboy.txt

    Zhang 390320151

    # awk '/Xiaoyu/{print $1" "$3}' oldboy.txt

    Zhang 390320151

    按照指定列进行搜索信息Xiaoyu        问题是内容中有两个Xiaoyu

    # awk '/Xiaoyu/' oldboy.txt        --- 将匹配信息的行直接显示

    Zhang  Xiaoyu    390320151  :155:90:201

    Xiaoyu zhang    390320151  :155:90:201

    # awk '$2~/Xiaoyu/' oldboy.txt    --- 指定列信息匹配  解决方法

    Zhang  Xiaoyu    390320151  :155:90:201

    # awk '$2!~/Xiaoyu/' oldboy.txt    ----表示将指定列信息取返

    Zhang  Dandan    41117397    :250:100:175

    Xiaoyu zhang    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

    显示xiaoyu的姓氏和ID号:满足要求,正确语法格式

    # awk '$2~/Xiaoyu/{print $1,$3}' oldboy.txt

    Zhang 390320151

PS:awk命令默认区分大小写不需要加i    没有类似grep命令 -i参数功能

    02.姓氏是zhang的人,显示他的第二次捐款金额及他的名字

        第一历程:找出姓氏是张的人

        # awk '$1~/Zhang/' oldboy.txt

            Zhang  Dandan    41117397    :250:100:175

            Zhang  Xiaoyu    390320151  :155:90:201

          第二历程:显示出名字信息 和所有捐款记录

          # awk '$1~/Zhang/{print $2,$4}' oldboy.txt

          Dandan :250:100:175

          Xiaoyu :155:90:201

PS:在使用-F的参数下,awk默认使用空格进行作为列分隔符

          第三历程:指定字符信息作为分隔符

          # awk -F "[: ]+" '$1~/Zhang/{print $2,$5}' oldboy.txt

          Dandan 100

            Xiaoyu 90

    总结:

01. awk默认使用空格分隔列

02. 可以使用-F 指定分隔列的符号信息

03. 利用-F "[: ]+"  +表示将多个连续的分隔符汇总为一个整体

03. 显示所有以41开头的ID号码的人的全名和ID号码

第一个历程:找出匹配id号码是41开头的行信息 --- 找出东西(模式写好)

# awk '$3~/^41/' oldboy.txt

                  Zhang  Dandan    41117397    :250:100:175

                  Liu    Bingbing  41117483    :250:100:175

第二个历程:显示出人的全名 和 ID号码      --- 对找出东西进行处理(执行动作)

                    # awk '$3~/^41/{print $1,$2,$3}' oldboy.txt|column -t

                    Zhang  Dandan    41117397

                    Liu    Bingbing  41117483

    04. 显示所有ID号码最后一位数字是1或5的人的全名

第一个历程:找出id号码以1或5结尾信息  --- 找出信息

方法一:awk '$3~/1$|5$/' oldboy.txt

方法二:awk '$3~/[15]$/' oldboy.txt

第二个历程:显示全名信息              --- 找出信息做处理

awk '$3~/[15]$/{print $1,$2}' oldboy.txt|column -t

    05. 显示文件中第二行,第三列的信息

第一个历程:匹配第二行

# awk 'NR==2' oldboy.txt

                    Zhang  Xiaoyu    390320151  :155:90:201

第二个历程:显示第三列

awk 'NR==2{print $3}' oldboy.txt

        测试. 利用awk取出IP地址信息(grep sed)

第一个历程:定位有IP地址的行          --- 找出信息

ip a s eth0|awk 'NR==3'

                  inet 10.0.0.201/24 brd 10.0.0.255 scope global eth0

第二个历程:只显示IP地址              --- 做处理  为什么是三前面和后面都有隐藏一个^ $

ip a s eth0|awk -F "[ /]+" 'NR==3{print $3}'

                  10.0.0.201

    说明:在不指定-F参数信息,

      1. 默认将多个连续的空格汇总为整体

      2. 默认将一行头部开始空格信息忽略不计

  ip a s eth0|awk -F "[^0-9.]+" 'NR==3{print $2}'

                    10.0.0.201

  06. 显示Xiaoyu的捐款,每个捐款数值都有以$开头, 如$110$220$330

方法一:

# awk -F "[:]" '$2~/Xiaoyu/{print "$"$2"$"$3"$"$4}' oldboy.txt  ???

                  $155$90$201

方法二:

# awk  '$2~/Xiaoyu/{print $4}' oldboy.txt|sed 's#:#$#g'

                  $155$90$201

                # awk  '$2~/Xiaoyu/{print $4}' oldboy.txt|tr ":" "$"

                  $155$90$201

                  方法三:awk替换功能  sed tr

gsub(/要替换的信息/,"替换成什么",将第几列进行替换)

# awk  '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $NF}' oldboy.txt

                    $155$90$201

          07.利用awk排除指定信息不要显示

awk '!/^$/' oldboy.txt

06. awk命令高级功能说明:

    普通模式  正则表达式作为模式  ^ 还可以表示某一列的开始

                                    $ 还可以表示某一列的结尾

    比较表达式作为模式:

            # awk 'NR==1{print $NF}' oldboy.txt

              :250:100:17

    范围模式:

              awk 'NR==1;NR==2' oldboy.txt    --- 只查看第1和第2行

              awk 'NR==1,NR==3' oldboy.txt    --- 查看第一到第三行


    特殊模式  BEGIN  在处理文件之前先执行的动作

    1)生成文件内容表头信息

          # awk 'BEGIN{print "姓氏","名称","id号码","捐款记录"}{print $0}' oldboy.txt |column -t

              姓氏    名称      id号码      捐款记录

              Zhang  Dandan    41117397    :250:100:175

              Zhang  Xiaoyu    390320151  :155:90:201

              Xiaoyu  zhang    390320151  :155:90:201

              Meng    Feixue    800412789  :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

    2)用于在系统中进行运算数值

awk 'BEGIN{print 2+3}'

    3) 修改或设置变量信息

          a awk命令中,会直接将字符串信息当成变量  $1 $NF $0(取一行中所有列)

          # awk 'BEGIN{oldboy=62;print oldboy}' -------设置变量

                62

          # awk 'BEGIN{oldboy=62;print "oldboy"}' -----不想识别出变量

                oldboy

自定义变量:oldboy=62

内置变量:

NF : 显示最后一列信息  $(NF-1) 取倒数第2列

NR : 表示行号信息,取出第几行  NR==2 NR>=2 NR<=2

FS : 指定分隔符信息  -F

                # awk -F ":" 'NR==1{print $2}' oldboy.txt

                250

                # awk  'BEGIN{FS=":"}NR==1{print $2}' oldboy.txt

                250

                # awk -vFS=":" 'NR==1{print $2}' oldboy.txt

                250

  END    在处理文件之后再执行的动作 ***

          1)显示表格补充信息

            # awk 'BEGIN{print "姓氏","名称","id号码","捐款记录"}{print $0}END{print "总结:这是一个学生登记表"}' oldboy.txt|column

              姓氏 名称 id号码 捐款记录

              Zhang  Dandan    41117397    :250:100:175

              Zhang  Xiaoyu    390320151  :155:90:201

              Meng  Feixue    800412789    :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

              总结:这是一个学生登记表

          2)显示计算的最终结果 OK

          awk '/^$/{i=i+1}END{print i}' /etc/services



07. awk运算方法:

    1)累加运算:a b c d  1+1+1+1

  i=i+1 --> i++

  练习题01:统计一个文件中有多少个空行

  第一个历程:找出空行

  awk '/^$/' /etc/services

  第二个历程:做运算处理

  # awk '/^$/{i=i+1;print i}' /etc/services

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      # awk '/^$/{i=i+1}END{print i}' /etc/services

      17


  练习题02:统计/etc/passwd文件中最后一列有/sbin/nologin的出现了多少次

      [# awk -F ":" '$NF~/nologin$/{i++}END{print i}' /etc/passwd

      17

      # awk '/nologin$/{i++}END{print i}' /etc/passwd

      17



    2)求和运算: 10 20 30 60

  i=i+$n

      实践操作:

      # seq 10|awk '{i=i+$1;print i}'

      1

      3

      6

      10

      15

      21

      28

      36

      45

      55

      # seq 10|awk '{i=i+$1}END{print i}'

      55

08. 课程知识总结:

    1)awk三剑客命令概述

  1)作用:擅长取列 擅长统计运算

  2)语法:awk 参数 '模式{动作}' oldboy.txt

      模式:常用模式 特殊模式(BEGIN END)

  3)原理:

2)awk三剑客命令练习

  6道题  查(匹配信息) 修改替换  删除

  awk命令参数:

  -F  : 指定分隔符号信息  ":"  "[:/]"  "[:/]+"

  -v  : 设置变量信息

  awk命令动作:

  print: 打印输出信息  空格 , " "  字符串 "oldboy"  变量信息  oldboy  指定列 $1 $NF $(NF-1) $0(所有列)

  gsub:  替换指定列的信息  gsub(/要替换的内容/,"替换成什么",$N)

  计算:

  累加运算:i=i+1  i++

  求和运算:i=i+$n  

  awk内置变量:

  FS NF NR

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容