1-linux 三剑客 使用总结 grep sed awk

linux 三剑客

下面所说的是Linux中最重要的三个命令在业界被称为“三剑客”,它们是awk,sed,grep。

我们现在知道Linux下一切皆文件,对Linux的操作就是对文件的处理,那么怎么能更好的处理文件呢?这就要用到我们上面的三剑客命令。

三剑客的功能非常强大,但我们只需要掌握他们分别擅长的领域即可:grep擅长查找功能,sed擅长取行和替换。awk擅长取列。

准备一个文件,练习一下下面的命令,最好是一个Nginx日志这样的日志文件,毕竟日志查询是重头,

一、正则表达式

在说这三个命令前我们要插入一个小插曲就是“正则表达式”。

所谓的正则表达式我个人理解就是正规的表示方法。他是用简单的方法来实现强大的功能,所以深受计算机爱好者的使用。

三剑客与正则表达式是什么关系呢?

我们可以这样理解,三剑客就是普通的命令,有的把他们叫做工具,在我看来都一样。而正则表达式就好比一个模版。三剑客能读懂这个模版。就这么简单。注意只有三剑客才能读懂这个模版哦!

现在他们的关系和功能都搞懂了,接下来我们就来认识下他们怎么结合的。正则表达式是一个模版,这个模版是由一些普通字符和一些元字符组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义。

下面说一些常用的:

^    匹配行首 表示以某个字符开头
$    匹配行尾 表示以某个字符结尾
^$   空行的意思
.    匹配任意单个字符
*    字符* 匹配0或多个此字符
\    屏蔽一个元字符的特殊含义
[]   匹配中括号内的字符 表示过滤括号内的字符
.*   代表任意多个字符
lele\{n\}    用来匹配前面lele出现次数。n为次数  统计前面lele出现的次数
lele\{n,\}    含义同上,但次数最少为n
lele\{n,m\}   义同上,但lele出现次数在n与m之间

二、grep使用案例

1、查找文件内容包含root的行数
cat access.log | grep root -n

2、查找文件内容不包含root的行
 cat access.log | grep root -nv  # v是 reverse 颠倒的意思

3、查找以s开头的行
 cat access.log | grep ^s

4、查找以n结尾的行
cat access.log | grep n$

5,查找以n结尾的行的行数
cat access.log | grep n$ -c  
这是返回的一个统计数字

三、sed使用案例

1、打印出文件第二行
 cat test.txt | sed -n 2p

2、打印出2-5行的内容
cat test.txt | sed -n 2,5p

3、将文件中的root全部替换为abc
sed -i s/root/adb/g test.txt
-i 直接修改读取的文件内容,而不是输出到终端。  如果不加,就会把替换的内容,输出出来,
s :取代,可以直接进行取代的工作。
g: 是全局的意思。其中#是格式符,他也可以是@或者别的/。
Sed替换格式是:sed -i ‘s/要替换的内容/替换成的内容/g' 文件名。

sed是一种流编辑器,它一次处理一行内容。

处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。

然后读入下行,执行下一个循环。如果没有使诸如‘D’ 的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。

这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

四、awk使用案例

1、打印文件第一列:
 awk -F : '{print $1}' access.log
 awk -F : '{print $1}' access.log
这里的分隔符是冒号 ,然后print打印第一列

3,这是打印netstat的命令结果的第六行,并且去重展示,
netstat -atp |awk '{print $6}' | uniq

4,这是打印netstat的命令结果的第六行,并且去重展示,而且统计每一项的数量,相当于是分组统计,
netstat -atp |awk '{print $6}' | uniq -c

5,这是打印netstat的命令结果的第六行,并且去重展示,而且统计每一项的数量,相当于是分组统计,,统计完了,还可以排序
netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn

6,这是打印netstat的命令结果的第六行,并且去重展示,而且统计每一项的数量,相当于是分组统计,,统计完了,还可以排序,还可以只要前两个,
netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn| head -2

实战:Linux通过日志文件统计IP访问次数排序,取前n条

日志内容如下:

