shell中awk 使用

1.awk 

AWK 提供了极其强大的功能:可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数

是shell中处理文本的三大利器之一。

2.awk 初接触

awk 是行处理器,对每行中按指定的分隔符分开的列进行相应的操作。

awk [options] 'script' var=value file(s)

2.1 $0

 awk '{print $0,$1,$2}' test.file # $0:打印出每行的全部内容;$1:打印出每行的第一个字段;$2:打印出每行的第二个字段

(不指定分隔符FS的情况下,默认的分隔符‘ ’)

awk '{ sum += $1 }; END { print sum }'test.file #求所用行第一字段的总和


2.2 if 和正则表达式

awk  -F "\t"  'BEGIN{OFS"\t"} {if($1~/tar.gz$/){print $0}}'

每一行之间的不同列按“\t” 分割,当第一字段匹配一tar.gz结尾时,输出这一行,且输出行也是以”\t“输出。

不匹配是!=


2.3 FS (指定字段的分隔符)和OFS(输出字段分隔符)

awk -F "::"  '{print $1}’ test.file #指定分隔符 FS,打印第一字段

awk  'BEGIN{OFS=";"}{print $1,$2,$3}' test.file # 按指定的分隔符输出前三行,若写成 $0这表示输出整行


2.4 NR、NF和FNR

a. NR  表示从awk开始执行后,按照记录分隔符读取的数据次数,默认的记录分隔符为换行符,

因此默认的就是读取的数据行数,NR可以理解为Number of Record的缩写。

awk '{print NR}' test.file #打印出文件的行号

b.FNR,处理多个文件时,可以理解为File Number of Record。

awk '{print FNR }' in1.file in2.file ... #打印出多个文件的行号,每个文件都是从第一行开始计数

awk '{print NR }' in1.file in2.file...#也是打印所有行号,但是第二个文件是接在第一个文件的后面开始编号的,后面的以此类推。

c.NF 表示目前的记录被分割的字段的数目,NF可以理解为Number of Field。

可以理解为文件的所有列数

awk '{print NF}' test.file ## 统计文件的所有列数(按指定的分隔符)


2.5 -v 指定变量

赋值一个用户要使用的

awk -F'\t' -v sum=0 '{sum+=$2}END{print sum}' dit.txt ##指定一个sum变量,计算第二字段的总和

awk 求某列的平均值,使用变量的和NR:awk '{sum+=$1}END{print "Average = ",sum/NR}' test.txt

awk 求某列的最大值,使用变量和条件判断:awk 'BEGIN{max=0}{if ($1>max)max=$1 fi}END{print "Max =",max}' test.txt

awk 求某列的最大值,使用变量和条件判断:awk 'BEGIN{min=199999}{if($1<min)min=$1 fi}END{print "Min =",min}' test.txt


2.6 -f 从脚本中读取awk命令


2.7 BEGIN 和END

BEGIN里面的代码在awk执行之前被执行;END代码在awk对所有行执行完毕后再执行;

BEGIN{} 中可以指定分隔符,变量名,等等;END{}也可以指定分隔符,格式化输出等等;

awk 'BEGIN{print "########"}{print $0}END{print "---------"}' test.file #在testfile文件的前后打印字符


2.8 重定向

> :重定向,覆盖目标文件内容;

>>:追加,追加到目标文件后面

awk '/ggg/{print $0 > "tmp.file"}' test.txt # 把文件中匹配到ggg的行输出到tmp.file中;注意写在程序块中的重定向要加上双引号。

awk '/ggg/{print $0}'  test.file > tmp.file#与上面的代码实现同样的功能。


2.9 管道符 |

awk '{print $1,$2 |"sort -r "}' test.txt  #打印第一和第二字段,并按照原来的顺序反转打印出来


2.10 sort 

-t sep              定义分割符号,默认位空格/tab

-k  sum            定义第一个域

-n                    数字排序,生序

-rn                  数字排序,降序

-r                    反转结果 ,结果位生序反转就为降序


2.11 关联数组

awk中强大的功能之一。数组使用字符串作为索引

关联数组的遍历需要使用特殊的for结构,语法如下:for ( elem in array) action

example:

2.12 内置函数

a.gsub函数

example:

将文件中将整个$ 0中用s替代r的ddd替换成xxx.

b.length函数

 length函数返回没有参数的字符串的长度。length函数返回整个记录中的字符数。(是字符,包括空白字符)

example:

c.substr函数

截取字符串,用法:sbustr(strings,position,number)

例如取出下面文件中的ID

example:

d.split函数

awk的内建函数split允许你把一个字符串分隔为单词并存储在数组中

用法:split(strings,array,field separator);若不指定field separator,默认的分隔符是当前的FS。

example:

2.13 网上教程

http://awk.readthedocs.io/en/latest/index.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值