美文网首页
linux学习-awk命令

linux学习-awk命令

作者: 夏天嘚花花 | 来源:发表于2019-03-22 17:53 被阅读0次
awk的命令格式
awk -F|-f|-v 'BEGIN{ } / / {comand1;comand2} END{ }' file
-F 定义列分隔符
-f 指定调用脚本
-v 定义变量
' '引用代码块,awk执行语句必须包含在内
BEGIN{ } 初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符
{ } 命令代码块,包含一条或多条命令
/ / 用来定义需要匹配的模式(字符串或者正则表达式),对满足匹配模式的行进行上条代码块的操作
END{ }  结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息

$0           表示整个当前行
$1           每行第一个字段
NF          字段数量变量
NR          每行的记录号,多文件记录递增
FNR         与NR类似,不过多文件记录不递增,每个文件都从1开始
\t          制表符
\n          换行符
FS          BEGIN时定义分隔符
RS          输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)
~            匹配,与==相比不是精确比较
!~           不匹配,不精确比较
==           等于,必须全部相等,精确比较
!=           不等于,精确比较
&&          逻辑与
||              逻辑或
+              匹配时表示1个或1个以上
/[0-9][0-9]+/   两个或两个以上数字
/[0-9][0-9]*/    一个或一个以上数字
FILENAME 文件名
OFS      输出字段分隔符, 默认也是空格,可以改为制表符等
ORS        输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕
-F'[:#/]'   定义三个分隔符

awk的内建变量

image.png

创建一个实例文本

[root@Slave3 home]# cat netstat.txt 
Proto Recv-Q Send-Q Local-Address          Foreign-Address             State
tcp        0      0 0.0.0.0:3306           0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:80             0.0.0.0:*                   LISTEN
tcp        0      0 127.0.0.1:9000         0.0.0.0:*                   LISTEN
tcp        0      0 coolshell.cn:80        124.205.5.146:18245         TIME_WAIT
tcp        0      0 coolshell.cn:80        61.140.101.185:37538        FIN_WAIT2
tcp        0      0 coolshell.cn:80        110.194.134.189:1032        ESTABLISHED
tcp        0      0 coolshell.cn:80        123.169.124.111:49809       ESTABLISHED
tcp        0      0 coolshell.cn:80        116.234.127.77:11502        FIN_WAIT2
tcp        0      0 coolshell.cn:80        123.169.124.111:49829       ESTABLISHED
tcp        0      0 coolshell.cn:80        183.60.215.36:36970         TIME_WAIT
tcp        0   4166 coolshell.cn:80        61.148.242.38:30901         ESTABLISHED
tcp        0      1 coolshell.cn:80        124.152.181.209:26825       FIN_WAIT1
tcp        0      0 coolshell.cn:80        110.194.134.189:4796        ESTABLISHED
tcp        0      0 coolshell.cn:80        183.60.212.163:51082        TIME_WAIT
tcp        0      1 coolshell.cn:80        208.115.113.92:50601        LAST_ACK
tcp        0      0 coolshell.cn:80        123.169.124.111:49840       ESTABLISHED
tcp        0      0 coolshell.cn:80        117.136.20.85:50025         FIN_WAIT2
tcp        0      0 :::22                  :::*                        LISTEN
例子1

输出netstat.txt的第1,4列

  • 单引号中的被大括号括着的就是awk的语句,注意,其只能被单引号包含
  • 其中的1..n表示第几例。注:$0表示整个行
[root@Slave3 home]# awk '{print $1,$4}' netstat.txt 
Proto Local-Address
tcp 0.0.0.0:3306
tcp 0.0.0.0:80
tcp 127.0.0.1:9000
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp :::22
例子2:格式化输出
[root@Slave3 home]# awk '{printf "%-8s %-8s\n",$1,$2}' netstat.txt
Proto    Recv-Q  
tcp      0       
tcp      0       
tcp      0       
tcp      0       
tcp      0       
tcp      0       
tcp      0       
tcp      0       
tcp      0       
tcp      0       
tcp      0       
tcp      0       
tcp      0       
tcp      0       
tcp      0       
tcp      0       
tcp      0       
tcp      0       
列子3:输出行号

