[转帖]SHELL—— awk两个特殊模式(BEGIN 和 END)及awk高级应用(条件判断、循环)

shell,awk,两个,特殊,模式,begin,end,高级,应用,条件,判断,循环 · 浏览次数 : 0

小编点评

**Awk 特殊模式 BEGIN 和 END** * **BEGIN**:在没有任何数据读取之前执行的语句。 * **END**:在所有数据读取完成后执行的语句。 **高级应用** 1. **单分支语句**:统计登录shell为 bash 的用户数量。 2. **双分支语句**:统计uid小于等于500和大于500的用户数量。 3. **循环**:生成 1-5 的序列。 4. **while**:循环生成 1-3 的序列。 **示例** ```awk # 统计登录shell为 bash 的用户数量 BEGIN { i = 0; if ($7 ~/bash$) { i++ } } END { print i; } # 统计uid小于等于500和大于500的用户数量 BEGIN { i = 0; if ($3 < 500) { i++ } } END { print i; } # 统计uid小于等于500和大于500的用户数量 BEGIN { i = 0; if ($3 < 500) { i++ } } END { print i, j; } # 生成 1-5 的序列 BEGIN { for (i = 1; i <= 5; i++) { print i } } # 循环生成 1-3 的序列 BEGIN { i = 1; while (i < 3) { ++i; print i } } ```

正文

一、Awk 的两个特殊模式

  • BEGIN 和 END,BEGIN 被放置在没有读取任何数据之前,而 END 被放置在所有的数据读取完成以后执行
  • 体现如下:
    BEGIN{}: 读入第一行文本之前执行的语句,一般用来初始化操作
    {}: 逐行处理
    END{}: 处理完最后以行文本后执行,一般用来处理输出结果
  • 实例:
  • 文件开头加REDHAT,末尾加WESTOS,打印行号和内容
