• linux awk


    2018/10/29  21:07:38

                                                                             linux—awk 简介

    awk不仅仅是linux系统中的一个命令,而且是一种编程语言。可以用来处理数据和生成报告(excel)处理的数据可以是一个或多个文件,可以是来自标准输入,也可以通过管道获取标准输入。awk可以在命令行上直接编辑命令进行操作,也可以编写成awk程序来进行更为复杂的运用。Awk -F 

    _F;是指awk按照什么标准进行文件的切割,切割成一列一列的。

     

    awk有参数-F可以指定awk按照什么符号切割文件内容,将源文件内容切割成一列一列的。

     

    awk [options] pattern {action} file

     

    Awk 格式  options参数 pattern模式 {action}动作

     

    一部分模式 一部分动作 {}里的是动作 {}外的是模式

     

    模式是条件 根据条件来筛选数据 先有模式再有动作 模式过滤完后在动作

     

    如果我们不指定-F参数 awk默认按照  空格进行文本的切割{}

    中的print代表输出的意思。 print打印

    :输出以冒号分割符的第一列

    $0;默认输出全部内容(取文件的全部内容)

    $NF;默认取每行的最后一列

    Awk -F : ‘NR>3 && NR<8 {print $0}yunjisuan.txt

     

    1、根据参数(-F)先切割

     

    2、根据‘单引号的模式进行内容过滤

    3、符合模式条件的在进行动作输出

     

     冒号:七行

     

    第6 5 4 3 2 1 

     

    加[]和加号+  【】+

     [:/ ]+

    基本模式;

    Awk -F “:”  ‘NR>=2  && NR<=6 {print  NR,$1}’  /etc/passwd

    命令说明;

    F 指定分隔符为冒号,相当于以“:”为菜刀,进行字段的切割。 NR>=2 && NR<=6;这部分表示模式,是一个条件,表示取第2行到第六行。 {print NR,$1};这部分表示动作,表示要输出NR行号和$1第一列。

    只有模式

    命令说明;

    -F指定分割符为冒号

    NR>=2&&<=6这部分条件,表示取第二行到第6行

    但是这里没有动作,这里大家需要了解如果只有条件(模式)没有动作,awk默认整行。

    只有动作

    多个模式和动作

     -F指定分割符号为冒号

    这里有多个条件与动作的组合

    NR==1表示条件,行号(NR)等于1的条件满足的时候,执行{print NR,$1}动作,输出行号与第一列

    NR==2表示条件,行号早(NR)等于2的条件满足的时候,执行{print NR,$NF}动作,输出行号与最后一列($N

    awk 执行过程

    怎么处理文件

    过程演示

     命令说明;

    条件NR>=2,表示行号大于等于2时候,执行{print $0}显示整行

    awk是通过一行一行的处理文件,这条命令中包含模式部分(条件)和动作部分(动作),awk将处理模式(条件)指定的行

    awk -F 参数 ‘BEGIN模块{}模式{动作}END模块{}’后面加文件名 也就是AWK有两个模块一个开始一个结尾。

     记录和字段,为了方便理解可以把记录就当行即记录==行,字段相当于列,字段==列

    awk输出是它以什么符号输出就以什么符号换行。

    模式和动作都不输出代表全部默认输出。

    以冒号不默认输出而换行

     

     读入换行符

    输入换行符修改了输出换行符 分割符号ORS

    除了字母全部换掉

    打开文件

    变成一行

       xargs -NL变成竖行

    排序sort 

    uniq所有相同的单词取消定重

     

    Uniq -c 表示去重还显示行数

    Sort -n 让它按着数字排列 sort是默认输出26个字母

    sort -rn 逆转排序

    sort -k2  参数     -r  -n  -k  k2 指定列排序

     

    awk 进阶

    模式与动作

    1、正则表达式作为模式

    显示第9行是正则表达式的IP地址

    awk '$9~/^200$/' test

    awk '$9~/^200$/{print $1}'  test

    2、比较模式

    NR>=3&&<=8

    取出文件/etc/services的10-20行

    awk 'NR>=10&&NR<=20' /etc/services

    awk 'NR>10&&NR<20' /etc/services

     判断某一列是否等于某个字符,找出/etc/passwd中第五列是root的行

    # awk -F":" '$5=="root"' rver/files/awk_equal.txt

    # awk -F":" '$5~/^root$/' rver/files/awk_equal.txt

     

    找出工资在(40000,60000)之间的员工名字

    # awk -F: ‘$3>=”40000” && $3<=”60000” {print $1}’ test2

      

    范围模式

    显示第二行到第五行的行好和整行的内容

    # awk 'NR==2,NR==5{print NR,$0}' count.txt

     

    显示以bin开头,到第五行的行号及整行内容

    # awk '/^bin/,NR==5{print NR,$0}' awkfile.txt

     

    从第三列以bin开始的行到以lp开头的行并显示其行号和整行内容

    awk -F":" '$5~/^bin/,/^lp/{print NR,$0}' awkfile.txt

     

    从第三列以bin开头字符串的行到第三列以lp开头字符串的行

    # awk -F: '$5~/^bin/,$5~/^lp/{print NR,$0}' awkfile.txt
    特殊模式
     BEGIN模块

    (1)定义内置变量(-F本质式修改的FS变量)

    # ifconfig eth0|awk -F "(addr:)|( Bcast:)" 'NR==2{print $2}'

    相当于# ifconfig eth0 | awk 'BEGIN{FS="(addr:)|( Bcast:)"} NR==2{print $2}'

     

    # ifconfig eth0 | awk -F "[ :]+" 'NR==2{print $4}'

    相当于# ifconfig eth0 | awk 'BEGIN{FS="[ :]+"}NR==2{print $4}'

     

    # ifconfig eth0 | awk -F "[^0-9.]+" 'NR==2{print $2}'

    相当于# ifconfig eth0 | awk 'BEGIN{FS="[^0-9.]+"}NR==2{print $2}'

     

    (2)在读取文件之前,输出提示性信息(表头)

    # awk -F ":" 'BEGIN{print "1111","2222"} {print $1,$3} ' test.txt

     

    # awk -F ":" 'BEGIN{print "1111","2222"} {print $1,$3} END{print "asdf","asdfg"}' test.txt

     

    (3)使用BEGIN 模块的特殊性质,进行一些测试(计算)

    计算数值

    # awk 'BEGIN{print 10/3}'

     

    赋值变量

    # awk 'BEGIN{a=1;b=2;print a,b,a+b}'

      

    awk中字母会被认为是变量,给一个变量赋值字母(字符串),用双引号

    # awk 'BEGIN{abcd=123456;a=abcd;print a}'

    123456

     

    # awk 'BEGIN{a="abcd";print a}'

    abcd

     

    表示a的b次方

    # awk ‘BEGIN{a=2;b=3;print a**b}’

     

    查看/etc/services空行个数

     方法一:

    # grep -c “^$” /etc/services   

    方法二:

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

     其中,i=i+1 等同于i++

     

    查看test文件一共有多少行 

    # awk ‘{i++}END{print i}’ test

     

    求test文件每行的值之和

    # awk ‘{i=i+$0}END{print i}’ test

     

    求 test文件每行的值之积(BEGIN初始变量设定位置)

    # awk ‘BEGIN{i=1}{i=i*$1}END{print i}’ test

     

    awk数组

    用一个变量表示多组数据,通常优先考虑数组,eg:变量名[数字]=不同的值

    awk数组结构

    arrayname[string]=value

    arrayname为数组名

    string为元素名

    value为值

     

    循环语句

    for(变量1 in 变量2) 表示变量1在变量2 中取值,变量1被变量2循环赋值

      

    统计域名访问次数

    (1)取出域名

    (2)将域名去重

    (3)统计次数

    方法一:

    # awk -F “/+” ‘{print $2}’ wangxiong | sort uniq -c

    方法二:

    # awk -F "[ /]+" '{h[$2]++}END{for(i in h)print i,h[i]}' wangxiong

     

    统计域名访问次数并累计流量

    (1)取出域名

    (2)将域名去重

    (3)统计流量大小

    #  awk -F "[ /]+" '{h[$2]=h[$2]+$4}END{for(i in h)print i,h[i]}' wangxiong

     

    第一列字母去重,并求和

    # awk ‘{h[$1]+$2}END{for(i in h)print i,h[i]}’ test
    企业面试题;取出网卡echo的IP地址
    方法1、hostname -I
    方法2、ifconfig ech0 | awk -F "[   :]+"   'NR==2{print $4}'
    方法3、ifconfig ech0 | awk 'BEGIN{RS="[   :]"}NR==31'
    方法4、ifconfig eth0 | awk -F "[   :]+"  'NR==2{print NR,$3}'
     
     


      




     

        

  • 相关阅读:
    关于javascript app框架的几篇文章
    php 开发笔记
    php 图片处理扩展(windows平台)
    [javascript]最短 domready
    javascript小陷阱
    HTML DOM whiteSpace
    40岁后才明白的道理:人一生奋斗余地很有限转载
    [学习笔记]lca倍增
    Django model 字段类型及选项解析转载
    PythonPEP8 风格规范指南
  • 原文地址:https://www.cnblogs.com/jijiguowang/p/9873289.html
Copyright © 2020-2023  润新知