awk是一个文本分析工具,它把文件逐行读入,以特定符号将每行切分(默认空格为分隔符),切开的部分再进行各种分析处理。

awk其名称得自于它的创始人Alfred Aho 、Peter Weinberger 和Brian Kernighan 姓氏的首个字母。

事实上,awk有4个不同版本:awk、nawk和gawk,还有一个是mawk。gawk 是AWK的GNU版本,通常未作特别说明的awk一般指的是gawk。在RedHat系统中,默认是gawk,而在Ubuntu系统中,默认是mawk。如果需要使用gawk,可以使用apt-get来进行安装,如下:

sudo apt-get install gawk -y

  安装完毕后,默认即为gawk,如果还不是默认,可以通过 update-alternatives 命令来进行更改,如下:

sudo update-alternatives --config awk

  可以通过输入编号来设置默认的awk版本:

下面是关于awk的使用帮助:

像其他编程语言一样,awk中有一些内置变量,内置变量部分列表如下(重要且常用):

属性 说明
$0 每次读入的一整行
$1 ~ $n 当前读入行的第n个字段
FS 字段分隔符,默认是空格
NF 当前读入行中的字段个数,也即有多少列
NR 累计读入行的数量,从1开始,多文件处理时累加
FNR 已经读入某一文件行的数量,就是行号,从1开始,多文件处理时不累加
ARGC 命令行参数个数
ARGV 命令行参数数组
BEGIN 程序开始之前要做的事(仅做一次)
END 程序结束之前要做的事(仅做一次)
FILENAME 当前输入文件的名字

awk中的数组无需提前声明,数组下标也不必为整数int类型,可以为字符串string类型,与其说是数组,不如说是映射。

数组下标从1开始,而不是从0开始。

使用for ... in 遍历数组时,每次遍历取得的是数组的index索引,而不是数组元素。

结合上面列举的几个知识点,用个具体例子展示一下。对于有如下的文件:

$ cat word.txt

123456@163.com----a3452801----186035955----123456@163.com
123123@qq.com----wg123123----150731947----123123@qq.com
777888@163.com----li600613----136498718----777888@163.com
456654@qq.com----try649471----134169500----456654@qq.com
159741@qq.com----somechou----186966954----159741@qq.com

  现在使用awk先输出“第X列”,然后再读取每一列,代码如下:

awk -F'----' 'BEGIN {print "第一列\t\t第二列\t\t第三列\t\t第四列"} {for(a=1;a<=NF;a++) printf("%s\t",$a);print ""}' word.txt

 程序执行结果:

说明:先使用"-F"选项以及"----"字符串指出如何切分每一行,然后在程序开始之前打印一次“第X列”。之后用 for 循环来读取一行中的每一列,for 循环中用到了内置变量NF,NF如前所述,是总的列数量。最后使用 print ""来打印一个换行,print必须带一个空字符串"",否则默认打印每一个列。

下面再用个例子来展示awk中的一种数组功能,文件及其内容依然是上面所给出的那样,这次是将每一列作为一行打印出来,代码如下:

awk -F'----' '{for(a=1;a<=NF;a++) arr[(NR-1)*NF+a]=$a}  END{for(each in arr) print arr[each]}' word.txt

 程序执行结果:

说明:先使用"-F"选项以及"----"字符串指出如何切分每一行。之后用 for 循环来读取一行中的每一列,for 循环中用到了内置变量NF和NR,用NF和NR来计算每一列的index索引并放入数组arr中。这里需要注意的是 a 和 $a,a表示的是下标索引,$a表示的索引对应的值。最后在程序结束之前使用 for ... in 循环遍历数组,将每一列作为一行打印出来。

最后,一个关于awk的坑,在awk中,处理逻辑部分的语句,不要使用双引号,而要使用单引号,否则会出现无法切割的问题,这与shell的变量$是否解释没有关系,如下:

cat a.txt|awk -F "=" "{print 'yes'}"

如果上面的{print yes}使用双引号包含,则会无法切割每一行,必须使用单引号,应该为 ' { print "yes" } '

