<fieldset id='mr66r'></fieldset>

    1. <ins id='mr66r'></ins>

      1. <dl id='mr66r'></dl>

        <code id='mr66r'><strong id='mr66r'></strong></code>
        <acronym id='mr66r'><em id='mr66r'></em><td id='mr66r'><div id='mr66r'></div></td></acronym><address id='mr66r'><big id='mr66r'><big id='mr66r'></big><legend id='mr66r'></legend></big></address>
      2. <tr id='mr66r'><strong id='mr66r'></strong><small id='mr66r'></small><button id='mr66r'></button><li id='mr66r'><noscript id='mr66r'><big id='mr66r'></big><dt id='mr66r'></dt></noscript></li></tr><ol id='mr66r'><table id='mr66r'><blockquote id='mr66r'><tbody id='mr66r'></tbody></blockquote></table></ol><u id='mr66r'></u><kbd id='mr66r'><kbd id='mr66r'></kbd></kbd>
      3. <i id='mr66r'></i>

        <i id='mr66r'><div id='mr66r'><ins id='mr66r'></ins></div></i>
        <span id='mr66r'></span>

        1. Linux下的AWK入门教程

          • 时间:
          • 浏览:8
          • 来源:124软件资讯网

              简介

              awk是一个强盛的文天职析工具 ,相对于grep的查找  ,sed的编辑  ,awk在其对数据剖析并天生陈诉时  ,显得尤为强盛  。简朴来说awk就是把文件逐行的读入  ,以空格为默认分开符将每行切片  ,切开的部门再举行种种剖析处置惩罚 。

              awk有3个差别版本: awk、nawk和gawk  ,未作特殊说明  ,一样平常指gawk  ,gawk 是 AWK 的 GNU 版本  。

              awk其名称得自于它的首创人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母  。现实上 AWK 简直拥有自己的语言: AWK 法式设计语言  , 三位建立者已将它正式界说为“样式扫描和处置惩罚语言” 。它允许您建立简短的法式  ,这些法式读取输入文件、为数据排序、处置惩罚数据、对输入执行盘算以及天生报表  ,另有无数其他的功效  。

              使用要领

              awk '{pattern + action}' {filenames}只管操作可能会很庞大 ,但语法总是这样  ,其中 pattern 表现 AWK 在数据中查找的内容  ,而 action 是在找到匹配内容时所执行的一系列下令  。花括号({})不需要在法式中始终泛起  ,但它们用于凭据特定的模式对一系列指令举行分组  。 pattern就是要表现的正则表达式  ,用斜杠括起来  。

              awk语言的最基本功效是在文件或者字符串中基于指定规则浏览和抽守信息  ,awk抽守信息后  ,才气举行其他文本操作  。完整的awk剧本通常用来花样化文本文件中的信息 。

              通常 ,awk是以文件的一行为处置惩罚单元的  。awk每吸收文件的一行  ,然后执行响应的下令  ,来处置惩罚文本  。

              挪用awk

              有三种方式挪用awk

              1.下令行方式

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

              其中  ,commands 是真正awk下令  ,[-F域分开符]是可选的 。 input-file(s) 是待处置惩罚的文件  。

              在awk中  ,文件的每一行中  ,由域分开符离开的每一项称为一个域  。通常  ,在不指名-F域分开符的情形下  ,默认的域分开符是空格  。

              2.shell剧本方式

              将所有的awk下令插入一个文件  ,并使awk法式可执行  ,然后awk下令诠释器作为剧本的首行  ,一遍通过键入剧本名称来挪用  。

              相当于shell剧本首行的:#!/bin/sh

              可以换成:#!/bin/awk

              3.将所有的awk下令插入一个单独文件  ,然后挪用:

              awk -f awk-script-file input-file(s)

              其中  ,-f选项加载awk-script-file中的awk剧本  ,input-file(s)跟上面的是一样的 。 本章重点先容下令行方式 。

              入门实例

              假设last -n 5的输出如下

              代码如下:

              [root@www ~]# last -n 5 <==仅取出前五行

              root pts/1 192.168.1.100 Tue Feb 10 11:21 still logged in

              root pts/1 192.168.1.100 Tue Feb 10 00:46 - 02:28 (01:41)

              root pts/1 192.168.1.100 Mon Feb 9 11:41 - 18:30 (06:48)

              dmtsai pts/1 192.168.1.100 Mon Feb 9 11:41 - 11:41 (00:00)

              root tty1 Fri Sep 5 14:09 - 14:10 (00:01)若是只是显示最近登录的5个帐号

            < p>#last -n 5 | awk '{print $1}'rootrootrootdmtsairootawk

              事情流程是这样的:读入有'\n'换行符支解的一条记载  ,然后将记载按指定的域分开符划分域  ,填充域 ,$0则表现所有域,$1表现第一个域,$n表现第n个域  。默认域分开符是"空缺键" 或 "[tab]键",以是$1表现登任命户  ,$3表现登任命户ip,以此类推  。

              若是只是显示/etc/passwd的账户

              代码如下:

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

              root

              daemon

              bin

              sys

              这种是awk+action的示例  ,每行都市执行action{print $1}  。

              -F指定域分开符为':'  。

              若是只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以tab键支解

              代码如下:

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

              root /bin/bash

              daemon /bin/sh

              bin /bin/sh

              sys /bin/sh

              若是只是显示/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"}'

              name,shell

              root,/bin/bash

              daemon,/bin/sh

              bin,/bin/sh

              sys,/bin/sh

              ....

              blue,/bin/noshawk

              事情流程是这样的:先执行BEGING ,然后读取文件  ,读入有/n换行符支解的一条记载  ,然后将记载按指定的域分开符划分域  ,填充域 ,$0则表现所有域,$1表现第一个域,$n表现第n个域,随后最先执行模式所对应的行动action 。接着最先读入第二条记载······直到所有的记载都读完  ,最后执行END操作  。

              搜索/etc/passwd有root要害字的所有行

              代码如下:

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

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

              这种是pattern的使用示例  ,匹配了pattern(这里是root)的行才会执行action(没有指定action  ,默认输出每行的内容)  。

              搜索支持正则  ,例如找root开头的: awk -F: '/^root/' /etc/passwd

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

              代码如下:

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

              /bin/bash

              这里指定了action{print $7}

              awk内置变量

              awk有许多内置变量用来设置情况信息 ,这些变量可以被改变  ,下面给出了最常用的一些变量  。

              ARGC 下令行参数个数

              ARGV 下令行参数排列

              ENVIRON 支持行列中系统情况变量的使用

              FILENAME awk浏览的文件名

              FNR 浏览文件的记载数

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

              NF 浏览记载的域的个数

              NR 已读的记载数

              OFS 输出域分开符

              ORS 输出记载分开符

              RS 控制记载分开符 此外,$0变量是指整条记载  。$1表现当前行的第一个域,$2表现当前行的第二个域,......以此类推 。

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

              代码如下:

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

              filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash

              filename:/etc/passwd,linenumber:2,columns:7,linecontent:daemon:x:1:1:daemon:/usr/sbin:/bin/sh

              filename:/etc/passwd,linenumber:3,columns:7,linecontent:bin:x:2:2:bin:/bin:/bin/sh

              filename:/etc/passwd,linenumber:4,columns:7,linecontent:sys:x:3:3:sys:/dev:/bin/sh

              使用printf替换print,可以让代码越发简练  ,易读

              代码如下:

              awk -F ':' '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd

              print和printf

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

              其中print函数的参数可以是变量、数值或者字符串  。字符串必须用双引号引用  ,参数用逗号分开 。若是没有逗号  ,参数就串联在一起而无法区分 。这里 ,逗号的作用与输出文件的分开符的作用是一样的  ,只是后者是空格而已  。

              printf函数 ,其用法和c语言中printf基底细似,可以花样化字符串,输出庞大时 ,printf越发好用  ,代码更易懂  。

              awk 一样平常常用学习条记:

              # 取出两个文件中相同的部门

              代码如下:

              awk 'NR==FNR{a[$0]=0;next}{if($0 in a){print $0}}' file1 file2

              # 取出两个文件中差别的部门

              代码如下:

              awk 'NR==FNR{a[$0]=0;next}{if(!($0 in a)){print $0}}' file1 file2

              # 盘算nginx日志会见排名前10位的ip

              代码如下:

              awk '{a[$1]++}END{for(i in a) print a[i],i}' access.log | sort -rn | head -10

              #统计各个科目的数目

              代码如下:

              # cat test.txt

              xqq 语文 数学

              xq 英语 语文

              x 数学 美术

              awk '{for(i=2;i<=NF;i++) a[$i]++}END{for(i in a) print i,a[i]}' test.txt

              # 获取系统ip

              代码如下:

              ifconfig eth0 | awk 'NR==2{print $2}' | cut -d: -f2