awk是一个强大的文本分析工具,awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。

使用方法

awk '{pattern+action} {filename}'

pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。

一. 初级篇

例子1:读取指定列的内容

(last -n:列出最近登陆系统的n个用户的信息)

[jihite@~]$last -5
jihite pts/4 :0.0 Mon Aug 18 23:00 still logged in
jihite pts/2 :0.0 Mon Aug 18 23:00 still logged in
jihite pts/1 :0.0 Mon Aug 18 23:00 still logged in
reboot system boot 3.2.0-61-generic Mon Aug 18 22:40 - 23:03 (00:23)
reboot system boot 3.2.0-61-generic Sat Aug 16 20:27 - 12:54 (16:26) wtmp begins Sat Aug 2 01:18:13 2014

现在利用awk命令只提取第一列的用户名

[jihite@~]$last -5 | awk '{print $1}'
jihite
jihite
jihite
reboot
reboot wtmp

awk工作流程:逐行读取(以‘\n’区分),默认以空格分开,$0是整行内容,$1是第一列内容。

如果只是显示/etc/passwd的账户

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

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

-F指定域分隔符为':' (默认的域分隔符是空格)。

例子2:-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

$1,$7之间以“\t”分开

例子3:在输出的开头和结尾添加输出

在所有行添加列名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/nosh

awk工作流程是这样的:先执行BEGING,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作。

例子4:搜索含有某关键字的行

(找出含有关键字‘man’的行)

[jihite@~]$cat '/etc/passwd' | awk -F : '/man/{print $0}'
man:x:::man:/var/cache/man:/bin/sh
colord:x:::colord colour management daemon,,,:/var/lib/colord:/bin/false

例子5:单双引号

双引号
awk '{print "\""}' #放大:awk '{print " \" "}'
单引号
awk '{print "'\''"}' # 放大: awk '{print " ' \ ' ' " }'

例给读出的每行内容加上单引号,行末还加上逗号

$cat del
12345
67890
abcde
fghig $cat del | awk '{print $1}'
12345
67890
abcde
fghig $cat del | awk '{print "'\''"$1"'\''"}'
'12345'
'67890'
'abcde'
'fghig' $cat del | awk '{print "'\''"$1"'\''"","}'
'12345',
'67890',
'abcde',
'fghig',

例子6:内置变量

ARGC               命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行 -F选项
NF 浏览记录的域的个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符

实例

[jihite@~]$awk  -F ':'  '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF}' /etc/passwd
filename:/etc/passwd,linenumber:,columns:
filename:/etc/passwd,linenumber:,columns:
filename:/etc/passwd,linenumber:,columns:
filename:/etc/passwd,linenumber:,columns:
filename:/etc/passwd,linenumber:,columns:
filename:/etc/passwd,linenumber:,columns:
filename:/etc/passwd,linenumber:,columns:
filename:/etc/passwd,linenumber:,columns:
filename:/etc/passwd,linenumber:,columns:
filename:/etc/passwd,linenumber:,columns:
filename:/etc/passwd,linenumber:,columns:
filename:/etc/passwd,linenumber:,columns:
filename:/etc/passwd,linenumber:,columns:
filename:/etc/passwd,linenumber:,columns:
filename:/etc/passwd,linenumber:,columns:
filename:/etc/passwd,linenumber:,columns:
filename:/etc/passwd,linenumber:,columns:
filename:/etc/passwd,linenumber:,columns:
filename:/etc/passwd,linenumber:,columns:
filename:/etc/passwd,linenumber:,columns:
filename:/etc/passwd,linenumber:,columns:
filename:/etc/passwd,linenumber:,columns:
filename:/etc/passwd,linenumber:,columns:
filename:/etc/passwd,linenumber:,columns:
filename:/etc/passwd,linenumber:,columns:
filename:/etc/passwd,linenumber:,columns:
filename:/etc/passwd,linenumber:,columns:
filename:/etc/passwd,linenumber:,columns:
filename:/etc/passwd,linenumber:,columns:
filename:/etc/passwd,linenumber:,columns:
filename:/etc/passwd,linenumber:,columns:
filename:/etc/passwd,linenumber:,columns:
filename:/etc/passwd,linenumber:,columns:
filename:/etc/passwd,linenumber:,columns:
filename:/etc/passwd,linenumber:,columns:
filename:/etc/passwd,linenumber:,columns:

二. 中级篇

| awk -F '\t' '{if($9^mohe) print $9}'

例子7:条件判断

把文件text中第二列大于10的行的第一列+“is expensive”输出

Banana  0.89
Paech 8.79
Kiwi 11.50
Pineapple 1.29
Apple 10.99
[@jihite]$ cat text | awk -F '\t' '$2 >= 10 {print $1, " is Expensive"}'
Kiwi is Expensive
Apple is Expensive

例子8:复合表达式

把文件text中第二列大于10的输出“is expensive”,小于9的输出“is cheap”

[@jihite]$ cat text | awk -F '\t' '$2 >= 10 {print $1, " is Expensive"}
$ <= {print $ " is cheap"}'
Banana is cheap
Paech is cheap
Kiwi is Expensive
Pineapple is cheap
Apple is Expensive

例子9:BEGIN END

[jihite@~]$cat Hurl_sort_copy| awk -F "\t" 'BEGIN{cnt=0}{cnt+=$3} END{print cnt}' 

e.g.

$cat del2
==>===>====>mod:len:
==>===>====>mod:len:
==>===>====>mod:len:
==>===>====>mod:len: $cat del2 | awk -F 'len:' 'BEGIN {sum=0} {sum += $2} END {print sum}'

