awk是一种用于处理数据和生成报告的编程语言

awk可以在命令行中进行一些简单的操作,也可以被写成脚本来处理较大的应用问题

awk与grep、sed结合使用,将使shell编程更加容易

awk工作模式:

awk逐行扫描输入(可以是文件与管道),按给定的模式查找出匹配的行,然后对这些执行awk命令指定的操作

与sed一样,awk不会修改输入文件的内容。awk多了一个对列的处理,如果要处理列,awk是一个好的选择。可以使用重定向将awk的输出保存到文件中。

一、awk简单用法

awk   [options]  awk_cmd   files

选项 :-F    指定输入记录字段的分隔符,默认使用环境变量IFS的值。

    -f      从指定文件读取awk_script

      -v      为awk设定变量

例如:

$1表示第一列。$0表示整行。

awk   -F:  '{print  $1}'   /etc/passwd  :以冒号为分隔符,输出/etc/passwd中每行第一列内容

awk   -F:  '{print  $1,$3}'   /etc/passwd  :以冒号为分隔符,输出/etc/passwd中每行第一列与第三列(默认空格分割)

awk   -F:  '{print  $1 "|" $3}'   /etc/passwd  :输出/etc/passwd中每行第一列与第三列,且两列之间用|分隔

awk   -F:  '/^root/{print  $1 "|" $3}'   /etc/passwd  :行首匹配root的行,输出这些行第一列与第三列,且两列之间用|分隔

二、awk脚本用法:

-f      从指定文件读取awk_script。

其中awk_script语法:

awk  'BEGIN  {actions}

    /pattern1/{actions}             命令1

      ......

    /patternN/{actions}             命令N

    END   {actions}'       input_file

BEGIN{actions}与END{actions}可选,awk_script可以由一条或多条awk_cmd组成,每天awk_cmd各占一行。

每个awk_cmd由两部分组成:/pattern/{actions}。其中/pattern/和{actions}可以省略,但不能同时省略;/pattern/省略时表示对所有的输入行执行指定的actions;

{actions}省略时,表示打印符合pattern的所有整行。

awk脚本的执行过程:

1、如果存在BEGIN,awk首先会执行它指定的actions

2、awk从输入中读取一行,称为一条输入记录

3、awk将读入的记录分割成数个字段,并将第一个放入变量$1中,第二个放入$2中,依此类推。$0表示整条记录;字段分割符可以通过选项-F指定,否则使用缺省的分隔符

4、把当前输入记录依次与每一个awk_cmd中的pattern比较:如果相匹配,就执行对应的actions

如果不匹配,就跳过对应的actions,直到完成所有的awk_cmd

5、当一条输入记录处理完毕,awk读取输入的下一行,重复上面的处理过程,直到所有输入全部处理完毕。

6、awk处理完所有的输入后,若存在END,执行相应的actions。

7、如果输入是文件列表,awk将按顺序处理列表中的每个文件。

下面举个例子:

ifconfig  |  awk  '/inet addr/{print $2}'  |  awk -F: '{print  $2}' :查找ip地址

三、awk模式匹配:

1、使用正则表达式

^:只匹配行首(可以看成是行首标志)

$:只匹配行尾(可以看成是行尾标志)

*:一个单字符后紧跟*号,可匹配0个或多个此字符

[ ]:匹配[ ]内任意一个字符([^ ]反向匹配)

\:用来屏蔽一个元字符的特殊含义

.:匹配任意单个字符

str1|str2:匹配str1或str2

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

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

( ):字符组

2、使用布尔表达式,表达式的值为真时执行相应的操作

表达式中可以使用变量(如字段变量$1,$2等)和/rexp/

表达式中的运算符有

  关系运算符: <   >    <=    >=    ==     !=

  匹配运算符   ~     !~

    x  ~  /rexp/    如果 x匹配/rexp/ ,则返回真

  例如:awk     '$1 > 20  {print  $0}'   test.in

      awk    '$2  ~  /^6/  {print  $0}'   test.in

3、复合表达式:&&、||、! 表达式中有比较运算符,一般用圆括号。

例如:

awk   '($1<20)&&($2 ~ /^6/){print $0}'  test.in

awk   '($1<20)||($2 ~ /^6/){print $0}'   test.in

awk    '!($2 ~ /^6/){print $0}' test.in

awk     '/^#/ && /#$/ {print }'    test.in   :打印以#号开头,并且以#号结尾的行

四、字段分隔符、重定向和管道

字段分隔符:

awk中的字段分隔符可以用 -F选项指定,缺省是空格(实际由全局变量IFS决定)

  例如:awk   '{print $1}'  test.in

     awk   -F:   '{print $1}'  test.in

     awk   -F  '[ :]'   '{print $1}'  test.in    :可以是空格、也可以是冒号来分隔

五、重定向与管道:

  例如: awk   '{print  $1, $2 >  "output" }'  test.in     :第一列、第二列重定向到output文件

      awk   'BEGIN { "cal"  |  getline a; print a}'   : cal命令将日历显示出来,双引号不能省。获取cal输出的第一行到变量a中,打印输出