NR表示行号

[root@Slave3 home]# awk '{print NR,$0}' netstat.txt 
1 Proto Recv-Q Send-Q Local-Address          Foreign-Address             State
2 tcp        0      0 0.0.0.0:3306           0.0.0.0:*                   LISTEN
3 tcp        0      0 0.0.0.0:80             0.0.0.0:*                   LISTEN
4 tcp        0      0 127.0.0.1:9000         0.0.0.0:*                   LISTEN
5 tcp        0      0 coolshell.cn:80        124.205.5.146:18245         TIME_WAIT
6 tcp        0      0 coolshell.cn:80        61.140.101.185:37538        FIN_WAIT2
7 tcp        0      0 coolshell.cn:80        110.194.134.189:1032        ESTABLISHED
8 tcp        0      0 coolshell.cn:80        123.169.124.111:49809       ESTABLISHED
9 tcp        0      0 coolshell.cn:80        116.234.127.77:11502        FIN_WAIT2
10 tcp        0      0 coolshell.cn:80        123.169.124.111:49829       ESTABLISHED
11 tcp        0      0 coolshell.cn:80        183.60.215.36:36970         TIME_WAIT
12 tcp        0   4166 coolshell.cn:80        61.148.242.38:30901         ESTABLISHED
13 tcp        0      1 coolshell.cn:80        124.152.181.209:26825       FIN_WAIT1
14 tcp        0      0 coolshell.cn:80        110.194.134.189:4796        ESTABLISHED
15 tcp        0      0 coolshell.cn:80        183.60.212.163:51082        TIME_WAIT
16 tcp        0      1 coolshell.cn:80        208.115.113.92:50601        LAST_ACK
17 tcp        0      0 coolshell.cn:80        123.169.124.111:49840       ESTABLISHED
18 tcp        0      0 coolshell.cn:80        117.136.20.85:50025         FIN_WAIT2
19 tcp        0      0 :::22                  :::*                        LISTEN
例子4:过滤条件输出

找到第三列是0且第六列是LISTEN的行并输出
其他比较运算符:!=, >, <, >=, <=

[root@Slave3 home]# awk '$3==0 && $6=="LISTEN" {print $0}' netstat.txt
tcp        0      0 :::22                  :::*                        LISTEN
例子5:过滤+格式化输出
[root@Slave3 home]# awk '$3==0 && $6=="LISTEN" || NR==1 {printf "%-20s %-20s %s\n",$4,$5,$6}' netstat.txt
Local-Address        Foreign-Address      State
:::22                :::*                 LISTEN
例子6:指定分隔符输出
[root@Slave3 home]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologin
oprofile:x:16:16:Special user account to be used by OProfile:/home/oprofile:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
hsqldb:x:96:96::/var/lib/hsqldb:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin

-F: 表示使用:进行分割
NR: 上面说表示行号,我们这了过滤出前9条数据

[root@Slave3 home]# awk -F: 'NR < 10 {print $1,$2}' /etc/passwd
root x
bin x
daemon x
adm x
lp x
sync x
shutdown x
halt x
mail x
例子7:指定分隔符分割并指定分隔符输出

如例子6我们采用:作为分割符分割,输出时默认是采用空格来输出每个列的,我们可以执行输出时的分割符

[root@Slave3 home]# awk -F:  'NR < 10 {print $1,$2}' OFS="\t"  /etc/passwd
root    x
bin x
daemon  x
adm x
lp  x
sync    x
shutdown    x
halt    x
mail    x
例子8:使用正则表达式过滤

$1 ~ /w+/ 表示第一列采用表达式w+来过滤。 ~表示模式开始 //之间插入正则表达式

[root@Slave3 home]# awk -F: '$1 ~ /w+/ {print $0}' /etc/passwd
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
BCS-myview-web:x:476:471:BCS-myview-web:/home/BCS-myview-web:/bin/bash

awk常用正则表达式


image.png
例子9:反模式过滤

