Linux shell工具grep awk cut sort uniq sort 使用小结
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
这就得到我们要的结果。
这个结果中,我们可以看出各个服务器在数据库服务器上的网络连接数。
根据连接数,发现特别大的,肯定有问题。通常都应用服务端打开连接不关闭,或者出现异常无法关闭。
<< shell字符串操作方法,以及实例
js正则标志/g /i /m的用法,以及实例 >>
linux cut命令参数说明,以及实例
cut主要是用来分割文件中的字符串,并且根据要求进行显示的一个命令。虽然他的用法基本上都可以用其他的linux命令所代替,但是用cut会更方便一点。
一,cut参数说明
[zhangy@BlackGhost comte]$ cut --help
用法:cut [选项]... [文件]...
从每个文件中输出指定部分到标准输出。
长选项必须使用的参数对于短选项时也是必需使用的。
-b, --bytes=列表
-c, --characters=列表
-d, --delimiter=分界符
-f, --fields=列表
-n (忽略)
--complement
-s, --only-delimited
--output-delimiter=字符串
--help
--version
仅使用f -b, -c 或-f 中的一个。每一个列表都是专门为一个类别作出的,或者您可以用逗号隔
开要同时显示的不同类别。您的输入顺序将作为读取顺序,每个仅能输入一次。
每种参数格式表示范围如下:
N 从第1 个开始数的第N 个字节、字符或域
N- 从第N 个开始到所在行结束的所有字符、字节或域
N-M 从第N 个开始到第M 个之间(包括第M 个)的所有字符、字节或域
-M 从第1 个开始到第M 个之间(包括第M 个)的所有字符、字节或域
当没有文件参数,或者文件不存在时,从标准输入读取
[zhangy@BlackGhost comte]$ cut --help
用法:cut [选项]... [文件]...
从每个文件中输出指定部分到标准输出。
长选项必须使用的参数对于短选项时也是必需使用的。
-b, --bytes=列表 //只选中指定的这些字节
-c, --characters=列表 // 只选中指定的这些字符
-d, --delimiter=分界符 // 使用指定分界符代替制表符作为区域分界
-f, --fields=列表 //只选中指定的这些域;并打印所有不包含分界符的 行,除非-s 选项被指定
-n (忽略)
--complement //补全选中的字节、字符或域
-s, --only-delimited //不打印没有包含分界符的行
--output-delimiter=字符串 //使用指定的字符串作为输出分界符,默认采用输入 的分界符
--help //显示此帮助信息并退出
--version //显示版本信息并退出
仅使用f -b, -c 或-f 中的一个。每一个列表都是专门为一个类别作出的,或者您可以用逗号隔
开要同时显示的不同类别。您的输入顺序将作为读取顺序,每个仅能输入一次。
每种参数格式表示范围如下:
N 从第1 个开始数的第N 个字节、字符或域
N- 从第N 个开始到所在行结束的所有字符、字节或域
N-M 从第N 个开始到第M 个之间(包括第M 个)的所有字符、字节或域
-M 从第1 个开始到第M 个之间(包括第M 个)的所有字符、字节或域
当没有文件参数,或者文件不存在时,从标准输入读取
二,实例
1,测试文件
[zhangy@BlackGhost comte]$ cat test
test:x:1003:1003::/home/test:/bin/bash
张ying:x:1004:1004::/home/test:/bin/bash
policykit:x:102:1005:PolicyKit:/:/sbin/nologin
postfix:x:73:73::/var/spool/postfix:/bin/false
[zhangy@BlackGhost comte]$ cat test
test:x:1003:1003::/home/test:/bin/bash
张ying:x:1004:1004::/home/test:/bin/bash
policykit:x:102:1005:PolicyKit:/:/sbin/nologin
postfix:x:73:73::/var/spool/postfix:/bin/false
上面是/etc/passwd文件中的一部分,加了点中文在里面
2,-b和-c的用法
[zhangy@BlackGhost comte]$ cut -b 1-10 test
test:x:100
张ying:x:
policykit:
postfix:x:
[zhangy@BlackGhost comte]$ cut -b 1,4,5,7,10 test
tt::0
�yig:
pick:
ptfx:
[zhangy@BlackGhost comte]$ cut -b 1-10 test //取得文件中第1个字节到第10个字节的内容
test:x:100
张ying:x:
policykit:
postfix:x:
[zhangy@BlackGhost comte]$ cut -b 1,4,5,7,10 test //取文件中第1,4,5,7,10字节的内容
tt::0
�yig: //为什么会出现乱码吗,因为汉字所占字节数大于1,分开的话,肯定会显示错误的
pick:
ptfx:
-c的用法根-b差不多,只不过一个截取时是字节为单位,一个是以字符为单位
3,-d和-f的用法
[zhangy@BlackGhost comte]$ cut -f 1 test
test:x:1003:1003::/home/test:/bin/bash
张ying:x:1004:1004::/home/test:/bin/bash
policykit:x:102:1005:PolicyKit:/:/sbin/nologin
postfix:x:73:73::/var/spool/postfix:/bin/false
[zhangy@BlackGhost comte]$ cut -d : -f1 test
test
张ying
policykit
postfix
[zhangy@BlackGhost comte]$ cut -f 1 test //不分割都显示出来
test:x:1003:1003::/home/test:/bin/bash
张ying:x:1004:1004::/home/test:/bin/bash
policykit:x:102:1005:PolicyKit:/:/sbin/nologin
postfix:x:73:73::/var/spool/postfix:/bin/false
[zhangy@BlackGhost comte]$ cut -d : -f1 test //分割了显示分割后的第一个域
test
张ying
policykit
postfix
-d后面根的冒号是分割文件行的的分割符,-d一般情况下根-f一起使用,而不能和-b,-c一起使用
4,-s的用法
[zhangy@BlackGhost comte]$ cut -d : -f 1-5 -s --output-delimiter="|" test
test|x|1003|1003|
张ying|x|1004|1004|
policykit|x|102|1005|PolicyKit
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行