zoukankan      html  css  js  c++  java
  • awk

    一.awk基础用法

    awk -F参数   

    指定awk按照什么标志进行文件切割,切割成一列一列的

    常见的格式:awk -F “指定分隔符

    如果我们不指定-F参数,awk默认用空格分列

    模式负责内容的过滤和查找,动作负责挑选

    {}中的print代表输出的意思。$代表去列

    $1就是取第一列,以此类推...

    awk -F “:” ‘{print $1}’ yunjisuan.txt

    输出以冒号为分隔符的第一列

    $0默认输出所有内容

    $NF默认是取最后一列(默认取最后一组元素)

    二.awk的使用格式

    1.基础用法

    awk  参数   ’模式  动作‘

    先进行参数筛选,再进行模式,再进行动作

    有大括号就是动作,如果写内容就执行

    如果有大括号不输入动作内容(空的大括号):就不输出内容

    不添加大括号就默认全输出

    2.正则用法

    awk -F “[:/ ]”  指定多个分隔符

     

    ifconfig eth0 | awk ‘NR==2’ | awk -F “[ ]+” ‘{print $2}’

    如果不加+  前面的空格一个一个取,需要取很多次,为了方便,后面还是要加+  

    默认不加[ ],默认的空格是贪婪的,自动去掉左右空格。

     

    3.多个模式和动作

    awk -F “:” ‘NR==1{print NR,$1}NR==2{print NR,$NF}’ /etc/passwd

    命令说明:这里有多个条件和动作的组合

    NR=1表示条件,行号(NR)等于1的条件满足的时候,执行相应的动作。

    NR=2表示条件,行号(NR)等于2的条件满足的时候,执行相应的动作。

    这个模式每行可以取不一样

    4. awk的原理

    一行一行的读数据,读完一行后看模式和条件,看看是否符合模式?

    如果符合,就执行动作了;

    如果不符合就继续读下一行。

    所有都结束到结尾了,会触发一个END模块

    在模式和动作之前还有一个BEGIN的模块

    三.awk的大致框架(忘了看这里!):

     

    先由-F [ :]进行分列;$2~//进行筛选内容;最后由print进行输出想要的结果

    1.开始模块和结束模块

    awk -F 参数 ‘BEGIN{}模式{动作}END{}

    先通过模式来找到范围,再通过动作来切割成一列一列的;

    开始模块是告诉awk数据要如何读,结束模块是要告诉awk程序要如何结束。

    2.读入换行符和输出换行符概述

    NR这个符号其实不是行号,而是读到 就算作一段,恰好就等于行号了

    awk默认是读到 算做一段

    我们是可以修改awk这个一默认值的,不让 作为结尾

    读入换行符:修改awk默认读数据时候的默认换行符

    输出换行符:

    3.开始模块和结束模块

    我们可以通过BEGIN模块,在awk怎样读取数据

    默认awk读入换行符和输出换行符都是

    awk ‘BEGIN{RS=”:”}{print $0}’ yunjisuan.txt

    RS参数(输入换行符):BEGIN{RS=:} 以冒号作为行的输入结束来表示

    ORS参数(输出换行符):BEGIN{ORS=|} |作为行的输出结束来表示

    由于我们设定读入换行符RS=“:”,就以:为结尾变成一行,到结尾时,输出换行符是还是 ,所以最后输出时, :又被换成 替换成换行符,进行换行。

    awk ‘BIGIN{RS=”:”;ORS=”|”}{print NR,$0}’

    以:作为输入换行符,以|作为输出换行符,NR显示行号

    四.统计命令sort.uniqtr替换命令

    sed -r ‘s/[^a-zA-Z]/ /g’ /etc/passwd

    把所有字母以外得东西替换成空格

    然后把内容重定向到一个文件中

    cat test.txt | xargs -n1 | sort | uniq -c | sort -rn | head

    xargs -n1 把每个元素排成一行

    sort:默认什么都不加,以26字母顺序排序

    uniq:相同的单词去重

    uniq -c:去重复之前进行计数

    sort -r:倒序

    sort -n:按数字从小到大排序

    sort -k2:按第二列排

    trecho “1:2:3:4:5” | tr “:” “+” 

    把冒号替换成加号

    五.进阶@awk模式和动作

    最基本的4种模式

    ·正则表达式作为模式

    ·比较表达式作为模式

    ·范围模式

    ·特殊模式BEGINEND

    1.正则表达式作为模式

    过滤出第九列中,所有以200开头结尾的那一行,看第一组(默认空格分组)

    awk ‘$9~/^200$/{print $1}’ access.log

    awk ‘$9~/^200$/{print $1}’ access.log | sort | uniq -c

    假如输出的结果有很多,用sortuniq-c进行排序和去重计数。

    精确查找第九列中,所有名叫404的那一行,看第一组(默认空格分组)

    awk ‘$9==”404”{print $1}’ access.log

    解析命令:

    以第9列作为模式,针对第9列进行正则匹配;

    ~波折号作为正则匹配操作符,!~是正则取反

    //代表要输入正则;含有内容的

    ^200$200以开头以200结尾

    正则模式练习

    2. 比较表达式作为模式

    NR>=   

    3.范围表达式作为模式

    //,//

    从哪到哪  

     

    ‘$5~//,//’

    从第五行开始正则,然后从哪到哪

    3. BEGIN模式和END模式

     

    awk ‘BEGIN{print “AAA”,”BBB”}’

    可以直接输出的东西,可以用来做表头

    awk -F “:” ‘BEGIN{print “AAA”,”BBB”}{print $1,$3}’ yun.txt

    以:作为分割,只输出1组和3组,表头输入内容

    awk -F “:” ‘BEGIN{print “AAA”,”BBB”}{print $1,$3}END{print “xxxx”}’ yun.txt

    BEGIN输出内容

    END也可以输出内容

    输出内容可以直接进行计算

    awk ‘BEGIN{print 10/3}’

    变量进行赋值并进行变量计算

    awk ‘BEGIN{a=1;b=2;print a,b,a+b}’

    注:赋值字母或符号时,需要加双引号,如a=”xxx”

    5.awk过滤#显示行数#

    awk ‘/^$/ {print $0}’ yun.txt | wc-l

    awk ‘/^$/{i=i+1}’ yun.txt

    解析:i=i+1 执行一次,自身加一;(i默认是0

    改变i的默认:{i=1;i=i+1}

    awk ‘/^$/{i=i+1;print i}’ yun.txt

    因为awk是一条一条得在执行,所以,print输出的是一个过程

    awk ‘/^$/{i=i+1}END{print i}’ yun.txt

    直接输出结果,在END后面

    awk看一共有多少行

    awk ‘{i=i+1}END{print i}’ test

    求里面所有的数据之和

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

    i=i+$0原理:当awk读到第一行的时候,i初始值是0$01;所以i=i+1i=0+1这时候i=1;第二次的时候i=1+2i=3;以此类推....

    六.awk数组

    1.数组的概述

    假如我们想用一组变量来表示多组数据,通常我们优先考虑数组的形式。

    例如:变量名[数字]=不同的值

    如果我们只知道酒店名称,那么我们只能找到房间号;要想找到房间里具体的人,我们必须同时知道酒店名+房间号才可以。

    2.变量取值

    for (hotel in chensiqihotel)

    新建的变量hotel,在chensijihotel里一遍一遍的循环取值,直到取完所有的值。

    awk -F “[/ ]+” ‘{benchi[$2]=benchi[$2]+1}END{for(i in benchi)print i,benchi[i]}’ test

    benchi$2里取值,然后对$2进行计数;ibenchi里取值,最后输出ibenchi[i]统计数值

  • 相关阅读:
    万恶的 one or more listeners failed to start 和 Servlet.init() for servlet [dispatcherServlet] threw exception
    实验四 主存空间的分配和回收
    实验二 作业调度模拟程序
    实验一
    实验三
    【安卓】实验7 BindService模拟通信
    计时器页面设计
    实验五 存储管理实验
    实验6 在应用程序中播放音频和视频
    实验5数独游戏界面设计
  • 原文地址:https://www.cnblogs.com/kakajiang/p/9871999.html
Copyright © 2011-2022 走看看