Linux awk工具简单学习记录的更多相关文章

  1. Linux——帮助命令简单学习笔记

    Linux帮助命令简单学习笔记: 一: 命令名称:man 命令英文原意:manual 命令所在路径:/usr/bin/man 执行权限:所有用户 语法:man [命令或配置文件] 功能描述:获得帮助信 ...

  2. Linux命令行及Vim简单学习记录

    Linux命令行 1.打开命令行 Ctrl+Alt+t 2.目录 显示当前目录的文件列表 ls 跳转至当前目录中的x文件夹 cd x 返回根目录 cd 3.文件 新建文件1.cpp touch ./1 ...

  3. awk命令简单学习

    请执行命令取出linux中eth0的IP地址(请用cut,有能力者也可分别用awk,sed命令答). 解答: 说明:此题解答方法已经给大家讲解了不下15种,还可以有很多,在这里给大家着重讲下awk的技 ...

  4. 和菜鸟一起学linux之DBUS基础学习记录

    D-Bus三层架构 D-Bus是一个为应用程序间通信的消息总线系统, 用于进程之间的通信.它是个3层架构的IPC 系统,包括: 1.函数库libdbus ,用于两个应用程序互相联系和交互消息. 2.一 ...

  5. 【转】和菜鸟一起学linux之DBUS基础学习记录

    [原文] D-Bus三层架构 D-Bus是一个为应用程序间通信的消息总线系统, 用于进程之间的通信.它是个3层架构的IPC 系统,包括: 1.函数库libdbus ,用于两个应用程序互相联系和交互消息 ...

  6. linux下计划任务学习记录

    0x01 计划任务简介 linux 中计划任务主要分为”循环执行”和”只执行一次”两种,分别对应的时 crond 服务 和 atd 服务: 0x02 只执行一次的计划任务 0x02.1 atd 服务说 ...

  7. 和菜鸟一起学linux之DBUS基础学习记录(转)

    转自:https://www.cnblogs.com/wuyida/p/6299998.html D-Bus三层架构 D-Bus是一个为应用程序间通信的消息总线系统, 用于进程之间的通信.它是个3层架 ...

  8. Linux 性能工具 - sar学习

    简介 sar是一款在linux下的性能工具,可以观察到CPU,内存,IO,运行队列,每秒上下文切换等信息. 软件工具安装 #Ubuntu sudo apt-get install sysstat # ...

  9. Linux——用户管理简单学习笔记(一)

    Linux用户分为三种: 1:超级用户(root,UID=0) 2:普通用户(UID 500-60000) 3:伪用户(UID 1-499)  伪用户: 1.伪用户与系统和程序服务相关 :nbin.d ...

随机推荐

  1. hive orc压缩数据异常java.lang.ClassCastException: org.apache.hadoop.io.Text cannot be cast to org.apache.hadoop.hive.ql.io.orc.OrcSerde$OrcSerdeRow

    hive表在创建时候指定存储格式 STORED AS ORC tblproperties ('orc.compress'='SNAPPY'); 当insert数据到表时抛出异常 Caused by: ...

  2. GoldNumber游戏比赛成绩公布

    比赛介绍:http://www.cnblogs.com/xinz/p/3347418.html 黄金点游戏: N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁 ...

  3. 使用jQuery的分页插件jquery.pagination.js进行分页

    1,需要用到jquery.pagination.js和pagination.css https://pan.baidu.com/s/1G3PLQSRGjvLxl2ryqpV76w https://pa ...

  4. 【MOOC EXP】Linux内核分析实验五报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 分析system_call中断处理过程 ...

  5. 第一个Spring冲刺周期团队进展报告

    第一天:学习了解ocr技术 第二天:继续学习了解ocr技术 第三天:开始尝试寻找识别灰度化处理的代码 第四天:尝试编译运行灰度化处理代码 第五天:能够灰度化处理图片 第六天:搜索提高识别率的代码 第七 ...

  6. PAT----1001. A+B Format (20)解题过程

    1001. A+B Format (20) github链接 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B Calculate a + b and output t ...

  7. C#简述(一)

    详情请参考:http://www.runoob.com/csharp/csharp-tutorial.html 1.C# 是一个简单的.现代的.通用的.面向对象的编程语言,它是由微软(Microsof ...

  8. Node.js & SSR

    Node.js & SSR nest.js https://github.com/nestjs/nest next.js 中文文档 https://nextjs.org/learn/ Grap ...

  9. Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 2. 变量

    大家在中学就已经学过变量的概念了.例如:我们令 x = 100,则可以推出 x*2 = 200 试试下面这段 Python 代码 import turtle turtle.shape("tu ...

  10. BZOJ2734 HNOI2012集合选数(状压dp)

    完全想不到的第一步是构造一个矩阵,使得每行构成公比为3的等比数列,每列构成公比为2的等比数列.显然矩阵左上角的数决定了这个矩阵,只要其取遍所有既不被2也不被3整除的数那么所得矩阵的并就是所有的数了,并 ...