linux学习-awk命令

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,783评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,396评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,834评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,036评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,035评论 5 362
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,242评论 1 278
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,727评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,376评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,508评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,415评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,463评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,140评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,734评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,809评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,028评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,521评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,119评论 2 341

推荐阅读更多精彩内容

  • 基础命令 主要的命令和快捷键 Linux系统命令由三部分组成:cmd + [options]+[operation...
    485b1aca799e阅读 1,083评论 0 0
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,357评论 0 5
  • 简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者...
    保川阅读 5,939评论 1 13
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,710评论 0 10
  • 1、资本:资本确实是由钱构成的,但,仅仅是一堆钱放在那里肯定不算资本。 2、钱本身顶多可以算作资金,而它想要成为有...
    Demohour阅读 166评论 0 0