Linux shell工具grep awk cut sort uniq sort 使用小结

    博客分类:
  • Linux

linux

Linux 系统中,有很多用于快速处理数据的工具如grep awk cut sort uniq sort,他们非常非常地好用。 如果你熟练掌握他们的使用技巧,他们则可以帮你快速定位问题。

最近碰到一个案例。 一个项目上数据库系统, ORACLE ,运行在 LINUX 上,报进程数满了。 看到这类问题,您不需要去深究什么警告日志,数据库中进程状况啊等等。马上 在操作系统层面上看看有哪些服务器连接到这台数据库服务器上。

(墙内链接: http://mikixiyou.iteye.com/blog/1538828)

这里使用的第一个工具就netstat 。他是系统管理工具,还不能算shell 工具。


通过netstat -ntu ,找出通过tcp 和udp 连接服务器的IP 地址列表。

[root@webdb4 ~]# netstat -ntu|more      

Active Internet connections (w/o servers)

Proto Recv-Q Send-Q Local Address               Foreign Address             State      

tcp        0      0 192.168.15.209:1521         192.168.15.65:37781         ESTABLISHED

tcp        0      0 192.168.15.209:1521         192.168.15.65:37783         ESTABLISHED

tcp        0      0 192.168.15.209:1521         192.168.15.65:37777         ESTABLISHED

tcp        0      0 192.168.15.209:1521         192.168.15.65:37779         ESTABLISHED

tcp        0      0 10.100.15.209:49895         10.100.15.207:26069         ESTABLISHED

tcp        0      0 10.100.15.209:49898         10.100.15.213:6092          ESTABLISHED

tcp        0      0 192.168.15.209:1521         192.168.15.65:37785         ESTABLISHED

tcp        0      0 192.168.15.209:1521         192.168.15.181:21869        ESTABLISHED

tcp        0      0 192.168.15.209:1521         192.168.15.181:21870        ESTABLISHED

tcp        1      0 192.168.15.209:26781        192.168.15.89:1521          CLOSE_WAIT  

tcp        0      0 192.168.15.209:10332        192.168.15.211:6200         ESTABLISHED

tcp        0      0 192.168.15.209:1521         192.168.15.181:21875        ESTABLISHED

tcp        0      0 192.168.15.209:1521         192.168.15.65:37766         ESTABLISHED

tcp        0      0 192.168.15.209:1521         192.168.15.181:21874        ESTABLISHED

tcp        0      0 192.168.15.209:1521         192.168.15.65:37761         ESTABLISHED


下面略掉,太多了,没法显示全。


这是所有与数据库服务器连接的外部IP 信息列表。


可以看到第五列是所有的外部IP 信息。根据这些信息,找出数目那个IP 是什么?或者根据IP 数目做一个排序。

第一步,使用grep 将tcp 过滤出来,也可以使用egrep 过滤多个条件

netstat -ntu|grep 'tcp'

netstat -ntu|egrep 'tcp|udp'


第二步,使用awk 将第五列单独截出来

netstat -ntu|grep 'tcp'|awk '{print $5}'

操作如下:

[root@webdb4 ~]# netstat -ntu|grep 'tcp'|awk '{print $5}'|more

192.168.15.65:37781

192.168.15.61:34281

192.168.15.65:37783

192.168.15.61:34282

192.168.15.65:37777

192.168.15.65:37779

10.100.15.207:26069

192.168.15.61:34275

10.100.15.213:6092


第三步,使用cut 将列信息以":" 为分隔符再分成不同的列, 显示第一个field

netstat -ntu|grep 'tcp'|awk '{print $5}'|cut -d: -f1


第四步,使用sort 默认字符顺序将字段值排序

netstat -ntu|grep 'tcp'|awk '{print $5}'|cut -d: -f1|sort

sort 有很多选项,可以man sort 去看。


第五步,使用uniq 将已经排序好的字段计算不同值的数目

netstat -ntu|grep 'tcp'|awk '{print $5}'|cut -d: -f1|sort|uniq -c

uniq -c 根据相近的值计算和,因此之前需要排序好。


第六步,使用sort -n 数字升序方式再排一下结果

netstat -ntu|grep 'tcp'|awk '{print $5}'|cut -d: -f1|sort|uniq -c|sort -n

使用sort -nr ,可以按照数字降序排。

netstat -ntu|grep 'tcp'|awk '{print $5}'|cut -d: -f1|sort|uniq -c|sort -nr


第七步,使用head 或tail 取头部几行或尾部几行

取尾部10 行

netstat -ntu|grep 'tcp'|awk '{print $5}'|cut -d: -f1|sort|uniq -c|sort -n|tail -10


取头部10 行

netstat -ntu|grep 'tcp'|awk '{print $5}'|cut -d: -f1|sort|uniq -c|sort -nr|head -10


[root@webdb4 ~]# netstat -ntu|grep 'tcp'|awk '{print $5}'|cut -d: -f1|sort|uniq -c|sort -n|tail -10

     8 192.168.15.133

     8 192.168.15.62

    10 192.168.15.181

    11 192.168.15.61

    12 192.168.15.204

    15 192.168.15.63

    17 192.168.15.100

    18 192.168.15.92

    30 192.168.15.65

    32 192.168.15.146


[root@webdb4 ~]# netstat -ntu|grep 'tcp'|awk '{print $5}'|cut -d: -f1|sort|uniq -c|sort -nr|head -10

    32 192.168.15.146

    30 192.168.15.65

    18 192.168.15.92

    17 192.168.15.100

    15 192.168.15.63

    12 192.168.15.204

    11 192.168.15.61

    10 192.168.15.181

     8 192.168.15.62

     8 192.168.15.133  


这就得到我们要的结果。

这个结果中,我们可以看出各个服务器在数据库服务器上的网络连接数。

根据连接数,发现特别大的,肯定有问题。通常都应用服务端打开连接不关闭,或者出现异常无法关闭。


linux cut命令参数说明,以及实例

张映 发表于 2010-10-30

分类目录: linux

cut主要是用来分割文件中的字符串,并且根据要求进行显示的一个命令。虽然他的用法基本上都可以用其他的linux命令所代替,但是用cut会更方便一点。

一,cut参数说明

查看 复制 打印 ?
  1. [zhangy@BlackGhost comte]$ cut --help  

  2. 用法:cut [选项]... [文件]...  

  3. 从每个文件中输出指定部分到标准输出。  


  4. 长选项必须使用的参数对于短选项时也是必需使用的。  

  5. -b, --bytes=列表        //只选中指定的这些字节

  6. -c, --characters=列表       // 只选中指定的这些字符

  7. -d, --delimiter=分界符   // 使用指定分界符代替制表符作为区域分界

  8. -f, --fields=列表        //只选中指定的这些域;并打印所有不包含分界符的 行,除非-s 选项被指定

  9. -n                (忽略)  

  10. --complement       //补全选中的字节、字符或域

  11. -s, --only-delimited        //不打印没有包含分界符的行

  12. --output-delimiter=字符串    //使用指定的字符串作为输出分界符,默认采用输入 的分界符

  13. --help        //显示此帮助信息并退出

  14. --version        //显示版本信息并退出


  15. 仅使用f -b, -c 或-f 中的一个。每一个列表都是专门为一个类别作出的,或者您可以用逗号隔  

  16. 开要同时显示的不同类别。您的输入顺序将作为读取顺序,每个仅能输入一次。  

  17. 每种参数格式表示范围如下:  

  18. N    从第1 个开始数的第N 个字节、字符或域  

  19. N-    从第N 个开始到所在行结束的所有字符、字节或域  

  20. N-M    从第N 个开始到第M 个之间(包括第M 个)的所有字符、字节或域  

  21. -M    从第1 个开始到第M 个之间(包括第M 个)的所有字符、字节或域  


  22. 当没有文件参数,或者文件不存在时,从标准输入读取  

二,实例

1,测试文件

查看 复制 打印 ?
  1. [zhangy@BlackGhost comte]$ cat test  

  2. test:x:1003:1003::/home/test:/bin/bash  

  3. 张ying:x:1004:1004::/home/test:/bin/bash  

  4. policykit:x:102:1005:PolicyKit:/:/sbin/nologin  

  5. postfix:x:73:73::/var/spool/postfix:/bin/false  

上面是/etc/passwd文件中的一部分,加了点中文在里面

2,-b和-c的用法

查看 复制 打印 ?
  1. [zhangy@BlackGhost comte]$ cut -b 1-10 test     //取得文件中第1个字节到第10个字节的内容

  2. test:x:100  

  3. 张ying:x:  

  4. policykit:  

  5. postfix:x:  

  6. [zhangy@BlackGhost comte]$ cut -b 1,4,5,7,10 test  //取文件中第1,4,5,7,10字节的内容

  7. tt::0  

  8. �yig:    //为什么会出现乱码吗,因为汉字所占字节数大于1,分开的话,肯定会显示错误的

  9. pick:  

  10. ptfx:  

-c的用法根-b差不多,只不过一个截取时是字节为单位,一个是以字符为单位

3,-d和-f的用法

查看 复制 打印 ?
  1. [zhangy@BlackGhost comte]$ cut -f 1 test     //不分割都显示出来

  2. test:x:1003:1003::/home/test:/bin/bash  

  3. 张ying:x:1004:1004::/home/test:/bin/bash  

  4. policykit:x:102:1005:PolicyKit:/:/sbin/nologin  

  5. postfix:x:73:73::/var/spool/postfix:/bin/false  

  6. [zhangy@BlackGhost comte]$ cut -d : -f1  test  //分割了显示分割后的第一个域

  7. test  

  8. 张ying  

  9. policykit  

  10. postfix  

-d后面根的冒号是分割文件行的的分割符,-d一般情况下根-f一起使用,而不能和-b,-c一起使用

4,-s的用法

查看 复制 打印 ?
  1. [zhangy@BlackGhost comte]$ cut -d : -f 1-5 -s --output-delimiter="|" test  

  2. test|x|1003|1003|  

  3. 张ying|x|1004|1004|  

  4. policykit|x|102|1005|PolicyKit  

  5. postfix|x|73|73|  

1. 如果你只想看文件的前5行,可以使用head命令,如:

  head -5 /etc/passwd

  2. 如果你想查看文件的后10行,可以使用tail命令,如:

  tail -10 /etc/passwd

  tail -f /var/log/messages

  参数-f使tail不停地去读最新的内容,这样有实时监视的效果,当你在ppp拨号的过程中用它岂不是很方便!

  3. 查看文件中间一段,你可以使用sed命令,如:

  sed -n '5,10p' /etc/passwd

  这样你就可以只查看文件的第5行到第10行