对例子8的结果取反,反模式采用的是!~

[root@Slave3 home]# awk -F: '$1 !~ /w+/ {print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
.....
例子10:拆分文件

按照第六列将第六列的值拆分成好几个文件,例如第六列有aa,bb,cc,dd 则拆分后会分成 aa,bb,cc,dd这几个文件,aa里面就包含第六列为aa的所有数据

[root@Slave3 xuzhiyong]# awk 'NR!=1{print > $6}' netstat.txt 
[root@Slave3 xuzhiyong]# ls
ESTABLISHED?  FIN_WAIT1?  FIN_WAIT2?  LAST_ACK?  LISTEN  LISTEN?  netstat.txt  TIME_WAIT?
[root@Slave3 xuzhiyong]# ll
total 32
-rw-r--r-- 1 root root  504 Mar 22 17:23 ESTABLISHED?
-rw-r--r-- 1 root root   82 Mar 22 17:23 FIN_WAIT1?
-rw-r--r-- 1 root root  246 Mar 22 17:23 FIN_WAIT2?
-rw-r--r-- 1 root root   81 Mar 22 17:23 LAST_ACK?
-rw-r--r-- 1 root root   78 Mar 22 17:23 LISTEN
-rw-r--r-- 1 root root  237 Mar 22 17:23 LISTEN?
-rw-r--r-- 1 root root 1551 Mar 22 16:54 netstat.txt
-rw-r--r-- 1 root root  246 Mar 22 17:23 TIME_WAIT?
[root@Slave3 xuzhiyong]# cd ESTABLISHED^M 
: Not a directoryISHED
[root@Slave3 xuzhiyong]# cat ESTABLISHED?
tcp        0      0 coolshell.cn:80        110.194.134.189:1032        ESTABLISHED
tcp        0      0 coolshell.cn:80        123.169.124.111:49809       ESTABLISHED
tcp        0      0 coolshell.cn:80        123.169.124.111:49829       ESTABLISHED
tcp        0   4166 coolshell.cn:80        61.148.242.38:30901         ESTABLISHED
tcp        0      0 coolshell.cn:80        110.194.134.189:4796        ESTABLISHED
tcp        0      0 coolshell.cn:80        123.169.124.111:49840       ESTABLISHED
例子11:拆分文件采用if语句自定义拆分

NR!=1 表示不输出第一行,就是表头
里面的条件逻辑表示将第六行为TIME|ESTABLISHED放到1.txt;LISTEN放到2.txt;其他的放到3.txt

[root@Slave3 xuzhiyong]# awk 'NR!=1 {if($6 ~ /TIME|ESTABLISHED/) print > "1.txt"; else if($6 ~ /LISTEN/) print > "2.txt"; else print > "3.txt"}' netstat.txt 
[root@Slave3 xuzhiyong]# ll
total 44
-rw-r--r-- 1 root root  750 Mar 22 17:46 1.txt
-rw-r--r-- 1 root root  315 Mar 22 17:46 2.txt
-rw-r--r-- 1 root root  409 Mar 22 17:46 3.txt
-rw-r--r-- 1 root root  504 Mar 22 17:23 ESTABLISHED?
-rw-r--r-- 1 root root   82 Mar 22 17:23 FIN_WAIT1?
-rw-r--r-- 1 root root  246 Mar 22 17:23 FIN_WAIT2?
-rw-r--r-- 1 root root   81 Mar 22 17:23 LAST_ACK?
-rw-r--r-- 1 root root   78 Mar 22 17:23 LISTEN
-rw-r--r-- 1 root root  237 Mar 22 17:23 LISTEN?
-rw-r--r-- 1 root root 1551 Mar 22 16:54 netstat.txt
-rw-r--r-- 1 root root  246 Mar 22 17:23 TIME_WAIT?
[root@Slave3 xuzhiyong]# cat 1.txt 
tcp        0      0 coolshell.cn:80        124.205.5.146:18245         TIME_WAIT
tcp        0      0 coolshell.cn:80        110.194.134.189:1032        ESTABLISHED
tcp        0      0 coolshell.cn:80        123.169.124.111:49809       ESTABLISHED
tcp        0      0 coolshell.cn:80        123.169.124.111:49829       ESTABLISHED
tcp        0      0 coolshell.cn:80        183.60.215.36:36970         TIME_WAIT
tcp        0   4166 coolshell.cn:80        61.148.242.38:30901         ESTABLISHED
tcp        0      0 coolshell.cn:80        110.194.134.189:4796        ESTABLISHED
tcp        0      0 coolshell.cn:80        183.60.212.163:51082        TIME_WAIT
tcp        0      0 coolshell.cn:80        123.169.124.111:49840       ESTABLISHED
例子12: 统计字节数量

