awk之基础学习

样例数据:

joho.wang   Male         30         021-11111111111111111
lucy.yang     Female    25         021-22222222222222
jack.chen    Male         35          021-33333333333333
lily.gong     Female      20          021-44444444444444

 

1、awk认为文件都是结构化的,也就是说都是由单词和各种空白字符组成的,“空白字符”包括空格,Tab,以及连续的t空格和Tab等。

每个非空白的部分叫做域,从左到右一次是第一个域、第二个域,等等。$1,$2分别用于表示域,$0则表示全部域。

所有操作以此文件为例:

 

 

 

 

 

分析: 

joho.wang Male 30 021-11111111111111111

拿第一行来说,默认以空白字符为分隔,joho.wang 为被分隔出来的第一个数据,所以为$1,同理,Male、30、021-11111111111111111分别为$2、$3、$4。

 

2、默认为“空白字符分隔”,当然我们在实际使用中,也可以指定字符分隔。使用-F进行指定。例如cat file.txt | awk -F . '{print $1}'

所有操作以此文件为例:

 

 

 

 

 

 

3、内部变量NF,可以计算分隔以后的元素个数,也就是分隔了几个元素。

所有操作以此文件为例:

 

 

 

 4、打印固定列。$F表示每一行的最后一列,倒是第二行可以用$F-1,以此类推。

所有操作以此文件为例:

 

 

 

 

5、截取字符串。substr截取字符串。用法:substr(指定域,第一个开始字符的位置,第二个结束的位置)。

所有操作以此文件为例:

 

 

 

 

 

6、打印文件的指定行。使用“NR==行数“打印,不存在(超过)的行,不显示结果。

 

7.对统计的到的相关数据,进行次数从多到少排序,并且显示出现的次数。

cat network.txt | awk -F - '{print $1}' | sort | uniq -c | sort -nr

sort 排序

uniq -c 去重统计数量

 sort -n 根据数量排序 (正序)  -nr(倒序)  

 

 

 

 进阶:获取23号的ip访问的次数,并且统计的数据前面不允许有空格

 

cat network.txt | grep 23/Apr/2020 | awk -F '-' '{print $1}' | sort | uniq -c | sort -nr | awk -F ' ' '{print $1" "$2}'

 

 

8、统计文件的行数

awk 'END{print NR}' nowcoder.txt

 9、awk列求和

 awk '{a+=$6}END{print a}' nowcoder.txt

 

10、统计文件内相同字符串的个数

 xargs -n1  过滤,-n ,排列多少个文字符串为一行

 cat nowcoder.txt | xargs -n1 | sort | uniq -c | sort | awk '{print $2,$1}'

 

posted @ 2022-01-05 10:06  17601621550  阅读(79)  评论(0)    收藏  举报