awk 基本用法
linux 上面默认使用 gawk
AWK是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言(其名称得自于它的创始人阿尔佛雷德·艾侯、彼得·温伯格和布莱恩·柯林汉姓氏的首个字母)的最大功能取决于一个人所拥有的知识。awk经过改进生成的新的版本nawk,gawk,现在默认linux系统下日常使用的是gawk,用命令可以查看正在应用的awk的来源。
特点
AWK是一种优良的文本处理工具。它不仅是 Linux 中也是任何环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言(其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母)的最大功能取决于一个人所拥有的知识。AWK 提供了极其强大的功能:可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。它具备了一个完整的语言所应具有的几乎所有精美特性。实际上 AWK 的确拥有自己的语言:AWK 程序设计语言, 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。
最简单地说, AWK 是一种用于处理文本的编程语言工具。AWK 在很多方面类似于 shell 编程语言,尽管 AWK 具有完全属于其本身的语法。它的设计思想来源于 SNOBOL4 、sed 、Marc Rochkind设计的有效性语言、语言工具 yacc 和 lex ,当然还从 C 语言中获取了一些优秀的思想。在最初创造 AWK 时,其目的是用于文本处理,并且这种语言的基础是,只要在输入数据中有模式匹配,就执行一系列指令。该实用工具扫描文件中的每一行,查找与命令行中所给定内容相匹配的模式。如果发现匹配内容,则进行下一个编程步骤。如果找不到匹配内容,则继续处理下一行。
尽管操作可能会很复杂,但命令的语法始终是:
awk ‘{pattern + action}’ 或者 awk ‘pattern {action}’
其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号 ({}) 不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。
gawk 是 AWK 的 GNU 版本。
一般的UNIX作业系统,本身即附有AWK,不同的UNIX作业系统所附的AWK其版本亦不尽相同,若读者所使用的系统上未附有AWK,可通过 anonymous ftp 到下列地方取得:
phi./pub/gnu
ftp/UNIX/gnu
preppub/gnu
注 解:一种编程语言,因其模式匹配语法而特别有用,通常用于数据检索和数据转换。一个GNU版本称为Gawk。
相关操作
awk '{print FILENAME}' passwd
就是FILENAME 显示文件名字
awk 'NR/NF=={print 第 "NR" 行 , 有 "NF" 列 }' passwd
NR== x就是第几行,NF==x就是第几列
awk 'BEGIN{print NAME}'
开头写什么
awk 'END{print WESTOS}'
结尾写什么
awk -F : 'BEGIN{print NAME}{print $1}END{WESTOS}'
综合-F就是以什么为分隔符
awk '/bash$ /'
以bash结尾的
awk -F : '/bash$ /{print $ 1}'
以:分隔符bash结尾的
awk 'BEGIN{a=34;print a+12}'
可以计算
awk -F : '/^ro/{print}' /etc/passwd
以ro开头
awk -F : '/ ^ [a-d] /{print $ 1,$ 6}' passwd.txt
a或b或c或d开头
awk -F : '/^a|nologin$ /{print $ 1,$7}' passwd.txt
a开头 nologin结尾
awk -F : '$6~/bin $/{print $ 1,$6}'
第六行是以bin结尾的
awk -F : '$7!~/nologin $/{print $1,$7}' passwd.txt
第七行不是以nologin结尾的
以:为分隔符,打印passwd文件的第一列
以:为分隔符,在开头打印hello,并打印passwd文件第二列
以:为分隔符,在开头赋值n=1,打印passwd文件第二列,并在第二列打印n
以:为分隔符,在开始赋值n=1,打印passwd文件第二列,第二列打印n并且一次加1
以:为分隔符,在开始赋值n=1,第一列打印n并且一次加1,打印passwd文件第一列
以:为分隔符,在开始赋值n=1,第一列打印n并且一次加1,打印passwd文件第一列,在结尾打印over
以:为分隔符,在开始赋值n=1,第一列打印n并且一次加1,打印passwd文件第一列,在结尾打印总行数
打印passwd文件一bash结尾的一行
打印passwd文件一bash结尾的一行的第一列
以:为分隔符,打印passwd文件的第三行第一列
以:为分隔符,打印passwd文件的第四行到第六行
以:为分隔符,打印passwd文件的第四行和第六行
打印文件行数的文件名
在开头赋值N=0,以nologin结尾,N依次加1,最后打印N
抓取本机上可以登陆的用户
打印34+12
awk 测试
脚本
抓取 eth0 网卡的 ip
脚本写法:
结果
以:为分隔符,打印passwd文件以ro开头的
以:为分隔符,打印以abcd开头的
以:为分隔符,打印passwd文件以a开头,nologin结尾的第一列和第六列