shell编程之awk的更多相关文章

  1. shell编程之awk命令详解

    shell编程之awk命令详解 a:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; out ...

  2. 03 shell编程之case语句与函数

    本文所有内容均来自当年博主当年学习笔记,若有不足欢迎指正 Shell编程之case语句与函数 学习目标: 掌握case语句编程 掌握shell函数的使用 目录结构: Case语句 Case语句的作用 ...

  3. shell编程之case分支语句

    shell编程之case分支语句 case分支语句和if的多分支语句很相似. if多分支语句一般用在有(区间范围)的地方 :例如:0-100之间. if需要判断多个不同的条件. case的分支语句用在 ...

  4. shell编程之if语句

    shell编程之if判断 目录 shell编程之if判断 1.整数比较 2.字符串比较 3.举例 1.数字比较 2.字符串比较 4.Other 1.整数比较 -eq 等于,如:if [ "$ ...

  5. shell编程之sed编辑器&gawk程序

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://twentyfour.blog.51cto.com/945260/560372 s ...

  6. shell编程之grep命令的使用

    大家在学习正则表达式之前,首先要明确一点,并把它牢牢记在心里,那就是: 在linux中,通配符是由shell解释的,而正则表达式则是由命令解释的,不要把二者搞混了.切记!!! 通常有三种文本处理工具/ ...

  7. Shell编程之Shift的用法

    位置参数可以用shift命令左移.比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1.$2.$3丢弃,$0不移动.不带参数的shift命令相当于shift 1. 非常 ...

  8. shell 编程之 for while until 循环

    shell 的for循环 的格式如下: for 变量  in 列表 do ... done 列表是一组值的序列 每个值通过空格隔开 每循环一次,列表中的下一个值赋给变量 in 列表是可选的,如果不用他 ...

  9. shell 编程之 if...else case...esac

    shell的条件判断语句有三种 if...fi  语句 if...else...fi  语句 if...elif...fi  语句 例子: a=10; b=20; if [ $a -gt %b ] t ...

随机推荐

  1. 苏州6617.9373(薇)xiaojie:苏州哪里有xiaomei

    苏州哪里有小姐服务大保健[微信:6617.9373倩儿小妹[苏州叫小姐服务√o服务微信:6617.9373倩儿小妹[苏州叫小姐服务][十微信:6617.9373倩儿小妹][苏州叫小姐包夜服务][十微信 ...

  2. linux(centos8):基于java13安装rocketmq-4.7.1(解决jdk不兼容的报错)

    一,Rocketmq是什么? 1, RocketMQ是一个队列模型的消息中间件,具有高性能.高可靠.高实时.分布式特点 相比kafka,rocketmq的实时性更强 2,官方网站: http://ro ...

  3. scrapy 采集数据存入excel

    # -*- coding: utf-8 -*- # Define your item pipelines here # # Don't forget to add your pipeline to t ...

  4. Jquery中$("").事件()和$("").on("事件","指定的元素",function(){});的区别(jQuery动态绑定事件)

    这个是在学习时不懂的问题,记录下来方便查看 转至https://www.cnblogs.com/mr-wuxiansheng/p/7136864.html //绑定 下一页 的点击事件 $(" ...

  5. 解决Android RadioGroup跑到输入法上面

    Android开发过程中,发现一个小问题,当我们点击屏幕下面的输入框时,我们的RadioGroup会跑到输入法的上面去,如下图 两种解决方法 1.Manifest.xml文件activity标签中添加 ...

  6. linux mkfifo命令基本用法

    首先了解linux命令执行顺序 通常情况下,终端只能执行一条命令,然后按下回车,那么执行多条命令呢 顺序执行多条命令,可以用分号; cmd1;cmd2;cmd3 条件执行多条命令,使用&&am ...

  7. 在git下如何创建分支

    创建main分支下的远程分支dev: 直接输入dev,就可以创建在main分支下的远程分支dev了 在dev下创建devdev

  8. # ThreeJS学习7_裁剪平面(clipping)

    ThreeJS学习7_裁剪平面(clipping) 目录 ThreeJS学习7_裁剪平面(clipping) 1. 裁剪平面简介 2. 全局裁剪和局部裁剪 3. 被多个裁剪平面裁剪后 4. 被多个裁剪 ...

  9. Spring学习-Bean的基本概念知识

    4月份开始复习一遍spring相关知识.让自己巩固一下spring大法的深奥益处,所以就看了大佬的博客,转载留下来日后继续研读.认为重点的标记为红色 转载自:http://www.cnblogs.co ...

  10. 如何做好智能家居工业物联网串口转WiFi/4G/以太网无线AP方案的物联网WiFi模块选型

    2020年一场突如其来的灾难袭来,各大经济市场在不同程度被按下了"暂停键".物联网控制作为新兴行业优势凸显出来,其无接触式的交互方式,远程控制,智能控制车间,给人民带来安全.智能的 ...