[root@server19 mnt]# awk -F: 'BEGIN {print "REDHAT"} {print NR;print} END {print "WESTOS"}' passwd 
REDHAT
1
root:x:0:0:root:/root:/bin/bash
2
bin:x:1:1:bin:/bin:/sbin/nologin
3
daemon:x:2:2:daemon:/sbin:/sbin/nologin
4
adm:x:3:4:adm:/var/adm:/sbin/nologin
5
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6
sync:x:5:0:sync:/sbin:/bin/sync
7
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
WESTOS
    • 统计文本总字段个数
    [root@server19 mnt]# vim test.txt 
    hui hui XX
    XX
    XX  ni  Xx
    

    [root@server19 mnt]# awk 'BEGIN{i=0}{i+=NF}END{print i}' test.txt
    7

      二、Awk高级应用

      1. if单分支语句

      • 统计登录shell为bash的用户
      [root@server19 mnt]# awk -F: 'BEGIN{i=0}{if($7~/bash$/){i++}}END{print i}' /etc/passwd
      2 
      
        • 统计/etc/passwd下uid小于500的用户个数
        [root@server19 mnt]# awk -F: 'BEGIN{i=0}{if($3<500){i++}}END{print i}' /etc/passwd
        31 
        

          2. if双分支语句

          • 统计uid小于等于500和大于500的用户个数
          [root@server19 mnt]# awk -F: 'BEGIN{i=0;j=0}{if($3<=500){i++}else{j++}}END{print i,j}' /etc/passwd
          31 9 
          

            3. for循环

            • 生成1-5序列
            [root@server19 mnt]# awk 'BEGIN{for(i=1;i<=5;i++){print i}}'
            1
            2
            3
            4
            5
            

            [root@server19 mnt]# seq 5 ##seq命令可以直接生成
            1
            2
            3
            4
            5

              4. while循环

              语法一:
              [root@test ~]# awk 'i=1 {} BEGIN {while (i<3) {++i;print i}}' test.txt 
              1
              2
              3
              [root@test ~]#
              

              语法二:
              [root@test ~]# awk 'BEGIN {do {++i;print i} while (i<3)}' test.txt
              1
              2
              3
              [root@test ~]#

                与[转帖]SHELL—— awk两个特殊模式(BEGIN 和 END)及awk高级应用(条件判断、循环)相似的内容:

                [转帖]SHELL—— awk两个特殊模式(BEGIN 和 END)及awk高级应用(条件判断、循环)

                一、Awk 的两个特殊模式 BEGIN 和 END,BEGIN 被放置在没有读取任何数据之前,而 END 被放置在所有的数据读取完成以后执行体现如下: BEGIN{}: 读入第一行文本之前执行的语句,一般用来初始化操作 {}: 逐行处理 END{}: 处理完最后以行文本后执行,一般用来处理输出结果

                [转帖]Shell三剑客之awk

                目录 awk简述awk的工作过程awk的工作原理awk的基本格式及其内置变量getline文本内容匹配过滤打印对字段进行处理打印条件判断打印awk的三元表达式与精准筛选用法awk的精准筛选:awk的分隔符用法指定输出的分隔符awk结合数组运用面试题 awk简述 在 Linux/UNIX 系统中,aw

                [转帖]shell脚本之awk命令——按列求平均值、最大值、最小值

                文章目录 写在前面awk求平均值awk求最大值awk求最小值awk求极值、均值的实际应用 写在前面 awk命令求极值和均值需要熟悉该命令的基本用法,如果你不熟悉该命令,请先阅读shell脚本之awk命令——分隔符介绍一文。本篇博文带你熟悉求平均值、最大值、最小值的方法,并以实际的应用带你进一步掌握a

                [转帖]Shell分析日志文件

                https://zhuanlan.zhihu.com/p/504876581 1、查看有多少个IP访问: awk '{print $1}' log_file|sort|uniq|wc -l 2、查看某一个页面被访问的次数: grep "/index.php" log_file | wc -l 3、查

                [转帖]shell 实现行转列、列转行的几种方法

                目录 shell 实现行转列、列转行的几种方法awk行转列 xargs行转列 tr列转行参考资料 shell 实现行转列、列转行的几种方法 awk 行转列 以空格为分隔符 awk -F "+" '{for(i=1;i<=NF;i++) a[i,NR]=$i}END{for(i=1;i<=NF;i++

                [转帖]shell 把以空格分隔的变量 分割后的每个字段赋值给变量

                比如我有一个变量 “123 456 789”,要求以空格为分隔符把这个变量分隔,并把分隔后的字段分别赋值给变量,即a=123;b=456;c=789 共有3中方法: 法一:先定义一个数组,然后把分隔出来的字段赋值给数组中的每一个元素 法二:通过eval+赋值的方式 法三:通过多次awk把每个字段赋值

                [转帖]这些 Shell 分析服务器日志命令集锦,收藏好

                自己的小网站跑在阿里云的ECS上面,偶尔也去分析分析自己网站服务器日志,看看网站的访问量。看看有没有黑阔搞破坏!于是收集,整理一些服务器日志分析命令,大家可以试试! 1、查看有多少个IP访问: awk '{print $1}' log_file|sort|uniq|wc -l 2、查看某一个页面被访

                [转帖]精通awk系列(19):awk流程控制之break、continue、next、nextfile、exit语句

                https://www.cnblogs.com/f-ck-need-u/ 回到: Linux系列文章 Shell系列文章 Awk系列文章 break和continue break可退出for、while、do...while、switch语句。 continue可让for、while、do...wh

                [转帖]linux awk数据列, 存入shell数组

                awk 赋值给 shell 变量的方法 result='week(now(),-1) 49';var=`echo $result|awk '{print substr($result,16,3)}'`;echo $var;SYSFILE_NAME=`echo "$CONTROL_FILE" | aw

                [转帖]BASH编写入门与实例

                1 2 3 4 5 6 7 8 9 10 怎么写shell脚本: 。使用任何编辑工具编写shell脚本 例如vi -#!/bin/bash #在第一行放置头格式说明 -#!/usr/bin/gawk //awk需要添加的头格式,让系统知道用什么方式去解析此文件 -#!/usr/local/bin/p