****awk命令是针对每一个行进行的操作****
例如统计文件夹下这些文件的总共大小

[root@server-1 xuzhiyong]# ls -l *.cpp *.c *.h 
-rw-r--r-- 1 root root 73 Mar 24 05:54 1.c
-rw-r--r-- 1 root root  0 Mar 24 05:51 1.cpp
-rw-r--r-- 1 root root  0 Mar 24 05:51 1.h
-rw-r--r-- 1 root root  0 Mar 24 05:51 2.c
-rw-r--r-- 1 root root  0 Mar 24 05:51 2.cpp
-rw-r--r-- 1 root root 57 Mar 24 05:55 2.h
-rw-r--r-- 1 root root  0 Mar 24 05:51 3.c
-rw-r--r-- 1 root root  0 Mar 24 05:51 3.h
-rw-r--r-- 1 root root  0 Mar 24 05:51 4.c
-rw-r--r-- 1 root root  0 Mar 24 05:51 4.h

使用管道命令 | 对 ls -l .cpp .c .h 输出的结果做统计。其中记住awk命令是针对每一个行进行的操作*,所以{sum+=$5}表示每一行的第五列的值都加起来,然后内建变量END指定处理完每一行后的操作{print sum}

[root@server-1 xuzhiyong]# ls -l *.cpp *.c *.h | awk '{sum+=$5} END {print sum}'
130
例子13:统计2
[root@server-1 xuzhiyong]# awk 'BEGIN {count=0 ; print "=====start====="} {count++;} END {print "The file size is ",count}' /etc/passwd
=====start=====
The file size is  35
例子14:awk的内嵌函数
image.png
image.png
[root@server-1 xuzhiyong]# awk '{print length($6)}' netstat.txt 
6
7
7
7
10
10
12
12
10
12
10
12
10
12
10
9
12
10
6

相关文章

  • Linux

    linux awk命令详解、linux awk命令Linux常用操作指令Linux netstat命令详解 awk...

  • awk命令

    下文来自:美团 吴孟达更多AWK命令请参考:Linux awk 命令扩展:linux sort,uniq,cut,...

  • Linux命令学习之:awk命令

    Linux命令学习之:awk命令 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk...

  • Linux | awk

    参考:http://www.runoob.com/linux/linux-comm-awk.html awk命令的...

  • Linux 学习笔记(十四):Linux 正则表达式基础

    grep 命令 作为linux中最为常用的三大文本(awk(Linux awk教程),sed(Linux sed教...

  • Linux的awk命令

    Linux的awk命令 众所周知awk命令是Linux一个非常重要又难以掌握的命令,下面对这个命令进行一个详细的说...

  • Linux命令学习-awk

    awk 文本处理,每次读取一行,并进行分片(默认用空格分割),然后依次放入变量 $1, $2, $3, ..., ...

  • linux awk命令学习

    参考文章链接:http://blog.chinaunix.net/uid-23302288-id-3785105....

  • linux学习-awk命令

    awk的命令格式 awk的内建变量 创建一个实例文本 例子1 输出netstat.txt的第1,4列 单引号中的被...

  • 【linux命令学习】— awk 命令学习

    本人的CSDN博客地址https://blog.csdn.net/u013332124/article/detai...

网友评论

      本文标题:linux学习-awk命令

      本文链接:https://www.haomeiwen.com/subject/spsrvqtx.html