awk 报表工具

nawk

gawk

[root@localhost ~]# ll /bin/awk
lrwxrwxrwx. 1 root root 4 Jun  6 05:55 /bin/awk -> gawk

wKiom1Xyut-zUXYCAABQrg5GUPM898.jpg

awk.txt测试内容如下

this a test

welcome to my home 

awk '{print $0}' awk.txt 显示一整行
awk '{print $1}' awk.txt显示每行的第一段
awk '{print $1,$3}' awk.txt显示每行的第一和第三段

【指定输出格式的分隔符,用双引号】

# awk 'BEGIN{OFS="#"}{print $1,$3}' awk.txt 
this#a
welcome#my

【在print中插入任何想显示的字段,用双引号】

# awk '{print $1,"HELLO_LINUX",$3}' awk.txt 
this HELLO_LINUX a
welcome HELLO_LINUX my

【显示每一行多少个字段】

awk '{print NF}' awk.txt
awk '{print $NF}' awk.txt


把awk.txt ps.txt多个文件的行总数输出来

awk '{print NR}' awk.txt ps.txt


把awk.txt ps.txt 每个文件的行的总数分别显示出来

awk '{print FNR}' awk.txt ps.txt

awk 也可以定义变量的

# awk 'BEGIN{ta="haha";print ta}'
haha
# awk 'BEGIN{haha="4i932584293";print haha}'
4i932584293


wKiom1Xyu6vRFhq0AAJgOF_FGx0790.jpg


【修饰效果】%

%-10s   :s显示自身,10表示宽度显示10位,-表示左对齐,不写-默认右对齐,\n换行

# awk '{printf"%-10s\n",$1}' awk.txt 
this      
welcome   

# awk '{printf"%-10s %1-20s\n",$1,$2}' awk.txt 
this       is                  
welcome    to

显示passwd中第3个字段内容,默认5个宽度右对齐

awk -F: '{printf "%5d",$3}' passwd


 


【匹配行首r开头的】-F 指定分隔符

awk -F: '/^r/{print $1}' passwd


【显示ID号大于50用户名】

awk -F: '$3>=50{print $1,$3}'
awk -F: '$3+1>=50{print $1,$3}'还支持运算操作


【~匹配,把默认不能登录bash的用户筛选出来】

-F:指定分隔符

~匹配

$锚定行尾

awk -F: '$7~"nologin$"{print $1,$7}' passwd

反过来,登录不是nologin的用户都出来

awk -F: '$7!~"nologin$"{print $1,$7}' passwd


$3==0且$7是bash的  显示出来

awk -F: '$3==0,$7~"bash"{print $3,$7}' passwd

把这几个列按固定的宽对齐方式对齐

awk -F: '{printf"%-20s%-20s%-20s\n",$1,$5,$7}' passwd
用BGGIN制作带有表头的输出
awk -F: 'BEGIN{print"user      ID      shell"}{printf "%-20s%-20s %-20s ",$1,$3,$7}' paswd
name   ID  shell
root      0         /bin/bash 
bin       1         /sbin/nologin
daemon    2         /sbin/nologin
adm       3         /sbin/nologin
lp        4         /sbin/nologin


用END显示一次 打印结束

awk -F: 'BEGIN{print"name   ID  shell"}{printf "%-10s%-10s%-10s\n",$1,$3,$7}END{print "****************the end *************"}' passwd

postfix   89        /sbin/nologin
sshd      74        /sbin/nologin
****************the end *************

【if语句】

显示root为管理员

其他为普通

也可以显示为格式化

#awk -F: '{if ($1=="root") print $1 "    anmin";else print $1 "       common user"}' passwd
#awk -F: '{if ($1~"root") print $1 "    anmin";else print $1 "       common user"}' passwd


统计ID号大于50的

-F 指定分隔符

if条件()起来

print变量不用$来引用

awk -F: -v sum=0 '{if($3>50) sum++}END{print sum}' passwd

 

【while】用于字段的循环

把每一行的每一字段都用if比较,大于4个就输出

awk -F: '{i=1;while(i<NF){if (length($i)>=4) {print $i} i++}}' passwd

 

【for循环】

awk -F: '{for(i=1;i<=NF;i++) {if (length($i)>=4) {print $i}}}' passwd
for(i=1;i<=NF;i++)
{if (length($i)>=4)
{print $i} 这个是if语句你的执行体

用数组统计netstat -tna状态

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


统计每个IP出现的次数

# awk '{count[$1]++}END{for(ip in count) {printf "%-20s:%d\n",ip,count[ip]}}' ssh.log 
                    :13
1.2.3.4             :11
34.76.86.22         :11
56.8.64.32          :11
45.67.86.43         :11

统计出现的次数

grep -c '45.67.86.43' ssh.log



统计别人用系统帐号的失败连接

grep 'Failed password ' secure |awk '{count[$11]++}END{for(ip in count) {printf "%-20s:%d\n",ip,count[ip]}}'

失败的来访IP与用户名 secure日志文件

sed -n '/Failed/p' secure |awk '{printf"%-15s%-15s\n", $(NF-5), $(NF-3)}'
yy             10.11.12.14    
4234           10.11.12.14    
4234           10.11.12.14    
root           10.11.12.8     
root           10.11.12.8

谁成功登录过

sed -n '/Accepted/p' secure
Jun 11 17:16:28 localhost sshd[1166]: Accepted password for root from 10.11.12.14 port 49531 ssh2
Jun 11 17:18:14 localhost sshd[1192]: Accepted password for root from 10.11.12.14 port 49534 ssh2

secure日志文件

整合以上的几条命令,登录失败的IP次数

sed -n '/Failed/p' secure |awk '{printf"%-15s%-15s\n", $(NF-5), $(NF-3)}'|awk '{count[$2]++}END{for(ip in count) {printf "%-20s:%d\n",ip,count[ip]}}'
10.11.12.8          :8
10.11.12.14         :5


再排序一下

sed -n '/Failed/p' secure |awk '{printf"%-15s%-15s\n", $(NF-5), $(NF-3)}'|awk '{count[$2]++}END{for(ip in count) {printf "%-20s:%d\n",ip,count[ip]}}'|sort -r


显示运行3级别开启的服务:

cut -c 字符,15-,就是从15到最后

ls /etc/rc3.d/S* |cut -c 15-