zoukankan      html  css  js  c++  java
  • linux-shell脚本命令之awk

    [ awk简单介绍: ]

    awk能够从一个文本中获取部分内容, 或者对这个文本进行排版, 使它按某种格式输出.

    [ awk工作流程: ]

    awk会把文件一行内容去到内存里, 然后对这行内容进行分段 ( 默认按空格或tab切割, $1, $2, $3... ). 再删了, 然后读取第二行内容到内存...
    格式: awk '{/pattern/ command1; command2; ...}' file        # 匹配模式的这一行运行命令
    比如: who | awk '{print $1}'    # 把分段的第一块内容打印出来, $1为第一段,  $0为一行全部内容

    [ awk參数说明: ]

    -F re:同意awk更改其字段分隔符
    -v  定义变量, 从shell给awk传递变量, 如-vDATE=$DATE, 即将shell中$DATE变量值传递给awk变量DATE。
    -f progfile:同意awk调用并运行progfile程序文件,当然progfile必须是一个符合awk语法的程序文件。

    [ awk内置变量: ]

    ARGC  命令行參数的个数
    ARGV  命令行參数数组
    ARGIND  当前被处理文件的ARGV标志符
                    awk '{if(ARGIND==1){print $1} if(ARGIND==2){print $2}}' aaa.txt bbb.txt  # 先扫描aaa文件, 再扫描bbb文件

    NR  已经读出的记录数
           awk 'NR==1,NR==5{print}' aaa.txt  # 显示aaa.txt文件的 1 到 5 行

    FNR  当前文件的记录数
             awk 'NR==FNR{print "a"} NR > FNR{print "b"}' a.txt b.txt 
             # 输入文件a.txt和b.txt, 因为先扫描a.txt, 所以扫描a.txt的时候必定有NR==FNR;
             # 然后扫描b.txt的时候, FNR从1開始计数, 而NR则接着a.txt的行数继续计数, 所以NR > FNR

    FS  输入字段分隔符(缺省为:space:),相当于-F选项
           awk -F ':' '{print $1}' ccc.txt  # 输入文件以 : 作为切割符

    OFS  输出字段分隔符(缺省为:space:)
               # 输出时以 ; 切割
              ① cat ccc.txt  例如以下:
                   1:2:3
                   4:5:6
              ② awk -F ':' 'BEGIN{OFS=";"}{print $1,$2,$3}' ccc.txt
              ③ 输出结果例如以下: 
                   1;2;3
                   4;5;6

    NF  当前记录中的分段个数
           awk -F ':' '{print NF}' ccc.txt 

    RS  输入记录分隔符, 缺省为" ", 缺省情况下, awk把一行看作一个记录; 假设设置了RS, 那么awk依照RS来切割记录
           ① cat ccc.txt:       hello world; I want to go swimming tomorrow;hiahia
           ② 执行 awk 'BEGIN{ RS = ";" } {print}' ccc.txt 
           ③ 结果例如以下:
                hello world
                I want to go swimming tomorrow
                hiahia

    ORS  输出记录分隔符,缺省为换行符。控制每一个print语句后的输出符号
             awk 'BEGIN{ FS=" "; RS=""; ORS=";"} {print NF}' ddd.txt

    [ awk内置函数: ]

    blength[([s])]                计算字符串长度(byte为单位)
    length[([s])]                  计算字符串长度(character为单位)
    rand()                            生成随机数
    srand([expr])                设置rand() seed
    int(x)                             字符串转换为整型
    substr(s, m [, n])           取子字符串
    index(s, t)                     在字符串s中定位t字符串首次出现的位置
    match(s, ere)                在字符串s中匹配正则ere,match改动RSTART、RLENGTH变量。


    split(s, a[, fs])              将字符串切割到数组中
    sub(ere, repl [, in])       字符串替换
    gsub                              同上
    sprintf(fmt, expr, ...)   拼字符串
    system(cmd)                在shell中运行cmd。
    toupper(s)                    字符串转换为大写
    tolower(s)                    字符串转换为小写


    [ awk使用方法演示样例: ]

    1.  -F 表示以什么作为分隔符
       awk -F: '{print $1}' ccc.txt                     # 以 : 作为分隔符, 打印出ccc.txt文件里每一行中的第一段字符串
       awk -F: '{print $1,$2}' ccc.txt               # 打印第一段和第二段字符串, 假设这样写$1 $2 那么打印的内容会连在一起

    2. /pattern/ 模式匹配
       awk -F: '/A/{print $1}' ccc.txt               # 以 : 作为分隔符, 打印出ccc.txt文件里含有 A 的第一段字符串

    3. ^ 表示以什么开头
       awk -F: '/^A/{print $1}' ccc.txt             # 以 : 作为分隔符, 打印出ccc.txt文件里以 A 开头的第一段字符串

    4. ~ 表示匹配的意思
       awk -F: '$4 ~ /A/{print $1}' ccc.txt      # 以 : 作为分隔符, 打印出ccc.txt文件里第四段中含有 A 的字符串

    5. awk在把第一行读入内存之前, 能够先做其它的一些操作, 使用BEGIN
       格式: awk 'BEGIN{command} /pattern/ {command1; command2; ...}' file

       awk 'BEGIN{FS=":"}$1 ~ /A/{print $1}' ccc.txt   # 读取ccc.txt文件之前, 首先运行BEGIN里的命令, 设置 : 作为切割符
       awk 'BEGIN{FS=":"; OFS="-"}$1 ~ /A/{print $1,$2}' ccc.txt # 输出的分隔符以 - 进行隔开

    6. awk在全部行处理完之后, 还能够先一些操作, 使用END
       格式: awk 'BEGIN{command} /pattern/ {command1; command2; ...} END{command}' file

    7. 统计每一行分段后的段数用NF
       who | awk '{print NF}' 

    8. 获取awk处理文件内容在源文件里是第几行用NR
       awk -F: '/^A/{print NR}' ccc.txt          # 获取以 A 开头的串在ccc.txt是第几行

    9. 自己定义变量
       awk 'BEGIN{a=0}/tb/{a++} END{print a}' ccc.txt
       # 循环ccc.txt文件之前, 先定义一个变量, 初始值为0; 然后循环每一行, 每找到一行含有tb的行就给 a 加 1, 直到最后打印 a 的值.


  • 相关阅读:
    Mono 开发者会议
    PHP正在死亡?
    区域设置 ID (LCID) 表
    OpenSource 的 Free是自由 非免费
    搭建.net framwork 3.0开发环境的一篇文章
    Rainbow的相关资料
    利用VS2005中的Code Snippets提高开发效率
    判定是否为IPv4
    我的MVVM框架 v3教程——流程相关
    查询json数据结构的8种方式
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/6955265.html
Copyright © 2011-2022 走看看