Linux下的AWK入门教程

   简介

  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:%sn",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

时间: 2024-10-02 17:04:01

Linux下的AWK入门教程的相关文章

Linux下Redis安装配置教程_Redis

redis作为NoSQL数据库的一种应用,响应速度和命中率上还是比较高效的.项目中需要用集中式可横向扩展的缓存框架,做了一点调研,即便redis.memcached存在效率上的差异(具体比较参考http://timyang.net/data/mcdb-tt-redis/),但其实都能满足目前项目的需求:但是redis还是比较风骚的,支持链表和集合操作,支持正则表达式查找key,目前项目缓存的结果大多是链表,如果链表新增或者修改数据的话,redis就体现出了极大的优势(memcached只能重新加

Linux下Docker安装配置教程_docker

在Linux上安装Docker,具体几个步骤: 环境:windows7 虚拟机:Oracle VMVirtualBox Linux: ubuntukylin-14.04.1-amd64.iso JDK:1.7 一.环境准备 step1:安装虚拟机 step2:修改宿主机BIOS配置,详细步骤见文章:http://www.jb51.net/article/96239.htm step3:在虚拟机上安装ubuntu系统.内存设置为4G,硬盘设置为100G,其余均按默认,一直点选下一步.直到系统安装成

Linux下串口编程入门

简介: Linux操作系统从一开始就对串行口提供了很好的支持,本文就Linux下的串行口通讯编程进行简单的介绍.   串口简介  串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用.常用的串口是RS-232-C接口(又称EIA RS-232-C)它是在1970年由美国电子工业协会(EIA)联合贝尔系统.调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准.它的全名是"数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准"该标准规定

LINUX下架设代理服务器的教程_代理服务器

1. LINUX下第三方代理服务器软件的选择 可以选择的其实还是不少,比如Apache:具有强大的功能.高速度和高效率等特点,但在LINUX下作代理服务器的性能优势并不明显,不建议使用:推荐使用Squid ,有关此软件的相关报道也不少,它由一个主要的服务程序squid,一个DNS查询程序dnsserver和几个管理工具组成,其比较明显的特性就是可以减少服务器等待DNS查询的时间,"Linux+Squid"是最好的代理服务器组合! 2.安装Squid 其实如今的Linux中基本都有已编译

Linux下php安装imagick教程详解

说明: php安装目录:/usr/local/php5 php.ini配置文件路径:/usr/local/php5/etc/php.ini Nginx安装目录:/usr/local/nginx Nginx网站根目录:/usr/local/nginx/html 1.安装编译工具 yum install wget make gcc gcc-c++ gtk+-devel zlib-devel openssl openssl-devel pcre-devel kernel keyutils patch

Linux下DB2数据库安装教程

最近因为工作需要在学习DB2数据库,本教程讲解DB2数据库在inux下的安装步骤. 安装前请查看 DB2版本和许可证 说明来增加了解,先弄明白改安装什么版本,这里我用的是最新的Express-C版本,这个版本是提供给个人学习用的版本. 管理客户端从v9.7版本之后就不再带有控制中心了,而是使用 Data Studio Client. Linux版本: Linux版本下的DB2数据库采用的官方免费版本,操作系统用的CentOS6.2. 安装过程: 1.下载:db2_v101_linuxia32_e

Ruby on Rails下的图像处理入门教程_ruby专题

图像可以说是任何应用至关重要的一部分.从社交网络到一个简单的Bug追踪器,图像都扮演着重要的角色.然而管理图像并不是一件容易的事情,需要提前耗费大量的时间精力去计划. 本文演示了如何在Rail中实现这一目标.如何处理你的图像以及在后台创建多个版本?如何通过压缩图像又不损图像质量,以此来提高页面性能?这些且听本文一一道来. 入门 本文教程是运行于Rails 4.2,通过MongoDb数据库和HAML呈现视图.不过本文所展示的片段应该兼容任何Rails版本(尽管有些配置差异). 布置舞台 Image

Linux系统中git 入门教程

  Git 起源 同生活中的许多伟大事件一样,Git 诞生于一个极富纷争大举创新的年代.Linux 内核开源项目有着为数众广的参与者.绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间).到 2002 年,整个项目组开始启用分布式版本控制系统 BitKeeper 来管理和维护代码.到了 2005 年,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了免费使用 BitKeeper 的权力.这就迫使 Linux

linux下Golang安装配置教程

做为运维人员,使用python语言足矣,理论上是无需了解golang的.不过最近发现一个新潮的监控系统都是基于golang进行开发的,如小米公司的Open-Falcon(github项目页) .stack exchange 公司的Bosun (github项目页). 一.Go的三种安装方式 Go有多种安装方式,你可以选择自己喜欢的.这里我们介绍三种最常见的安装方式: Go源码安装:这是一种标准的软件安装方式.对于经常使用Unix类系统的用户,尤其对于开发者来说,从源码安装可以自己定制. Go标准