【linux教程】awk数据提取工具

目录

 

1.1基础入门

1.1.1简介

1.1.2.awk命令一般组成

1.2语句结构

1.1.1Option

1.1.2Pattern

1.1.3BEGIN和END

 

1.3awk脚本编写

1.3.1函数

1.3.2常量

1.3.3变量

1.3.4条件

1.3.5循环

1.4内置函数和变量

1.4.1内置函数

1.4.2内置变量

1.5其他使用

1.5.1.awk搜索

1.5.2变量计算

1.5.3实例


1.1基础入门

1.1.1简介

  1. awk是在linux环境下一个强大的文本分析工具,相当于grep的查找,vim编辑工具,awk在其对数据分析并生成报告的时候显得尤为强大.简单的说awk就是把文件逐行读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理
  2. 我们可以为awk这个工具传递一个字符串,该字符串的内容类似于一种编程语言的语法,我们称其为awk语言,awk本身我们可以看成是awk语言的一种解析器,就像python解析器和python语言的关系.
  3. awk的三个版本:awk,nawk和gawk
  4. awk拥有自己的语言:AWK程序设计,创建者将其定义为样式扫描和处理语言,它允许创建简短的程序,这些程序读取输入文件,为数据排序,处理数据,对输入执行计算和生成报表等操作.
  5. awk适合做什么?在工作中awk一般用来处理log日志文件和统计工作.
  6. 在awk中我们把一行称为一个record;一列称为一个field,其中NR表示每一行的行号,NF表示每一行中的特征个数.
  7. awk的语法规则和c语言很类似.

1.1.2.awk命令一般组成

1.描述

awk最长用的工作一般是遍历一个文件中的每一行,然后分别对文件的每一行进行处理

2.格式:

awk [option] 'BEGIN{commands} pattern{commands} END{commands}' file.txt
echo -e 'abcabc\nbacaabc' | awk '{print $2}

3.参数解释

options表示awk的可选命令行参数:-F指定将文件中的每一行分隔成列的分隔符号.

引号内部的内容都是awk的程序脚本,awk需要对文件每一行分割后的每一列做处理.

file则是awk需要进行处理的文件名称.

这里的参数-e表示换行不被忽略.

4.技术文档

案例讲解地址

技术文档地址

1.2语句结构

1.1.1Option

指定分隔符:

echo '11 22 33,44' | awk -F , '{print $2}'

1.1.2Pattern

正则表达式就是模式匹配,常用的正则有:

/abc/ 匹配所有abc
/a.c/ 匹配开头a结尾c中间含有任意一个字符,点表示匹配一个字符[1]
/a?c/ 问号表示匹配前面的子表达式0次或者1次
/a+c/ 加号表示匹配前面的子表达式1次或者多次
/a*b/ 星号表示匹配前面的子表达式任意次数
()  要把括号中的内容看成一个整体/(ab)+c/:abababc
[]  方括号表示选取其中任意一个字符,/n[^a-zA-Z]m/表示n与m之间的字符不能出现在方括号中
{m,n} 匹配前面的子表达式m次到n次,{m}出现m次{m,}大于m次{,n}小于n次
^,$ 分别表示开头或者结尾/^ab$/表示匹配以a开头以$结尾的字符串,eg:abc就不能匹配
转义字符:/a\.c/转义点,/a\\c/转义斜线,/a\?c/转义问号

1.1.3BEGIN和END

BEGIN匹配文件第一行之前运行的语句块,一般情况下我们会在BEGIN语句块中定义一些变量或者初始化的工作,直接为一个变量赋值就定义了一个变量,awk中没有专门用来定义变量的关键字.一些只需要在开始仅打印的信息,eg:表头等.注意:BEGIN必须是大写.FS是全局变脸表示读取的时候用其 分隔,OFS表示输出的时候用逗号分隔,我们可以通过这种方式自定义分隔符.

echo 'a b c'|awk 'BEGIN{print "hello gfb";print ""} {print $0}'
echo -e '1 2 3\na b c' | awk 'BEGIN{FS=" ";OFS=","} {print $1"\t"$2} END{print "欢迎离开!"}'

END循环完成所有行处理才执行,与BEGIN一样,END也只执行一次

echo 'a b c'|awk 'BEGIN{print "你好?gfb:";print ""} {print $0} END{print "欢迎离开"}'

注意:同一个语句块中两个语句之间必须用封号隔开.Ctri+C表示退出

 

1.3awk脚本编写

1.3.1函数

1.print函数

awk '{print $0"\t"$3"\t"$2}' text

1.3.2常量

awk '{print NF"\t"NR"\t"$0}' text

NR表示行号,NF表示每一行中数据的个数

1.3.3变量

awk 'BEGIN{sum=0} {sum+=$1} END{print "第一列求和:"sum}' text

1.3.4条件

awk '{if(NR%2==0)print $0}' text  如果行号为偶数,我们就输出该行,每次只读取一行,它是一行一行进行遍历的

1.3.5循环

for循环
awk 'BEGIN{for(count=0;count<5;count++)print count}'

