zoukankan      html  css  js  c++  java
  • awk及sum求和!

                awk 也是一个强大的编辑工具,它比 sed 的功能更加强大,可以在无交互的情况下实现
    相当复杂的文本操作。

    1.awk 的语法

         awk [选项] ' print $1' 文件名 

    选项

        -F指定分隔符

     [root@localhost ~]# awk -F: '{print $3}' /etc/passwd

    0
    1
    2
    3
    4
    5

    2、awk 的内置变量
              ·FS:指定每行文本的字段分隔符,缺省为空格或制表位
              ·NF:当前处理的行的字段个数(列数)
              ·NR:当前处理的行的序数(行数)
              ·$0:当前处理的行的整行内容
             ·$n:当前处理的第 n 个字段(第 n 列)

              print:打印
     3、awk 的使用
    在使用的过程中,可以使用逻辑操作符&&,表示“与”,||表示“或”,!表示“非”;还可
    以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余、乘方

    4、awk会根据空格和制表符,将每一行分成若干字段,依次用$1、$2、$3代表第一个字段、第二个字段、第三个字段等等。

    ********

    awk最重要的是找到相同分割点然后隔断取值

    补充:

    sort(排序)

    sort -nr (数值从大到小排序反向)

    uniq-c(显示每个数重复的次数)

    BEGIN(文件处理前)

    END(文件处理后)

    示例:

    awk 'BEGIN{print "date age-n"*******}{print $2 $5}END{print hahaha} ip.txt

    BEGIN中FS表示分隔符

    BEGIN(文件处理前)

    {文件处理中}

    END{文件处理后}

    basename:显示基本目录

    dirname:显示主目录

    示例:

    [root@~~~]#cd /etc/systemctl/network-scripts

    [root@~~~]#basename $NF

     net ***********s

    [root@~~~]#dirname $NF

    etc*********ctl

    =======================================================================

    实例:

    要求:把.txt后缀的文件改成.mp4格式

    [root@localhost ~]#mkdir /b

    [root@localhost ~]#cd /b

    [root@localhost b]#touch {1..10}.txt

    [root@localhost b]# ls
    10.txt 1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt

    [root@localhost b]# ls | awk -F. '{print "mv "$1".txt "$1".mp4"}' | bash           //-F是分隔符、此处-F.是以.为分隔符
    [root@localhost b]# ls
    10.mp4 1.mp4  3.mp4  4.mp4   5.mp4   6.mp4    7.mp4     8.mp4    9.mp4

    =======================================================================

    求最大值(MAX)、最小值(MIN)、平均值、总和(SUM)

    sum

    [root@localhost ~]# df
    文件系统                                1K-块             已用               可用               已用%          挂载点
    /dev/mapper/centos-root     49250820    4410180         44840640           9%                   /
    devtmpfs                             480836               0              480836                0%                  /dev
    tmpfs                                   497948               0              497948                0%                  /dev/shm
    tmpfs                                   497948           9836           488112                 2%                   /run
    tmpfs                                   497948              0              497948                0%                    /sys/fs/cgroup
    /dev/sda1                           1038336        169568        868768               17%                   /boot
    tmpfs                                  99592             64               99528                1%                      /run/user/1000
    tmpfs                                  99592            68                99524               1%                     /run/user/0
    tmpfs                                  99592           4                   99588                 1%                  /run/user/42

    要求1:求 1K-块的容量之和

    [root@~~~]#df | awk -nr 'NR>=2 {print $2}'                          //NR表示行、NR>=2表示行数、print $2表示打印第二行

    49250820
    480836
    497948
    497948
    497948
    1038336
    99592
    99592
    99592

    [root@localhost ~]# df | awk -nr 'NR>=2 {sum+=$2}END{print sum}'             //sum+=$2表示sum=sum+$2、END表示结束后,print sum表示打印sum
    52562612

    要求2:求可用和已用之和

    [root@localhost ~]# df | awk -nr 'NR>=2 {sum1+=$3;sum2+=$4}END{print sum1+sum2}'

    52562612

    test.txt文件内容:
    9
    11
    35
    21
    42
    118

    求最大值:

    awk 'BEGIN {max = 0} {if ($1+0 > max+0) max=$1} END {print "Max=", max}' test.txt
    Max= 118


    求最小值:

    awk 'BEGIN {min = 65536} {if ($1+0 < min+0) min=$1} END {print "Min=", min}' test.txt
    Min= 9


    求和:

    cat test.txt|awk '{sum+=$1} END {print "Sum= ", sum}'
    Sum=  236


    求平均值:

    cat test.txt|awk '{sum+=$1} END {print "Avg= ", sum/NR}'
    Avg=  39.3333

    =======================================================================

    [root@localhost ~]# cat awk.txt
    abcgsg
    banner
    age
    food
    feet
    more

    010-123456
    0791-1235677
    ip 192.168.200.1
    ip 192.168.200.111
    ip 192.168.200.11
    aBggfH
    Bggsgs
    gaglag1

    打印全文

    [root@localhost ~]# awk '{print}' awk.txt print表示打印 abcgsg banner age food feet more 010-123456 0791-1235677 ip 192.168.200.1 ip 192.168.200.111 ip 192.168.200.11 aBggfH Bggsgs gaglag1
    输出1到3行的内容

    [root@localhost ~]# awk '(NR>=1)&&(NR<=3){print}' awk.txt NR表示行 abcgsg banner age

    输出1行和三行

     [root@localhost ~]# awk 'NR==1||NR==3{print}' awk.txt
      abcgsg
      age

     
    输出所有基数行

    [root@localhost ~]# awk '(NR%2)==1{print}' awk.txt %表示模 abcgsg age feet 0791-1235677 ip 192.168.200.111 aBggfH gaglag1
    输出所有偶数行 [root@localhost
    ~]# awk '(NR%2)==0{print}' awk.txt banner food more 010-123456 ip 192.168.200.1 ip 192.168.200.11 Bggsgs
    输出首字母是大写的


    [root@localhost ~]# awk '/^[A-Z]/{print}' awk.txt Bggsgs
    Mem:剩余多大内存

    [root@localhost ~]# free total used free shared buff/cache available Mem: 995896 590816 63260 8248 341820 195436 Swap: 2097148 27648 2069500 [root@localhost ~]# free | awk '/Mem:/{print int($3/$2*100)"%"}' $3表示第三列,$2表示第二列 59%

    过滤出free总容量

     [root@localhost ~]# free | grep 'Mem:' | awk '{print $2}'
     995896

    过滤IP地址

    [root@localhost ~]# ifconfig ens33 ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.200.115 netmask 255.255.255.0 broadcast 192.168.200.255 inet6 fe80::656c:1296:c062:6af7 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:c3:ed:86 txqueuelen 1000 (Ethernet) RX packets 4184 bytes 1545149 (1.4 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 2329 bytes 257278 (251.2 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@localhost ~]# ifconfig ens33 | awk -F '[ :]+' 'NR==2 {print $3}' 192.168.200.115
    1、提取出/etc/passwd 文件当中,UID小于1000的用户名信息和UID信息
    
    [root@server0 ~]# awk -F : ' $3<1000  {print $1,$3}' /etc/passwd
    
    
    
    2、提取出/etc/passwd文件当中,shell环境为”/bin/bash”的用户信息有shell信息
    
    [root@server0 ~]# awk -F : ' $NF== "/bin/bash"  {print $1,$NF}' /etc/passwd
    
    
    
    3、提取出/etc/passwd文件当中,第一行到第5行的用户名相关信息
    
    [root@server0 ~]# awk -F : ' (NR>=1&&NR<=5) {print $1}' /etc/passwd
    
    
    
    4、打印/et/passwd奇数行
    
    [root@server0 ~]# awk -F : '{if (NR%2!=0) print $0}' /etc/passwd
    
    
    
    5、 打印UID不等于GID的用户名
    
    [root@server0 ~]# awk -F : '{if ($3!=$4) print $1}' /etc/passwd
    
    
    6.awk提取登录用户ip地址
    
    [root@fengxiaoli41 ~]# who |tail -1|awk -F"[ ()]+" '{print$5}'
    
    192.168.10.1
    过滤/etc/passwd中的用户名

    [root@localhost ~]# awk -F ':' '{ print $1 }' /etc/passwd

    root
    bin
    daemon
    adm
    lp
    sync

    ....

    ......

    取出/etc/passwd中每行的最后一个值

    [root@localhost ~]# awk -F '' '$0=$NF' /etc/passwd
    取出用户的登录类型

    [root@localhost ~]# awk -F ':' '{ print $NF}' /etc/passwd
    ':'表示以:为分割 $NF表示最后一列
    /bin/bash /sbin/nologin /sbin/nologin /sbin/nologin /sbin/nologin
    取出每行的家目录的第一个字母

    [root@localhost ~]# sed -nr '1,5 s#(.*):/(.)(.*/){2,}.*#2#gp' /etc/passwd r b s v v
  • 相关阅读:
    leftpad填充函数;
    overfllow的解析
    append与after
    数组扁平话的N种解法;
    关于webapi调用wcf并发假死的分析
    C#金额数字转换中文繁体
    关于ios的IDFA
    Windows下为MySQL做定时备份
    [System.OutOfMemoryException] {函数求值已禁用,因为出现内存不足异常。
    mvc 捕获404和500 等
  • 原文地址:https://www.cnblogs.com/CMX_Shmily/p/11456989.html
Copyright © 2011-2022 走看看