zoukankan      html  css  js  c++  java
  • awk使用入门

    1.基本用法

    awk '{pattern + action}' {filenames}

    pattern 表示 AWK 在数据中查找的内容

    action 是在找到匹配内容时所执行的一系列命令。

    pattern就是要表示的正则表达式,用斜杠括起来。

    2.调用

    命令行方式

    awk [-F  field-separator]  'commands'  input-file(s)

    其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。

    在awk中,读取文件中以 结束的一行,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。

    $0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是"空白键" 或 "[tab]键"

    shell脚本方式

    将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,通过键入脚本名称来调用。#!/bin/awk

    awk命令插入一个单独文件,调用:awk -f awk-script-file input-file(s)

    3.内置变量

    ARGC               命令行参数个数

    ARGV               命令行参数排列

    ENVIRON            支持队列中系统环境变量的使用

    FILENAME           awk浏览的文件名

    FNR                浏览文件的记录数

    FS                 设置输入域分隔符,等价于命令行 -F选项

    NF                 浏览记录的域的个数

    NR                 已读的记录数

    OFS                输出域分隔符

    ORS                输出记录分隔符

    RS                 控制记录分隔符

    4.打印输出

    awk中同时提供了print和printf两种打印输出的函数。

    其中print函数的参数可以是变量、数值或者字符串。字符串必须用双引号引用,参数用逗号分隔。逗号的作用与输出文件的分隔符的作用是一样的。

    5.条件语句和循环

    条件语句

    if (expression) {

        statement1;

    } else if (expression1) {

        statement2;

    } else {

        statement3;

    }

    循环语句

    支持while、do/while、for、break、continue。

    6.示例

    显示/etc/passwd的账户

    #cat /etc/passwd |awk  -F ':'  '{print $1}'

    这种是awk+action的示例,每行都会执行action{print $1}。-F指定域分隔符为':'。

    显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以tab键分割

    cat /etc/passwd |awk  -F ':'  '{print $1" "$7}'

    cat /etc/passwd |awk  -F ':'  '{print $1"@"$7}'

    显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,而且在所有行添加列名name,shell,在最后一行添加"blue,/bin/nosh"。

    cat /etc/passwd |awk  -F ':'  'BEGIN {print "name,shell"}  {print $1","$7} END {print "blue,/bin/nosh"}'

    搜索/etc/passwd有root关键字的所有行

    awk -F: '/root/' /etc/passwd

    支持正则搜索: awk -F: '/^root/' /etc/passwd

    搜索/etc/passwd有root关键字的所有行,并显示对应的shell

    awk -F: '/root/{print $7}' /etc/passwd

    统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容

    awk  -F ':'  '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd

    awk还可以自定义变量

    统计/etc/passwd的账户人数

    awk '{count++;print $0;} END{print "user count is ", count}' /etc/passwd

    count是自定义变量。print只是一个语句,而action{}可以有多个语句,以;号隔开。

    awk 'BEGIN {count=0;print "[start]user count is ", count} {count=count+1;print $0;} END{print "[end]user count is ", count}' /etc/passwd

    统计文件夹下的文件占用的字节数

    ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size}'

    以M为单位显示:

    ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size/1024/1024,"M"}'

    统计某个文件夹下的文件占用的字节数,过滤4096大小的文件:

    ls -l |awk 'BEGIN {size=0;print "[start]size is ", size} {if($5!=4096){size=size+$5;}} END{print "[end]size is ", size/1024/1024,"M"}'

    循环输出用户名

    awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd

  • 相关阅读:
    CSP2019 Day2T3 树的重心
    51nod1835 完全图
    [HNOI2015]亚瑟王
    [六省联考2017]分手是祝愿
    洛谷P4550 收集邮票
    06_手工负载分担(数通华为)
    05_配置交换机SSH服务(数通华为)
    04_配置交换机Telnet服务(数通华为)
    03_vlan & access & trunk 口(数通华为)
    02_搭建HTTP客户端与服务器(数通华为)
  • 原文地址:https://www.cnblogs.com/chengJAVA/p/5819335.html
Copyright © 2011-2022 走看看