显示中间过程

cat del | awk 'BEGIN {cnt=0}{print cnt"\t"$0}{cnt+=1}'  #表达式之间用{}隔开

例子10:if else

htext   text  | awk -F "\t" 'BEGIN {cntL=0;cntR=0} {if(NF>=9){cntL+=1} else {cntR+=1}} END {print cntL; print cntR}' #列数大于等于9的个数为cntL; 列数小于9的个数为cntR

awk案例学习的更多相关文章

  1. Storm入门2-单词计数案例学习

     [本篇文章主要是通过一个单词计数的案例学习,来加深对storm的基本概念的理解以及基本的开发流程和如何提交并运行一个拓扑] 单词计数拓扑WordCountTopology实现的基本功能就是不停地读入 ...

  2. angular的splitter案例学习

    angular的splitter案例学习,都有注释了,作为自己的备忘. <!DOCTYPE html> <html ng-app="APP"> <he ...

  3. 8.3 ContosoMVCWeb官方案例学习

    1. 分页案例学习 2. 排序搜索案例学习 3.使用Configuration.cs中的Seed方法 在数据库迁移过程中,使用update-database,会运行seed方法.seed方法能够将初始 ...

  4. 通过 Autostereograms 案例学习 OpenGL 和 OpenCL 的互操作性

    引言 在过去的十年里, GPU (图形处理单元)已经从特殊硬件(特供)转变成能够在数值计算领域开辟新篇章的高性能计算机设备. 很多算法能够使用拥有巨大的处理能力的GPU来快速运行和处理大数据量.即使在 ...

  5. GIS案例学习笔记-三维生成和可视化表达

    GIS案例学习笔记-三维生成和可视化表达 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 目的:针对栅格或者矢量数值型数据,进行三维可视化表达 操作时间:15分钟 案 ...

  6. 获取字段唯一值工具- -ArcPy和Python案例学习笔记

    获取字段唯一值工具- -ArcPy和Python案例学习笔记   目的:获取某一字段的唯一值,可以作为工具使用,也可以作为函数调用 联系方式:谢老师,135-4855-4328,xiexiaokui# ...

  7. 面图层拓扑检查和错误自动修改—ArcGIS案例学习笔记

    面图层拓扑检查和错误自动修改-ArcGIS案例学习笔记 联系方式:谢老师,135_4855_4328,xiexiaokui#139.com 数据源: gis_ex10\ex01\parcel.shp, ...

  8. 计算平面面积和斜面面积-ArcGIS案例学习笔记

    计算平面面积和斜面面积-ArcGIS案例学习笔记 联系方式:谢老师,135_4855_4328,xiexiaokui#139.com 数据:实验数据\Chp8\Ex5\demTif.tif 平面面积= ...

  9. ArcGIS案例学习笔记2_2_等高线生成DEM和三维景观动画

    ArcGIS案例学习笔记2_2_等高线生成DEM和三维景观动画 计划时间:第二天下午 教程:Pdf/405 数据:ch9/ex3 方法: 1. 创建DEM SA工具箱/插值分析/地形转栅格 2. 生成 ...

随机推荐

  1. 软件工程随堂小作业——随机四则运算Ⅱ之算法思路(C++)

    1.题目避免重复: (1)利用系统时间来产生随机数,重复率会降低. (2)建立链表,逐个判断.可读取写入文件. 2.可定制(数量/打印方式): (1)格式有默认值; (2)可以选择重新设置分几列和每行 ...

  2. Shell遍历文件的每一行[转载]

    #!/bin/sh while read line do echo $line done < /home/jms/lab/input.txt

  3. C#新语法特性前瞻

    今天逛微软的UserVoice site发现了几个有很有用,也很可能被添加到新版C#中的语法,当然也可能被推迟到下一版,拿出来给大家分享一下. 另外还没投票的可以去为自己最想要的新特性投票,有兴趣的可 ...

  4. android开发类似coverflow效果的3d旋转

    源码下载地址:http://download.csdn.net/detail/feijian_/8888219

  5. char a[] = "hello"; char c[] = {'h','e','l','l','o'}; int b[] = {1, 2, 3, 4, 5};的长度区别,及内存中空间开辟情况

    1, char a[] = "hello"; char c[] = {'h','e','l','l','o'}; int b[] = {1, 2, 3, 4, 5}; 数组是开辟一 ...

  6. Jquery结合Ztree生成树

    尊重作者,附原文链接:http://my.oschina.net/u/2472104/blog/529055 Ztree的api http://www.ztree.me/v3/api.php Ztre ...

  7. Multi-catch

    It’s relatively common for a try block to be followed by several catch blocks to handle various type ...

  8. 【BZOJ】【2648】SJY摆棋子&【BZOJ】【2716】【Violet 3】天使玩偶

    KD-Tree 传说中的kd树...前去膜拜了一下……写道模板题>_< 写kdtree的一些感想: 插入的时候是像可持久化线段树一样直接在最后开新节点,然后更新它所在的块.. 然而其实也是 ...

  9. [百度空间] ld: add library file reference by path & file name

    By default, -l option will search libraries with lib* prefix in speficied search paths. i.e. 1 ld -o ...

  10. 20+个可重复使用的jQuery代码片段

    jQuery已经成为任何web项目的重要组成部分.它为网站提供了交互性的通过移动HTML元素,创建自定义动画,处理事件,选择DOM元素,检索整个document ,让最终用户有一个更好的体验. 在这篇 ...