while循环:
awk 'BEGIN{count=0;while(count<5){print count;count++;}}'

do..while循环
awk 'BEGIN{count=0;do{print count;count++}while(count<5)}'

1.4内置函数和变量

1.4.1内置函数

1.数学函数:

  • atan2(y,x) 返回 y/x 的反正切。 
  • cos(x) 返回 x 的余弦;x 是弧度。 
  • sin(x) 返回 x 的正弦;x 是弧度。 
  • exp(x) 返回 x 幂函数。 
  • log(x) 返回 x 的自然对数。 
  • sqrt(x) 返回 x 平方根。 
  • int(x) 返回 x 的截断至整数的值。 
  • rand() 返回任意数字 n,其中 0 <= n < 1。 
  • srand([expr]) 将 rand 函数的种子值设置为 Expr 参数的值,或如果省略 Expr 参数则使用某天的时间。返回先前的种子值。

2.字符串

  • gsub(reg,str1,str2) 使用str1替换所有str2中符合正则表达式reg的子串
  • sub(reg,str1,str2) 含义与gsub相同,只不过gsub是替换所有匹配,sub只替换第一个匹配
  • index(str,substr) 返回substr在str中第一次出现的索引,注意索引从1开始计算,如果没有则返回0
  • length(str) 返回str字符串的长度,length函数还可以返回数组元素的个数
  • blength(str) 返回字符串的字节数
  • match(str,reg) 与index函数一样,只不过reg使用正则表达式,例如match("hello",/lo/)
  • split(str,array,reg)将str分隔成数组保存到array中,分隔使用正则reg,或者字符串都可以,返回数组长度
  • tolower(str) 转换为小写
  • toupper(str) 转换为大写
  • substr(str,start,length) 截取字符串,从start索引开始的length个字符,如不指定length则截取到末尾,索引从1开始

3.其他函数

  • system(command) 执行系统命令,返回退出码
  • mktime( YYYY MM dd HH MM ss[ DST]) 生成时间格式
  • strftime(format,timestamp) 格式化时间输出,将时间戳转换为时间字符串
  • systime() 得到时间戳,返回从1970年1月1日开始到当前时间(不计闰年)的整秒数

1.4.2内置变量

awk中同样定义了很多内置变量,我们可以直接像使用普通变量一样使用他们,由于awk的版本众多,有些内置变量并不是得到所有awk版本的支持。

说明:[A][N][P][G]表示支持该变量的工具,[A]=awk、[N]=nawk、[P]=POSIXawk、[G]=gawk
$n 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段。 
$0 这个变量包含执行过程中当前行的文本内容。

  • [N] ARGC 命令行参数的数目。
  • [G] ARGIND 命令行中当前文件的位置(从0开始算)。
  • [N] ARGV 包含命令行参数的数组。
  • [G] CONVFMT 数字转换格式(默认值为%.6g)。
  • [P] ENVIRON 环境变量关联数组。
  • [N] ERRNO 最后一个系统错误的描述。
  • [G] FIELDWIDTHS 字段宽度列表(用空格键分隔)。
  • [A] FILENAME 当前输入文件的名。
  • [P] FNR 同NR,但相对于当前文件。
  • [A] FS 字段分隔符(默认是任何空格)。
  • [G] IGNORECASE 如果为真,则进行忽略大小写的匹配。
  • [A] NF 表示字段数,在执行过程中对应于当前的字段数。
  • [A] NR 表示记录数,在执行过程中对应于当前的行号。
  • [A] OFMT 数字的输出格式(默认值是%.6g)。
  • [A] OFS 输出字段分隔符(默认值是一个空格)。
  • [A] ORS 输出记录分隔符(默认值是一个换行符)。
  • [A] RS 记录分隔符(默认是一个换行符)。
  • [N] RSTART 由match函数所匹配的字符串的第一个位置。
  • [N] RLENGTH 由match函数所匹配的字符串的长度。
  • [N] SUBSEP 数组下标分隔符(默认值是34)。

1.5其他使用

1.5.1.awk搜索

awk '$7="lzufe"{print $0}' c.txt

输出第7列中值为lzufe的每一行

1.5.2变量计算

awk 'a=1;b=3;print a+b' 加
awk 'a=1;b=3;print a b' 拼接
awk 'a=1;b=3;print a-b' 减
awk 'a=1;b=3;print a*b' 乘
awk 'a=1;b=3;print a/b' 除
awk 'a=1;b=3;print a%b' 取余
awk 'a=1;b="apple";c=3;print b+c'  结果是3
awk 'a=1;b="22apple";c=3;print b+c'  结果是22+3  数字一定要出现在字符出的前面  

1.5.3实例

1.data.txt文件

hello world
apple banana orange
abcd efgh

 

 

 

2.文件的拼接

awk '{print NR,FILENAME,$0}' coins.txt data.txt

一次性读取两个文件

3.隐藏具体某一列

awk '{$3="xxx";print NR "\t" $0}' coins.txt

4.指定列输出

awk '{print $NF}' coins.txt  输出最后一列
awk '{print $(NF-1)}' coins.txt  输出倒数第二列

 

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值