AWK精华

作者: 木林森 | 来源:发表于2017-02-08 16:56 被阅读271次

    awk:

    grep,sed,awk

    grep:文本过滤

    sed:文本编辑

    awk:文本格式化工具;

    1 什么是awk、nawk、gawk

    awk是一种用于处理数据和生成报告的UNIX编程语言。nawk时awk的新版本,gawk是基于Linux的GNU版本。

    awk简介:

    awk是3个姓氏的首字母,代表创建该语言的3位作者:Alfred V.Aho、Brian W.Kernighan、Peter J.Weinberger。当然也可以叫它wak或kaw,但常用的时awk。

    最初编写于1977年,1985年得以改进以支持更大的程序,还增加了可用户自定义函数、动态正则表达式、同时处理多个输入文件等功能。

    awk版本:

    awk的版本有很多,包括old awk、new awk、GNU awk(gawk)、POSIX awk等

    2 awk的格式:

    基本语法:awk [options] ‘program’ filename…

    program: pattern{action statements}

    awk [options] 'pattern {action}’ filename

    选项模式操作

    options

    -F (field separator)

    有三种方法:

    1、使用空白符分隔字段(默认值);这种情况下,记录的前导空白字符和结尾空白字符(空格和/或制表符)将被忽略。都视为一个空白字符。

    2、使用其他单个字符来分隔字段。例如:awk -F “:” 或awk ‘BEGIN{FS=“:”}’

    3、使用不止一个字符作为字段分隔符,它将被作为一个正则表达式来解释。例如: FS=“[‘ :\t]"

    -v varsvalue (自定义变量)

    3 awk工作原理

    工作遍历模式:迭代,循环

    1、切片 (注意:默认将空格符和制表符都视为空格,而且多个连续的空格都视为一个(自动删除重复的空格))

    2、赋予变量  (将fs分隔后的字段都存入变量,整行存入$0)

    3、遍历(循环每一个字段,以字段为单位,非每行)

    4、逐行 (读取一行,将pattern和action都执行完成,读取下一行)

    pattern(模式):

    awk模式用来控制awk对输入的文本执行什么操作。模式由正则表达式、判别条件真伪的表达式或是二者的组合构成。

    模式的特点

    1、控制 (模式控制action的范围:控制第一个左花括号{,到第一个右花括号}内的操作)

    2、模式表达式暗含if(如果)的意思

    范例:

    # awk -F: '/root/{print NR,$1,$3,$5}$3<30{print NR,$0}' /etc/passwd

    1 root 0 root

    1 root:x:0:0:root:/root:/bin/bash

    2 bin:x:1:1:bin:/bin:/sbin/nologin

    3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

    4 adm:x:3:4:adm:/var/adm:/sbin/nologin

    5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

    6 sync:x:5:0:sync:/sbin:/bin/sync

    7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

    8 halt:x:7:0:halt:/sbin:/sbin/halt

    9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

    10 operator 11 operator

    10 operator:x:11:0:operator:/root:/sbin/nologin

    11 games:x:12:100:games:/usr/games:/sbin/nologin

    12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

    33 rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin

    44 mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin

    说明

    1、选项-F,以:为分隔符(默认是以空格为分隔符,可以省略)

    2、同一条awk命令,可以有多个不同pattern和不同action的组合

    3、行号说明awk是逐行执行

    4、pattern控制的范围验证,只能控制紧跟着pattern的{}中的内容(红色部分是pattern1的控制操作结果,整行的是pattern2的控制操作结果)

    定界:addr1,addr2

    表达式:$3 > 500

    /pattern/ 模式,正则表达式

    BEGIN{}:在遍历操作开始之前执行一次

    END{}:在遍历操作结束之后、命令退出自签执行一次

    action:print,printf:用于能够实现格式化输出的工具

    4 awk格式化输出

    print函数

    print的使用格式:

    print item1, item2, ...

    要点:

    1、各项目之间使用逗号隔开,而输出时则以空白字符分隔;

    2、输出的item可以为字符串或数值、当前记录的字段(如$1)、变量或awk的表达式;数值会先转换为字符串,而后再输出;

    3、print命令后面的item可以省略,此时其功能相当于print $0, 因此,如果想输出空白行,则需要使用print "";

    例子:

    # awk 'BEGIN { print "line one\nline two\nline three" }'

    awk -F: '{ print $1, $3 }' /etc/passwd

    printf函数

    printf命令的使用格式:

    printf "format", item1, item2, ...

    要点:

    1、其与print命令的最大不同是,printf需要指定format;

    2、format用于指定后面的每个item的输出格式;

    3、printf语句不会自动打印换行符;\n

    format格式的指示符都以%开头,后跟一个字符;如下:

    %c: 显示字符的ASCII码;

    %d, %i:十进制整数;

    %e, %E:科学计数法显示数值;

    %f: 显示浮点数;

    %g, %G: 以科学计数法的格式或浮点数的格式显示数值;

    %s: 显示字符串;

    %u: 无符号整数;

    %%: 显示%自身;

    修饰符:

    #[.#]: 显示宽度;

    -: 左对齐;

    +:显示数值符号;

    例子:

    # awk -F: '{printf "%-15s %i\n",$1,$3}' /etc/passwd

    输出重定向

    print items > output-file

    print items >> output-file

    print items | command

    特殊文件描述符:

    /dev/stdin:标准输入

    /dev/sdtout: 标准输出

    /dev/stderr: 错误输出

    /dev/fd/N: 某特定文件描述符,如/dev/stdin就相当于/dev/fd/0;

    例子:

    # awk -F: '{printf "%-15s %i\n",$1,$3 > "/dev/stderr" }' /etc/passwd

    5 awk变量

    内置变量(Built-in Variables)

    自定义变量(User-Defined Variables)

    字段变量(Field Variables)

    5.1.1 awk内置变量之记录变量:

    FS: input field separator,读取文件本时,所使用字段分隔符;默认为空白字符

    RS: input Record separator,输入文本信息所使用的换行符;

    OFS:Output Filed Separator:默认为空白字符

    ORS:Output Row Separator:默认为换行符

    awk -F:

    awk -v FS=“:” -v OFS=“#”

    awk ‘BEGIN {FS=“:”;OFS=“#”} {print}'

    5.1.2 awk内置变量之数据变量:

    NR: The number of input records,awk命令所处理的记录数;如果有多个文件,这个数目会把处理的多个文件中行统一计数;

    NF:Number of Field,当前记录的field个数;(注意{print NF}和 {print $NF}的区别)

    FNR: 与NR不同的是,FNR用于记录正处理的行是当前这一文件中被总共处理的行数(分别计数);

    FILENAME: awk命令所处理的文件的名称;在命令中获取当前文件名

    ARGC: awk命令的参数的个数;

    ARGV: 数组,保存命令行本身这个字符串,如awk '{print $0}' a.txt b.txt这个命令中,ARGV[0]保存awk,ARGV[1]保存a.txt;

    ENVIRON:当前shell环境变量及其值的关联数组;

    如:awk 'BEGIN{print ENVIRON["PATH"]}'

    做计算器使用 awk BEGIN {print 1+1}

    5.2 用户自定义变量

    gawk允许用户自定义自己的变量以便在程序代码中使用,变量名命名规则与大多数编程语言相同,只能使用字母、数字和下划线,且不能以数字开头。gawk变量名称区分字符大小写。

    (1)命令行中赋值变量

    -v var=value

    -v num1=20 -v num2=32

    例如:

    awk -v var="variable testing" 'BEGIN{print var}'

    (2)脚本程序(program)中赋值变量

    例如:

    awk 'BEGIN{var="variable testing";print var}'

    5.3 字段变量

    可以像用户自定义的变量一样使用,唯一的区别是它们引用了字段。

    新的字段可以通过赋值来创建。如果字段变量引用的字段没有值,则被赋值为空串。

    当字段的值发生变化时,awk会以OFS的值作为字段分隔符重新计算$0变量的值。

    当不存在这个字段,创建并赋值;存在该字段,覆盖原来的内容。

    # awk ‘{ $5 = 1000 * $3 / $2; print }’ filename

    # awk ‘$4 == “CA” { $4 = “California”;print}’ filename

    6 awk的模式和操作:

    awk 'program' input-file1 input-file2 ...

    其中的program为:

    pattern { action }

    pattern { action }

    ...

    6.1 常见的模式类型:

    Summary of Patterns

    empty {statements}

    An empty pattern is considered to match every input line.

    空模式,匹配每一行

    BEGIN {statements}

    The statements are executed once before any input has been read.

    特殊模式,仅在awk命令执行前运行一次

    END {statements}

    The statements are executed once after all input has been read.

    特殊模式,仅在awk命令结束前运行一次

    expression {statements}

    The statements are executed at each input line wherethe expression is true, that is, nonzero or nunnull

    当表达式为“真”输入行,执行statements;expression为真指的是其值非0或非空。

    /regular expression/ {statements}

    The statements are executed at each input line thatcontains a string matchedby regular expression.

    正则表达式,仅处理匹配的行

    compound pattern {statements}

    A compound pattern combines expressions with &&(AND),||(OR),!(NOT),and parentheses; the statements are executed at each input line wherethe compound pattern is true.

    复合模式,将表达式用&&、||、!,以及括号组合起来;当compound pattern为真时,statements执行。

    pattern1,pattern2 {statements}

    A range pattern matches each input line from a line matched by pattern1 to the next line matched by pattern2,inclusive; the statements are executed at each matching line.

    范围模式,startline,endline:/pattern1/,/pattern2/

    # awk ‘/Tom/,/Suzanne/‘ filename

    1、非只匹配一次,会多次(选择关键字很重要);先匹配从第一个模式的首次出现到第二个模式的首次出现之间的内容,然后匹配从第一个模式的下一次出现到第二个的下一次出现,以此类推。

    2、当没有找到第二个模式,会显示从第一个模式出现的行到文本末尾。

    注意:不支持直接给出数字的格式

    # awk -F: ‘(NR>=2&&NR<=10){print $1}’ /etc/passwd

    BEGIN and END do not combine(组合) with other patterns. A range pattern cannot be part of any other pattern. BEGIN and END are the only patterns that require an action(不能省略action).

    例如:

    条目1:# df -h|awk '!/^File/,gsub(/%/,"") {if($5>20){print $NF}}’

    条目2:# df -h|awk '!/^File/gsub(/%/,"") {if($5>20){print $NF}}'

    条目3:# df -h|awk 'gsub(/%/,""),!/^File/ {if($5>20){print $NF}}’

    条目4:# df -h|awk '!/^File/&&gsub(/%/,"") {if($5>20){print $NF}}’

    条目5:# df -h|awk 'gsub(/%/,"")&&!/^File/ {if($5>20){print $NF}}’

    # df -h|awk 'gsub(/%/,"")&&!/^File/ {if($5>20) print $NF}'

    # df -h|awk 'gsub(/%/,"")&&!/^File/&&$5>20 {print $NF}’

    # df -h|awk '!/^File/{split($5,percent,"%");if(percent[1]>20){print $NF}}'

    解释:

    1、当pattern部分,多于一个模式时,两个模式间的逗号“,”作用,以及两个模式的顺序很重要,没有逗号或是调整顺序(条目2、3)都达不到想要的结果。

    条目4、5中使用&&与条目1可以达到预期的结果。&&没有顺序的限制。

    总结建议:多模式,需要用&&,这样避免出现“,”和模式顺序的困扰。

    2、action中,出现if语句,当statement只有一句,print $NF可以省略花括号{};当出现else,必须要加上花括号{};

    Regular expression: 正则表达式

    格式为 /regular expression/

    是$0 ~/regular expression/的简写形式

    ^ 串首

    $ 串尾

    . 匹配单个任意字符

    * 匹配零个或多个前导字符

    + 匹配一个或多个前导字符

    ? 匹配零个或一个前导字符

    [ABC] 匹配ABC中任一字符

    [^ABC] 匹配不在ABC中的字符

    [A-Z] 匹配A到Z的任一字符

    A|B 匹配A或B

    (AB)+ 匹配一个或多个A B的组合;例如

    \* 匹配星号本身

    & 用在替换串中,代表查找串中匹配的内容

    expresssion: 比较表达式,其值非0或为非空字符时满足条件,如:$1 ~ /foo/ 或 $1 == "magedu",用运算符~(匹配)和!~(不匹配)。

    比较表达式用来对文本行进行比较,只有条件为真,才执行指定的动作。

    运算符

    描述

    范例

    =,+=,-=,*=,%=,^=

    赋值运算符(Assignment Operators)

    expr1 ?expr2 :expr3

    C条件表达式(C Conditional Expression)

    expression中无法写执行语句,只能赋值变量

    # awk -v num1=22 -v num2=31 'BEGIN {max=(num1>num2)?num1:num2;print “MAX number is "max}'

    MAX number is 31

    # awk -F: '{$3>=1000?usertype="Common User":usertype="Sysadmin or SysUser";printf "%20s:%-s\n",$1,usertype}' /etc/passwd

    &&(AND) ||(OR) !(NOT)

    逻辑运算符(Logical Operators)

    < <= == != > >= ~(match) !~(not match)

    关系运算符 (Relational Operators)

    + - * / % ^

    算术运算符(Arithmetic Operatiors)

    ++(Increment Operator)

    --(Decrement Operator)自增与自减运算符(Increment and Decrement Operators)

    +(正号),-(负号)

    单目运算符

    空格

    拼接运算符

    -赋值运算符(Assignment Operators)

    =,+=,-=,*=,%=,^=

    -条件表达式(Conditional expression Operators)

    expr1 ?expr2 :expr3

    expression中无法写执行语句,只能赋值变量

    # awk -v num1=22 -v num2=31 'BEGIN {max=(num1>num2)?num1:num2;print “MAX number is "max}'

    MAX number is 31

    # awk -F: '{$3>=1000?usertype="Common User":usertype="Sysadmin or SysUser";printf "%20s:%-s\n",$1,usertype}' /etc/passwd

    -逻辑运算符(Logical Operators)

    &&(AND) ||(OR) !(NOT)

    -关系运算符 (Relational Operators)

    < <= == != > >= ~(match) !~(not match)

    -算术运算符(Arithmetic Operatiors)

    + - * / % ^

    -自增与自减运算符(Increment and Decrement Operators)

    +(正号),-(负号),++(Increment Operator),—(Decrement Operator)

    -运算优先级顺序(Precedence)

    $

    ^

    +,-,!(正负号以及逻辑上not)

    *,/,%(乘 除 除数)

    +,-

    >,>=,<,<=,==,!=

    ~,!~

    &&

    ||

    ?:

    =,+=,-=,*=,/=,%=,^=

    -复合模式

    用逻辑运算符将模式组合起来形成的表达式。

    # awk ‘!($2 < 100 && $3 < 20)’ filename

    6.2 常见的Action

    In a pattern-action statement, the pattern determines when the action is to be executed. Sometimes an action is very simple:a single print or assignment. Other times, it may be a sequence of several statements separated by newlines or semicolons.

    This section begins the description of actions by discussing expressions and control-flow statements. The following sections present user-defined functions,and statements for input and output.

    Actions

    The statements in actions can include:

    expressions: 包括 constants(常量),variables(变量),assignments(赋值),function calls(函数调用),etc

    output statements

    print expression-list

    printf(format,expression-list)

    system(“command")

    input statements

    close(file [,how])

    getline

    getline

    getline var

    getline var

    next

    nextfile

    control statements

    if (expression) statement [ else statement ]

    while (expression) statement

    do statement while (expression)

    for (expression;expression;expression) statement

    for (variable in array) statement

    break

    continue

    exit [ expression ]

    compound statements

    7 控制语句:

    7.1 条件语句

    if-else

    语法:if(condition) {statements}

    if(condition) {statements} else {statements}

    if (condition) {then-body} else {[ else-body ]}

    注意:statement中只有一条语句,{}可以省略

    # awk '{if ($3==0) {print $1, "Adminitrator";} else { print $1,"Common User"}}' /etc/passwd

    例子:

    awk -F: '{if ($1=="root") print $1, "Admin"; else print $1, "Common User"}' /etc/passwd

    awk -F: '{if ($1=="root") printf "%-15s: %s\n", $1,"Admin";else printf "%-15s: %s\n", $1, "Common User"}' /etc/passwd

    awk -F: '{if ($1=="root"){printf "%-15s: %s\n", $1,"Admin”}else{printf "%-15s: %s\n", $1, "Common User"}}' /etc/passwd

    awk -F: '{if ($1=="root"){printf "%-15s: %s\n", $1,"Admin”}else printf "%-15s: %s\n", $1, "Common User"}' /etc/passwd

    注意:statement中只有一条语句,如果有else分支语句,要么将else前面的语句加分号;或是将前面的语句加上花括号{};else后面如果只有一个语句,加不加{}都可以。

    总结:避免麻烦,将单个语句或多个语句都加上花括号{}。

    awk -F: -v sum=0 '{if ($3>=500) sum++}END{print sum}' /etc/passwd

    7.2 循环(while循环、for循环和特殊for循环)

    7.2.1 while循环

    语法: while (condition){statement1; statment2; …}

    条件“真”,进入循环;条件“假”,退出循环;

    何为“真”:非0时就为“真”

    awk -F: '{i=1;while (i<=3) {print $i;i++}}' /etc/passwd

    awk -F: '{i=1;while (i<=NF) { if (length($i)>=4) {print $i}; i++ }}' /etc/passwd

    awk '{i=1;while (i<=NF) {if ($i>=100)   print $i; i++}}' hello.txt

    hello.txt文件的内容为一堆随机数。

    7.2.2 do-while循环 至少执行一次循环体,不管条件满足与否

    语法: do {statement1, statement2, ...} while (condition)

    awk -F: '{i=1;do {print $i;i++}while(i<=3)}' /etc/passwd

    awk -F: '{i=4;do {print $i;i--}while(i>4)}' /etc/passwd

    7.2.3 for循环

    语法: for ( variable assignment; condition; iteration process) { statement1, statement2, ...}

    awk -F: '{for(i=1;i<=3;i++) print $i}' /etc/passwd

    awk -F: '{for(i=1;i<=NF;i++) { if (length($i)>=4) {print $i}}}' /etc/passwd

    7.2.4 for特殊循环 还可以用来遍历数组元素:

    语法: for (i in array) {statement1, statement2, ...}

    awk -F: '$NF!~/^$/{BASH[$NF]++}END{for(A in BASH){printf "%15s:%i\n",A,BASH[A]}}' /etc/passwd

    7.2.5 case

    语法:switch (expression) { case VALUE or /REGEXP/: statement1, statement2,... default: statement1, ...}

    7.2.6 循环控制break 和 continue

    常用于循环或case语句中

    7.3 程序控制语句 (next和exit)

    next语句

    提前结束对本行文本的处理,并接着处理下一行;例如,下面的命令将显示其ID号为奇数的用户:

    # awk -F: '{if($3%2==0) next;print $1,$3}' /etc/passwd

    # awk ‘{if ($5 >= 4.5) next; print $1}’ datefile

    如果第5个字段大等于4.5,就读入输入文件(datafile)的下一行,并从awk脚本的起点开始处理,否则,打印第一个字段。

    理解为:当$5 >= 4.5,就跳过本行,从BEGIN处从头执行。

    exit语句

    exit语句用于终止awk程序。它只能中断对记录的处理,不能跳过END语句。如果exit语句的参数是一个0~255之间的值(exit 1),

    这个值就会被打印在命令行上,以表明程序是否执行成功,并且指出失败的类型。

    默认awk不能返回值 1,只要语法没有错误都返回0,exit 1,设置返回值。

    {exit (1)}

    # echo $status (csh)

    1

    # echo $?(sh/ksh)

    1

    说明:退出状态为0表示成功,退出状态为非0则表示失败(这时UNIX的统一约定)。

    8 awk中使用数组

    9.1 数组(Arrays)

    array[index-expression]

    index-expression可以使用任意字符串;需要注意的是,如果某数据组元素事先不存在,那么在引用其时,awk会自动创建此元素并初始化为空串;因此,要判断某数据组中是否存在某元素,需要使用index in array的方式。

    要遍历数组中的每一个元素,需要使用如下的特殊结构:

    for (var in array) { statement1, ... }

    其中,var用于引用数组下标,而不是元素值;

    例子:

    netstat -ant | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

    每出现一被/^tcp/模式匹配到的行,数组S[$NF]就加1,NF为当前匹配到的行的最后一个字段,此处用其值做为数组S的元素索引;

    awk '{counts[$1]++}; END {for(url in counts) print counts[url], url}' /var/log/httpd/access_log

    用法与上一个例子相同,用于统计某日志文件中IP地的访问量

    9.2 删除数组变量

    从关系数组中删除数组索引需要使用delete命令。使用格式为:

    delete  array[index]

    9 awk的内置函数

    内置字符串函数(Built-In String Functions)

    gsub(r,s)

    gsub(r,s,t)

    index(s,t)

    length(s)

    match(s,r)

    split(s,a)

    split(s,a,fs)

    sprintf(fmt,expr-list)

    sub(r,s)

    sub(r,s,t)

    substr(s,p)

    substr(s,p,n)

    1.sub和gsub函数:替换字符的作用(gsub全局替换,sub替换第一个)

    gsub(r,s)

    gsub(r,s,t)

    gsub(正则表达式,替换串);

    gsub(正则表达式,替换串,目标串);

    # awk 'gsub(/aa/,bb) {print $0}' grade.txt

    特别注意一点的是:当bb是不是数字的时候,要用双引号把它括起来才行。

    2.index:查询某个字符或字符串在整个字符串当中的位置

    # awk '{print index("hollow","low") }’ filename

    4

    3.length:返回字符串的长度

    # awk ‘{print length(“hello”)}’ filename

    # awk ‘{print length($1)}’ filename

    4.substr:按照起始位置及长度返回字符串的一部分

    substr(字符串,起始位置)

    substr(字符串,起始位置,字串长度)(包括空格)

    # awk '$1=="L.Tansley" {print substr($1,1,5)}' grade.txt

    另一种形式是:返回字符串后缀或指定位置后面字符

    # awk '{print substr($1,3)}' grade.txt

    5.match:查找目标字符串是否包含查找字符的一部分

    # awk 'BEGIN {print match("ANCD",/D/)}’

    6.split:返回字符串数组元素个数

    split(字符串,数组,字段分隔符)

    split(字符串,数组)

    # awk ‘BEGIN{split(“12/25/2001”,date,”/“);print date[2]}’ filename

    25

    # awk 'BEGIN {print split("123#456#789",cc,"#")}'

    7.sprintf函数:返回一个指定格式的表达式。可以在sprintf函数中使用printf函数的格式规范。

    格式:

    variable = sprintf(”含有格式说明的字符串“,表达式1,表达式2,…,表达式n)

    # awk ‘{line = sprintf (“%-15s %6.2f “,$1,$3);print line}’ filename

    8.使用管道向awk传入字符串

    # echo "Stand-by" |awk '{print length($0)}’

    9.使用wall -a -g tellin 消息,发消息给同组的人。

    10.设置域分隔符: awk -F\| 设置|为域分隔符

    system(“command”)

    功能:执行系统command并将结果返回至awk命令

    systime()—仅适于gawk

    功能:取系统当前时间

    strftime函数:使用C库中的strftime函数对时间进行格式化。

    格式:

    # awk ‘BEGIN{print strftime(“%D”)}'

    tolower(字符串)—仅适于gawk

    功能:将s中的所有字母转为小写

    toupper(字符串)—仅适于gawk

    功能:将s中的所有字母转为大写

    其他内容:

    读输入(getline)

    # awk ‘BEGIN{ “date”|getline d;print d}’ datefile

    将unix/linux的date命令输出通过管道传给getline函数,结果保存在变量d中兵打印出来。

    # awk 'BEGIN{ printf "Who are you looking for?" ;getline name < "/dev/tty”}'

    从终端/dev/tty读取输入,保存到数组name中。

    控制函数

    # awk ‘{if ($5 >= 4.5) next; print $1}’ datefile

    如果第5个字段大等于4.5,就读入输入文件(datafile)的下一行,并从awk脚本的起点开始处理,否则,打印第一个字段。

    理解为:当$5 >= 4.5,就跳过本行,从BEGIN处从头执行。

    10 用户自定义函数

    自定义函数使用function关键字。格式如下:

    function F_NAME([variable,variable,variable,...])

    {

    statements

    }

    函数还可以使用return语句返回值,格式为“return value”。

    netstat -tn |awk '/^tcp/{state[$NF]++}END{for (s in state){printf "%-15s 5d\n",s,state[s]}}'

    统计每个连接的个数

    练习:

    1、统计当前系统上每个客户端IP的连接中处于TIME_WAIT的连接状态的个数;

    2、统计ps aux命令执行时,当前系统上各状态的进程的个数;

    [root@httpweb1 ~]# ps aux|awk '!/^USER/{state[$8]++}END{for (i in state) {printf "%-15s %d\n",i,state[i]}}'

    S<              2

    S

    Ss              18

    STAT            1

    SN              1

    S               94

    Ss+             7

    Ssl             4

    R+              1

    S+              1

    Sl              6

    S

    3、统计ps aux命令执行时,当前系统上各用户的进程的个数;

    [root@httpweb1 ~]# ps aux |awk '!/^USER/{state[$1]++}END{for (i in state) {printf "%s %d\n",i,state[i]}}'

    rpc 1

    dbus 1

    named 1

    68 2

    daemon 4

    postfix 2

    rpcuser 1

    root 122

    4、显示ps aux命令执行时,当前系统上其VSZ(虚拟内存集)大于10000的进程及其PID;

    ps aux|awk '!/^USER/{if ($5<10000) next;print $2,$5,$NF}'

    ps aux|awk '!/^USER/{if ($5>10000) print $2,$5,$NF}'

    相关文章

      网友评论

        本文标题:AWK精华

        本文链接:https://www.haomeiwen.com/subject/whjvtttx.html