zoukankan      html  css  js  c++  java
  • AWK命令使用

    前言

    文本处理三剑客中,grep强在文本查找,sed强在文本处理,现awk强在文本查找后的输出处理。awk可以在处理文本的过程中使用编程结构(变量、条件判断、循环)以及其内置的变量,这就是它强大的地方。

    语法结构

    awk [options] 'program' file file ...
    awk [options] 'PATTERN{action}' file file ...
    ① 各项目之间使用逗号分隔,而输出时则使用输出分隔符分隔
    ② 输出的各item可以字符串或数值、当前记录的字段、变量或awk的表达式,数值会被隐式转换为字符串后输出
    ③ print后面item如果省略,相当于print $0,若输出空白,使用pirnt ""

    options
    -F:指定输入分隔符
    -v:自定义变量

    PATTERN
    ① Regexp: 格式为/PATTERN/,仅处理被/PATTERN/匹配到的行
    ② Expression: 表达式,其结果为非0或非空字符串时满足条件,仅处理满足条件的行
    ③ Ranges: 行范围,此前地址定界,startline, endline,仅处理范围内的行
    ④ BEGIN/END: 特殊模式,仅在awk命令的program运行之前(BEGIN)或运行之后(END)执行一次
    ⑤ Empty:空模式,匹配任行
    常用的action
    ①Expressions:表达式 赋值等
    ② Control statements:条件语句,控制语句if while...
    ③Compound statements:组合语句
    ④ input statements:输入语句
    ⑤ output statements:输出语句

    关于变量及其操作

    内置变量
    FS:Field Seperator, 输入时的字段分隔符
    RS:Record Seperator, 输出行分隔符
    OFS: Output Field Seperator, 输出时的字段分隔符;12121212
    ORS: Outpput Row Seperator, 输出时的行分隔符;
    NR:Numbers of Record, 行数;代表当前所处理的行是第几行
    NF:Numbers of Field, 字段数;代表当前所处理的行所包含的所有字段
    FNR:行数;各文件分别计数;
    1212
    ARGV:数组,保存命令本身这个字符,awk '{print $0}' 1.txt 2.txt,意味着ARGV[0]保存awk
    ARGC: 保存awk命令中参数的个数
    FILENAME: awk正在处理的当前文件的名称

    自定义变量
    -v var_name=VALUE       #变量名区分字符大小写
    ①可以program中定义变量
    awk -v A="test" 'BEGIN{print A}'
    ② 可以命令行中通过-v选项自定义变量
    awk 'BEGIN{A="test";print A}'
    操作符
    算术操作符
        x+y
        x-y
        x*y
        x/y
        x**y, x^y
        x%y
        -x:负值
        +x:转换为数值
        字符串操作符:连接

    赋值操作符
        =
        +=
        -=
        *=
        /=
        %=
        ^=
        **=
        ++
        --
         如果模式自身是=号,要写为/=/

    比较操作符
        <
        <=
        >
        >=
        ==
        !=
        ~:模式匹配,左边的字符串能够被右边的模式所匹配为真,否则为假;
        !~:不匹配为真,匹配为假

    逻辑操作符
        &&: 与
        ||:或
     
    条件表达式:
        selector?if-true-expression:if-false-expression

    函数调用
        function_name(argu1,argu2)

    printf命令

    printf format, item1, item2,...
    ① 要指定format
    ②不会自动换行;如需换行则需要给出
    ③format用于为后面的每个item指定其输出格式

    format格式的指示符都%开头,后跟一个字符:
    %c: 显示字符的ASCII码;
    %d, %i: 十进制整数;
    %e, %E: 科学计数法显示数值;
    %f: 显示浮点数;
    %g, %G: 以科学计数法格式或浮点数格式显示数值;
    %s: 显示字符串;
    %u: 显示无符号整数;
    %%: 显示%自身;

    修饰符:
    #:显示宽度
    -:左对齐
    +:显示数值的符号
    .#: 取值精度
    举例
    awk 'BEGIN{str=65;printf "%c ",str}'
    awk 'BEGIN{str=3.14159;printf "%.2f ",str}'
    awk -F : '{printf "%+10s %-5d ", $1,$3}' /etc/passwd

    print的输出重定向
    print items > output-file     #保存到某文件
    print items >> output-file    #追加到某文件
    print items | command         #使用管道交给某些命令处理
    特殊文件描述符:
        /dev/stdin: 标准输入
        /dev/stdout: 标准输出
        /dev/stderr: 错误输出2347

    控制语句

    if-else
    格式:if (condition) {then body} else {else body}
    # awk -F: '{if ($3>=500) {print $1,"is a common user"} else {print $1, "is an admin or system user"}}' /etc/passwd
    # awk '{if (NF>=8) {print}}' /etc/i12

    while
    格式:while (condition) {while body}
    # awk '{i=1; while (i<=NF){printf "%s ",$i;i+=2};print ""}' /etc/inittab
    # awk '{i=1; while (i<=NF){if (length($i)>=6) {print $i}; i++}}' /etc/inittab
    length()函数:取字符串的长度

    do-while
    格式:do {do-while body} while (condition)

    for
    格式:for (variable assignment; condition; iteration process) {for body}
    # awk '{for (i=1;i<=NF;i+=2){printf "%s ",$i};print ""}' /etc/inittab
    # awk '{for (i=1;i<=NF;i++){if (length($i)>=6) print $i}}' /etc/inittab
    for循环可用来遍历数组元素:
    语法:for (i in array) {for body}

    case
    语法:switch (expression) {case VALUE or /RGEEXP/: statement1;... default: stementN}

    循环控制
    break
    continue

    next
    提前结束对本行的处理进而进入下一行的处理;
    # awk -F: '{if($3%2==0) next;print $1,$3}' /etc/passwd
    # awk -F: '{if(NR%2==0) next; print NR,$1}' /etc/passwd

    数组

    关联数组:
    array[index-expression]
    index-expression: 可以使用任意字符串; 如果某数组元素事先不存在,那么在引用时,awk会自动创建此元素并将其初始化为空串;因此,要判断某数组是否存在某元素,必须使用“index in array”这种格式;
    A[first]="hello awk"
    print A[second]

    要遍历数组中的每一个元素,需要使用如下特殊结构:
    for (var in array) {for body}
    其var会遍历array的索引;

    state[LISTEN]++
    state[ESTABLISHED]++

    举例:
    # netstat -tan | awk '/^tcp/{++state[$NF]}END{for (s in state) {print s,state[s]}}'
    # awk '{ip[$1]++}END{for (i in ip) {print i,ip[i]}}' /var/log/httpd/access_log

    删除数组元素:
    delete array[index]

    awk的内置函数

    split(string,array[,fieldsep[,seps]]):
    功能:将string表示的字符串以fieldsep为分隔符进行切片,并切片后的结果保存至array为名的数组中;数组下标从1开始;
    root:x:0:0::/root:/bin/bash
    user[1]="root", user[2]
    此函数有返回值,返回值为切片后的元素的个数
    # netstat -tn | awk '/^tcp/{lens=split($5,client,":");ip[client[lens-1]]++}END{for (i in ip) print i,ip[i]}'
    length(string)
    功能:返回给定字串的长度12121212
    substr(string,start[,length])
    功能:从string中取子串,从start为起始位置为取length长度的子串;
    1. # awk -F: '{if ($3>=500) {print $1,"is a common user"} else {print $1, "is an admin or system user"}}' /etc/passwd 
    2. # awk '{if (NF>=8) {print}}' /etc/i12





  • 相关阅读:
    GNU C的定义长度为0的数组
    Ubuntu如何启用双网卡
    DQN 文章第一篇
    awk用法
    Linux下C结构体初始化
    Linux kernel中的list怎么使用
    从美剧中学(1)
    Python @property 属性
    p40_数据交换方式
    3.TCP协议
  • 原文地址:https://www.cnblogs.com/tsw1107/p/a6aa427760b79176f8cd3f6d6bc776fd.html
Copyright © 2011-2022 走看看