1.119.144.106 - - [03/Jan/2019:12:47:50 +0800] image.aa.com "GET /image/public/index.php/index/uploads/handle HTTP/1.1 0.001" 500 5 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36" -
1.119.144.106 - - [03/Jan/2019:12:47:50 +0800] image.aa.com "GET /image/public/index.php/index/uploads/handle HTTP/1.1 0.001" 500 5 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36" -
1.119.144.106 - - [03/Jan/2019:12:47:51 +0800] image.aa.com "GET /image/public/index.php/index/uploads/handle HTTP/1.1 0.001" 500 5 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36" -
1.119.144.106 - - [03/Jan/2019:12:47:51 +0800] image.aa.com "GET /image/public/index.php/index/uploads/handle HTTP/1.1 0.000" 500 5 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36" -
1.119.144.106 - - [03/Jan/2019:12:47:51 +0800] image.aa.com "GET /image/public/index.php/index/uploads/handle HTTP/1.1 0.001" 500 5 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36" -
1.119.144.106 - - [03/Jan/2019:12:47:51 +0800] image.aa.com "GET /image/public/index.php/index/uploads/handle HTTP/1.1 0.000" 500 5 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36" -
1.119.144.106 - - [03/Jan/2019:12:47:52 +0800] image.aa.com "GET /image/public/index.php/index/uploads/handle HTTP/1.1 0.001" 500 5 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36" -
1.119.144.106 - - [03/Jan/2019:12:47:53 +0800] image.aa.com "GET /image/public/index.php/index/uploads/handle HTTP/1.1 0.001" 500 5 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36" -
1.119.144.106 - - [03/Jan/2019:12:47:53 +0800] image.aa.com "GET /image/public/index.php/index/uploads/handle HTTP/1.1 0.000" 500 5 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36" -
123.125.71.82 - - [03/Jan/2019:12:47:57 +0800] image.aa.com "GET /Uploads/150827/55dee28ce9dbf.jpg HTTP/1.1 0.211" 200 509831 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)" -
220.181.108.169 - - [03/Jan/2019:12:48:03 +0800] image.aa.com "GET /Uploads/160622/576a046300906.jpg HTTP/1.1 1.567" 200 49965 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)" -
115.239.212.137 - - [03/Jan/2019:12:48:15 +0800] image.aa.com "GET /image/public/uploads/170109/587398dc20d79.JPG HTTP/1.1 0.362" 200 985944 "-" "Mozilla/5.0 (Windows NT 5.1; rv:8.0.1) Gecko/20100101 Firefox/8.0.1" -
123.125.71.114 - - [03/Jan/2019:12:48:31 +0800] image.aa.com "GET /Uploads/170505/590c2d515b50a.jpg HTTP/1.1 1.406" 200 25317 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)" -
220.243.135.80 - - [03/Jan/2019:12:48:38 +0800] image.aa.com "GET /image/public/uploads/171129/5a1ec9255a89e.jpg HTTP/1.1 0.108" 200 39174 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36" -
220.243.135.143 - - [03/Jan/2019:12:48:38 +0800] image.aa.com "GET /Uploads/170804/5984129b7b4fb.jpg HTTP/1.1 0.172" 200 33351 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36" -
220.243.135.140 - - [03/Jan/2019:12:48:49 +0800] image.aa.com "GET /Uploads/161222/585b9f24c4a99.JPG HTTP/1.1 0.223" 200 381442 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36" -
112.80.254.51 - - [03/Jan/2019:12:48:52 +0800] image.aa.com "GET /Uploads/170806/5985f7ac2fb94.jpg HTTP/1.1 0.179" 200 72244 "-" "Mozilla/5.0 (Windows NT 5.1; rv:8.0.1) Gecko/20100101 Firefox/8.0.1" -
123.125.71.109 - - [03/Jan/2019:12:48:57 +0800] image.aa.com "GET /Uploads/170516/591ac3201f954.jpg HTTP/1.1 3.026" 200 76574 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)" -
220.243.136.128 - - [03/Jan/2019:12:49:24 +0800] image.aa.com "GET /image/public/uploads/170330/58dc7a95a5a70.jpg HTTP/1.1 0.065" 200 59287 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36" -
220.243.135.128 - - [03/Jan/2019:12:49:24 +0800] image.aa.com "GET /image/public/uploads/170321/58d0c185e5668.jpg HTTP/1.1 0.073" 200 102566 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36" -

第一列是IP地址,现在我想根据IP统计它的数量,就可以写一个shell命令如下:

cat logs/xxx.log | awk '{print $(1)}' | sort | uniq -c | sort -k 1 -n -r|head -10

解释一下上面的命令,

  • cat logs/xxx.log就是输出要统计的日志。

  • awk后面跟一个指令,awk '{print $(1)}'就是打印出日志内容的第几列。$1就是第一列
    扩展:$(NF)是总列数,那么如果根据倒数第二列统计,就是$(NF-1)。

  • sort就是对内容进行排序,默认是自然顺序排序。

  • uniq指令用于排重,而是只适用于相邻两行相同的情况。所以一般结合sort使用。即先sort排序再排重。
    uniq -u是只显示唯一的记录行。uniq -c是显示有重复记录的情况。

  • sort -k 1 -n -r这个指令,参看下面sort指令参数的详细说明

sort选项与参数:

-f :忽略大小写的差异,例如 A 与 a 视为编码相同;
-b :忽略最前面的空格符部分;
-M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;
-n :使用『纯数字』进行排序(默认是以文字型态来排序的);
-r :反向排序;
-u :就是 uniq ,相同的数据中,仅出现一行代表;
-t :分隔符,默认是用 [tab] 键来分隔;
-k :以哪个区间 (field) 来进行排序的意思

所以 sort -k 1 -n -r 指令的意思就是对第一列按照纯数字逆序排序。

这个纯数字是哪里来的呢?是uniq -c来的,原来剩下一列就是IP了,当执行uniq -c指令时,它会统计重复记录的次数并把这次数显示在第一列。所以现在有两列了,第一列是重复次数,第二列是IP。所以这里是按照重复次数排序。

  • head -10这个不用说了吧,显示前10行。

posted @ 2021-12-02 07:50  技术改变命运Andy  阅读(216)  评论(0编辑  收藏  举报