awk 报表工具
nawk
gawk
[root@localhost ~]# ll /bin/awk lrwxrwxrwx. 1 root root 4 Jun 6 05:55 /bin/awk -> gawk
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
【修饰效果】%
%-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-
转载于:https://blog.51cto.com/990487026/1693930