不止是搬运工
我们更专注精品分享!

三剑客之awk

最近各种云盘挂掉,直到上周,用了很久的为知笔记官方宣布要收费了,就不吐槽了,云端的东西各种不靠谱,还是把平时的一些有价值的笔记,转移到博客吧,转多少是多少。

因为是整理的笔记,所以可能很乱,见谅!

grep、sed、awk 3个linux最常用的文本处理工具,不知道最初是从哪听到的,称之为三剑客,总之很带感!

三者都支持正则表达式

grep 文本过滤,性能比awk要好,而且要好很多。

sed   我用的最多的是文本替换,尤其适用在shell中。

awk  文本格式化工具,报告生成器,本身不编辑文本,工作与遍历模式下,迭代,每次读一行。

今天的主角就是三剑客老大,awk!

首先,awk的工作模式

awk 'BEGIN{ print "start"}  pattern { commands }  END{ print "end"}'   file
awk是迭代处理,即一行行的处理。比如我们打印第1个字段结果的处理过程:先取第一行的第一个字段,然后再取第二行的第一个字段。。。一直到处理完整个数据流。
以下内容中的file的内容:

# cat file

ll 34523452345 80 97 70

kk 78979797979 90 90 90

hh 78979879797 60 60 60

jj 23678236876 59 58 57

aa 78987897878 23 34 12

awk指定多个分隔符
awk默认是以空白为分隔符,如果有其他分隔符,我们需要使用-F’ ‘指定(类似cut -d’ ‘
# cat /etc/passwd | tail -2 |awk -F':' '{print $1}'
user19
user20
也可以指定多个分隔符,通过正则[]来匹配,如果多个相同符号,我们可以'[ ]+’来将相同符号认为一个.比如我们修改文件file成如下内容
# cat file
ll:34523452345 80 97 70
kk:78979797979 90 90 90
hh 78979879797 60 60 60
jj 23678236876 59 58 57
aa 78987897878 23 34 12
现在我们要取第二列
# cat file |awk -F'[ :]' '{print $2}'
34523452345
78979797979
78979879797
23678236876
78987897878
 如果我们前边变成两个冒号,那写法就变成这样:
# cat file |awk -F'[ :]+' '{print $2}'
 没有+号,则两个冒号的无法显示,认为两个冒号之前认为是空白。其中多个空白也需要+号。
举个例子,取本机的ip:
# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 52:54:00:8B:CA:F2 
inet addr:192.168.1.9 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::5054:ff:fe8b:caf2/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
 用awk获取ip的写法(当然方法不限于此,cut也可以取到值,并且都有很多写法):
# ifconfig eth0 | grep "t a" |awk -F'[ :]+' '{print $4}'
192.168.1.9

# ifconfig eth0 | awk 'NR==2{print $0}' |awk -F'[ :]+' '{print $4}'
192.168.1.9

awk计算方法
取3 4 5行的和,取平均数,将取的平均数取整。注意:awk的计算支出小数,如果取整可以int。

# cat file |awk '{print $0,$3+$4+$5,($3+$4+$5)/3,int(($3+$4+$5)/3)}'

ll 34523452345 80 97 70 247 82.3333 82
kk 78979797979 90 90 90 270 90 90
hh 78979879797 60 60 60 180 60 60
jj 23678236876 59 58 57 174 58 58
aa 78987897878 23 34 12 69 23 23

另一种写法:

# cat file |awk '{sum=$3+$4+$5;print $0,sum,sum/3,int(sum/3)}'

ll 34523452345 80 97 70 247 82.3333 82
kk 78979797979 90 90 90 270 90 90
hh 78979879797 60 60 60 180 60 60
jj 23678236876 59 58 57 174 58 58
aa 78987897878 23 34 12 69 23 23

延伸生产环境使用,统计httpd占用内存整体使用情况(也可以统计cpu,其他进程一样):

# ps aux | grep httpd |awk '{total+=$4};END{print total}'
20.8

统计php-fpm的cpu和内存使用:

# ps aux  |grep php-fpm|awk '{a+=$3;b+=$4}END{print "cpu:"a,"mem:"b}'
cpu:3.1 mem:12.2
显示整个文本(注意,这里只是测试,所以只有一行)
#  awk '{print $N}' test.txt
this is a test.

# awk '{print $0}' test.txt
this is a test.
显示文本的一行中的第一个参数
# awk '{print $1}' test.txt
this
显示文本的一行中的第二个参数
# awk '{print $2}' test.txt
is
显示文本的一行中的第四个参数
# awk '{print $4}' test.txt
test.
显示文本的一行中的第一与第二个个参数
# awk '{print $1,$2}' test.txt
this is
显示文本的一行中的第一个与第二个参数,中间可以加#
# awk 'BEGIN{OFS="#"}{print $1,$2}' test.txt
this#is
显示文本中的各个参数,还可以加修饰符
# awk 'BEGIN{OFS=":"}{print $1,$2,$3,$4}' test.txt
this:is:a:test.
显示文本中的参数,还可以加修饰符,还可以加字符串
#  awk 'BEGIN{OFS=":"}{print $1,"hello",$2}' test.txt
this:hello:is
输出三行,注意换行需要加\n
# awk 'BEGIN { print "line one\nline two\nline three" }'
line one
line two
line three

 

Regexp: 正则表达式,格式为/regular expression/

awk '/^abc/{....}' abc开头

awk '!/^abc/{...}' 不是以abc开头

awk '/abc/{...}' 包含abc字符串

awk '!/abc/{...}' 不包含abc

~:匹配,可以和上边的结合使用

显示以r开头的行
# awk -F: '/^r/{print $1}' /etc/passwd
root
rpc
rpcuser

这只是九牛一毛,详细的写法够写一本书了,事实上awk的书籍确实很多,想深入学习的还是建议买本书来啃吧。

未经允许不得转载:Opdev.me » 三剑客之awk

支付宝打赏 微信打赏

博主五行缺钱,如果文章对您有帮助,欢迎打赏博主!

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

你拍一,我拍一,小霸王出了学习机!

撸一发!