Linux三剑客之 awk 的基本用法

前言

在Linux中,awk是一个非常重要的、更是强大的文本处理工具
学会awk将会使你的工作变得更加的轻松,当然最重要的是…高大上啊,咳咳
好,废话不多说,进入正题了

正文

首先记住几个特殊变量

  • NR:这个变量可以用来表示行号
  • NF:这个变量可以用来表示列号
  • $1 : 表示当前记录的第一列的文本内容
  • $2 :表示当前记录的第二列的文本内容

然后再记住几个重要的参数

  • sort :排序,但是是按照一个数值得第一个数字大小进行排序。比如:1,5,11,22的排序就是1, 11, 22, 5
  • uniq -c:去重(统计):对重复出现的数值,每出现一次将其出现的次数+1
  • sort -n :排序,是按照数值的大小进行排序1, 5, 11, 22 的排序就是1, 5, 11, 22
awk实用理解案例

1、指定awk的字段分隔符【默认是以空格为分隔符】

$ awk -F: '{ print $1 }' /etc/passwd
$ awk 'BEGIN{ FS=":" }{ print $1 }' /etc/passwd
# 这里有两种方法,一种是直接 -F: 指定分隔符为:  一种是通过BEGIN{ FS=":" }

2、指定打印文件中的第2列和第3列

$ awk -F: '{ print $2, $3 }' /etc/passwd
x 0
x 1
x 2
x 3

3、统计文件/etc/passwd的行数,打印出所有的行号

$ awk '{ print NR }' /etc/passwd
...
...
39
40
41

4、打印第1行的第7列

$ awk -F: 'NR==1{ print $7 }' /etc/passwd
/bin/bash
# NR代表行号,NR==1就表示是第一行

5、打印最后一列和倒数第四列

awk -F: '{ print $(NF), $(NF-3) }' /etc/passwd
/sbin/nologin 72
/sbin/nologin 25
/sbin/nologin 38
# 直接写$(NF) 指的就是最后一列
# 如果是$(NF-3) 减去3,就是倒数第四列

5、在命令行中,传递变量到awk中

$ var=5000
$ echo | awk -v variable=$var '{ print variable }'
5000
# awk起到的是一个中间变量的作用
# 在awk中需要再次声明一个中间变量,这里是variable
# 把在在awk中声明的中间变量bariable传递给print

6、在脚本中,传递多个变量到awk中

$ var1="Variable01" ; var2="Variable02"
$ echo | awk '{ print v1, v2 }' v1=$var1 v2=$var2

7、换行

# print: 在每次输出的后面加一个\n来换行,而printf不会。
# 所以printf的所有输出都挤在一行中
#而print每次输出后都会自动换行
$ awk 'BEGIN{ FS=":" }{ printf $1 }' /etc/passwd
rootbindaemonadmlpsyncshutdown
$ awk 'BEGIN{ FS=":" }{ print $1 }' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown

8、排序(从日志文件access.log中统计出访问的IP,并且进行排序 输出到文件text.txt)

$ awk 'BEGIN{ FS=" " }{ print $1 }' access.log | sort >> text.txt
# sort 就是对awk切出来的第一列的文本按照第一个数字的大小进行排序

9、去重统计(针对第步8的输出进行统计每一个IP访问了多少次)

$ awk 'BEGIN{ FS=" " }{ print $1 }' access.log | sort | uniq -c >> text.txt
170 112.66.41.143
329 223.198.168.116
243 112.66.32.178
555 54.227.74.125
215 121.58.53.171
# uniq -c 就是进行统计每一个IP出现了多少次

10、如果我们希望对统计的结果进行排序,按照访问次数从多到少降序排序

$ awk 'BEGIN{ FS=" " }{ print $1 }' access.log | sort | uniq -c | sort -nr >> text.txt
555 54.227.74.125
329 223.198.168.116
243 112.66.32.178
215 121.58.53.171
170 112.66.41.143

 - $1:打印出第11列、排序、去重【统计】
 - 
 - sort:排序,但是是依据首个字符的大小,所以要加上参数n和r
 -n:number 按照数值的大小进行升序排序
 -r: reverse反转【升序-->>降序 降序-->>升序】
 

补充:
 - 第一次的sort绝对不能少,首先要排好序,然后再进行去重统计
 - 否则很可能同一个ip在前面统计出三次,,后边又统计出5次
 - 实际上就是因为少了第一次的sort
 - 这个ip其实一共是出现了8次

优秀是一种选择,也是一种态度

你可能感兴趣的:(shell,awk,linux)