天天看点

Linux文本处理工具AWK使用解析

      在linux系统上有三大文本处理工具分别是:grep,sed,awk,这次主要来看看awk。

awk  option  ‘pattern'  file

-F    指定分隔符;

-v     申明自定义变量;

查看当前系统上,用户名和用户shell,输出分隔符为~.

# awk -F: 'BEGIN{OFS="~";print "UserName   Shell"}{print $1,$7}END{print "================end============="}' /etc/passwd

<a href="http://s3.51cto.com/wyfs02/M00/30/68/wKioL1OnkG2Te8bLAAHoqAr3-7g056.jpg" target="_blank"></a>

还可以在中间加入模式(pattern),指定只对以in字符结尾的行做处理。

# awk -F: 'BEGIN{OFS="~";print "UserName   Shell"}/in$/{print $1,$7}END{print "================end============="}' /etc/passwd

<a href="http://s3.51cto.com/wyfs02/M01/30/69/wKiom1OnkOzi04CKAAGVk9MVmA4087.jpg" target="_blank"></a>

显示当前系统上id号小于等于500的用户。(表达式匹配)

# awk -F: '$3&lt;=500{print $1,$3}' /etc/passwd

<a href="http://s3.51cto.com/wyfs02/M01/30/69/wKiom1OnkfTysUq8AADz8_EeYe4797.jpg" target="_blank"></a>

显示当前系统上shell是/bin/bash的用户(模式匹配)

# awk -F: 'BEGIN{OFS=":";print "UserName  Shell"}$7~/bash/{print $1,$7}' /etc/passwd

<a href="http://s3.51cto.com/wyfs02/M01/30/69/wKioL1Onl2bjz1u4AADhHFbpQSY508.jpg" target="_blank"></a>

控制语句:

判断用户ID是否为0,如果是就输出用户名并说明是一个管理员用户,如果不是输出用户名,说明是一个普通用户。

# awk -F: '{if ($3==0) {print $1,"Administrator";} else {print  $1,"Common User"}}' /etc/passwd

<a href="http://s3.51cto.com/wyfs02/M01/30/6C/wKioL1OnxgKSOvcjAAFwjsNQKlA986.jpg" target="_blank"></a>

统计下系统上有多少个id号大于500的用户

# awk -F: -v Sum=0 '{if ($3&gt;=500) Sum++}END{print Sum}' /etc/passwd

<a href="http://s3.51cto.com/wyfs02/M02/30/6D/wKiom1OnyD6yBqjXAABze-oENBI068.jpg" target="_blank"></a>

显示number.txt文件中,所以大于100的数值。

# awk  '{i=1;while (i&lt;=NF) {if ($i&gt;=100) print $i;i++}}' number.txt

<a href="http://s3.51cto.com/wyfs02/M02/30/72/wKioL1On2DPxRUTHAACNMVVAN1k595.jpg" target="_blank"></a>

do-while    至少执行一次循环体,不管条件满足与否。

# awk -F: '{i=4;do {print $i;i--}while (i&gt;4)}' /etc/passwd

遍历/etc/passwd  $1-$3数值,只输出字符数大于4的数据。

# awk -F: '{for(i=1;i&lt;=3;i++){if (length($i)&gt;=4){print $i}}}' /etc/passwd

<a href="http://s3.51cto.com/wyfs02/M01/30/73/wKioL1On3VizB9Q_AACb890E34E218.jpg" target="_blank"></a>

使用for显示number.txt文件中,所以大于100的数值。

# awk '{for (i=1;i&lt;=NF;i++){if ($i&gt;=100) {print $i}}}' number.txt

查看网络连接各个状态的次数

# netstat -tan | awk '/^tcp/{state[$NF]++}END{for ( S in state) print S,state[S]}'

<a href="http://s3.51cto.com/wyfs02/M01/30/75/wKioL1On5E_AS9BkAAG3w3BNjSI837.jpg" target="_blank"></a>

统计日志每个ip访问了多少次

# awk '{ip[$1]++}END{for ( A  in ip ) print  A,ip[A]}'  access_log

统计当前系统用户,每种shell各有多少个。

# awk -F: '{count[$NF]++}END{for (A in count )print A,count[A]}' /etc/passwd

<a href="http://s3.51cto.com/wyfs02/M00/30/76/wKioL1On57PwTWsFAAC6YdjgZnE778.jpg" target="_blank"></a>

awk的内置函数

split        将数据按分隔符切片保存至数组里

length     返回字符串的字符个数

查看当前每个IP连接,与连接次数。

# netstat -tan | awk '/:80/{split($5,client,":");IP[client[4]]++}END{for (A in IP) print A,IP[A]}'

<a href="http://s3.51cto.com/wyfs02/M01/30/7C/wKioL1On9P-w0vu2AAFuwWg7z2Y078.jpg" target="_blank"></a>

就是数组和split函数这里难了

OK完成了

本文转自qw87112 51CTO博客,原文链接:http://blog.51cto.com/tchuairen/1429894

继续阅读