awk


面试常问: 统计网站的访问量

grep 'https://static.aminer.cn/upload/pdf/' access.log|grep '29/Apr/2021'|awk '{print $1}'|sort -r|uniq -c|awk '{sum += $1} END {print sum}'

【功能】

用于处理文本擅长取行;取列

【语法】

awk  +参数  文件

【参数】

参数选项

解释说明(带※的为重点)      *****

NR==

代表行数分为 (1 2 3 4......)

'{print NR}' 默认是行数

$NF-1

倒数第二行

-F

指定分隔默认为空格(同时可以指定多把菜刀)

-v

v   左边要修改变量的名字右边是修改成的的名字

OFS  内置变量

-vOFS

修改自带变量

"[,  ]"

指定多把菜刀

取反

NF

代表尾,最后一

$

代表 1.......

END

awk 'END{ print NR }' 文件可以显示行数

> ; <


+

连续出现的合并成一个

.

任意字符

*

所有

BEGIN

awk 'BEGIN{print 10*2}'   计算机

20

(NR%2)

基数行

!(NR%2

偶数行

BEGIN

优先执行

END

最后执行

环境1cat xiaojiang

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin


环境:2  ifconfig 

eth0      Link encap:Ethernet  HWaddr 00:0C:29:31:15:26  
          inet addr:10.0.0.200  Bcast:10.0.0.255  Mask:255.255.255.0


环境

Zhang Dandan    41117397   :250:100:175
Zhang Xiaoyu    390320151  :155:90:201
Meng  Feixue    80042789   :250:60:50
Wu    Waiwai    70271111   :250:80:75
Liu   Bingbing  41117483   :250:100:175
Wang  Xiaoai    3515064655 :50:95:135
Zi    Gege      1986787350 :250:168:200
Li    Youjiu    918391635  :175:75:300
Lao   Nanhai    918391635  :250:100:175


 

实例1 

1.1 说明第二行

awk NR==2 xiaojiang 
bin:x:1:1:bin:/bin:/sbin/nologin


实例2

1.2 说明打印行号

awk '{print NR $0}' xiaojiang 
1root:x:0:0:root:/root:/bin/bash
2bin:x:1:1:bin:/bin:/sbin/nologin
3daemon:x:2:2:daemon:/sbin:/sbin/nologin


实例3

1.3 说明第一第三列

awk -F ":" 'NR==1{print $3}' xiaojiang


实例4

1.4 说明:指定 空格分隔符+表示把连续出现的合为一个

方法一:ifconfig|awk -F "[: ]+" 'NR==2{print $4}'
10.0.0.200
方法二:ifconfig|awk -F "[: B]+" 'NR==2{print $4}'
10.0.0.200


实例5

1.5 说明显示多少行和大几行的内容

awk 'END{ print NR }' xiaojiang

3

awk 'NR >2{print $0}' p   查看大于第二行的以外的内容

 

实例6

1.6 说明取反(取出不是r开头的行

awk '!/^r/' xiaojiang

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin


实例7

1.7 说明取出开头结尾的

awk '/^r.*h$/' xiaojiang

awk '/^lp/,/^ma/' passwd.txt   从哪里来到哪了去

 

root:x:0:0:root:/root:/bin/bash

 

实例8

1.8 说明调换顺序追加到新文件里

awk -F ":" 'NR==1{print $NF";"$2";"$3";"$4";"$5";"$6";"$1}' xiaojiang

/bin/bash;x;0;0;root;/root;root

实例9

1.9 说明找出空行

awk "/^$/" xiaojiang

 

实例10

1.10 说明:-vOFS变量说明

前言介绍,方便理解:

[root@oldboyedu-39-nb ~]# echo 1 2 3

1 2 3

echo 1 2 3 |awk -vOFS="@@@" '{print $1,$2,$3}'

1@@@2@@@3

例子:

awk -F ":" -v OFS=":" '{print $NF,$2,$3,$4,$5,$6,$1}' passwd

 

echo 1 2 3 4 5 6|awk '{a=$1;$1=$6;$6=a;print $0}'

6 2 3 4 5 1


1.11 \S\s的用法  排除文本中的空白显示/etc/inittab中以#开头,且后面跟了一个或者多个空白字符,而后又跟了任意非空白字符的行

awk   '/^#\s+\S+/' /etc/inittab

1.12 查找偶数行和技和计算行数

awk '(NR%2)' a   基数行

awk '(NR%2)' a  偶数行

awk -F -vi=0 '{if(NR%2!=1){i=i+NR}}END{print i}' a  (计算偶数行是行号加起来的数

awk -F  -vi=0  '{if(NR%2){i=i+NR}}END{print i}' a     奇数行数


1.13 显示最后一列包含sbin/nologin的行

awk  '$NF~/nologin$/' passwd.txt


1.14 显示文件的第2030

awk 'NR==2,NR==5' passwd.txt

1.14.1 显示Xiaoyu的姓氏和ID 号码

awk '$2~/Xiaoyu/{print $1,$3}' reg.txt


1.15 显示Zhang的行和他的第二次捐款金额及他名字

awk -F "[: ]+" '$1~/Zhang/{print $1,$2,$(NF-1)}' reg.txt


1.16 显示以41开头的ID号码的人的全名和ID号码

awk '$3~/^41/{print $1,$2,$3}' reg.txt


1.17 显示以15结尾的  查看行

awk '$3~/[15]$/' reg.txt

awk '$3~/1|5$/{print $1,$2}' reg.txt

awk '$3~/(1|5)$/{print $1,$2}' reg.txt


1.18 显示把:换成$  修改分割符

awk '$2~/Xiaoyu/{print $NF}' reg.txt |tr ":" "$"

awk -F "[ :]+" '$2~/Xiaoyu/{print "$"$4,"$"$5,"$"$6}' reg.txt

awk -F '[ :]+'  -vOFS="$"  '$2~/Xiaoyu/{print OFS$4,$5,$6}' reg.txt

 

awk '{gsub(/:/,"$",$NF); print $0}' reg.txt

原来是什么   要替换成什么  在哪里替换

 

1.19 BEGIN用法  

awk 'BEGIN{print "姓氏","名字"}{print $1,$2}' reg.txt

姓氏 名字

Zhang Dandan

Zhang Xiaoyu

 

1.20 GIN用法

awk '{print $1,$2};END{print "结束了"}' reg.txt

Zhang Dandan

Lao Nanhai

结束了


1.21 计算出现次数 sort|uniq -c|sort -rnk2

i=i+1======i++      i=i+10===i+=10

方法一:awk '/250/{print $NF}' reg.txt|sort|uniq -c|sort -rnk2

方法二:awk '/250/{i=i+1;print i}' reg.txt

方法三:grep -c '250' reg.txt

方法awk '/250/{++i}END{print i}' reg.txt 


1.22 修改换行符

awk '{print $0,RS}' ppppp   显示换行符浩

awk 'BEGIN{RS="/"}{print NR $0}' ppppp  修改换行符

 

1.23 awk替换  gsub

awk '{gsub(/:/,"$",$NF); print $0}' reg.t

 

1.24 查看文件有多少行

awk  '{print NF}' /tmp/user.txt


1.25 找出文件中只有一列的

awk 'NR>1{if (NF<2) print $0}' test.txt