Linux中对输出结果进行筛选,排序,统计
之前在处理Linux
标准输出返回结果的时候,有很多凌乱的返回结果,看着很不顺眼,这次学习并总结一些相关的操作
使用grep进行筛选
在查看一些比较大的文件或者执行命令返回结果较长的时候,可以使用grep
筛选出需要行的信息,grep
命令常用的参数如下:
参数 | 作用 |
---|---|
-i |
忽略大小写 |
-n |
显示匹配结果的行号 |
-r |
在目录及子目录下递归查找 |
-c |
显示匹配结果的数量 |
-v |
反转匹配,只显示不包含指定字符串的行 |
这里介绍几个特殊的用法
递归匹配指定目录下所有文件的字符串
grep -r 'test' ./
# 匹配当前目录下所有文件中含有test的行
反转匹配,排除不想要的内容
netstat -anptu | grep -v "0.0.0.0\|127.0.0.1"
# 将netstat返回的结果,排除带有 0.0.0.0 和 127.0.0.1 的行
上述案例也可以使用egrep
,egrep
使用方法和grep
类似,上述grep
使用-v
参数筛选时需要在每个值之间的|
加上转译符号\
,而egrep
不需要。使用egrep
实现上述的案例
netstat -anptu | egrep -v "0.0.0.0|127.0.0.1"
使用awk进行筛选
awk
命令可以将返回的结果使用列的方式进行统计,默认分割的方式是空格、制表符
。常见的参数如下:
参数 | 作用 |
---|---|
-F |
指定分割的字符,默认是空格 |
{pirnt $数字} |
{} 中print $数字 是固定格式,其中$ 后面的数字代表使用-F 分割后需要显示的列 |
案例:获取/etc/passwd中的用户名
cat /etc/passwd | awk -F ':' '{print $1}'
使用cut进行筛选
cut
和awk
命令类似的作用,也就是说awk
可以做到的效果,cut
命令也可以。常见的参数如下:
参数 | 作用 |
---|---|
-d |
指定分割列的方式 |
-f 数字 |
指定现实的列数 |
同样获取/etc/passwd中的用户名
cat /etc/passwd | cut -d ":" -f 1
使用sort进行筛选
sort
命令用户排序,常见的参数如下:
参数 | 作用 |
---|---|
-r |
倒序排序 |
-u |
去除重复 |
-n |
数值大小排序 |
直接进行排序即可
sort 文件名
# 或者将结果交给sort处理
cat /etc/passwd | sort
使用uniq进行筛选
uniq
命令用于过滤和统计文本文件中相同的行。常用的参数如下:
参数 | 作用 |
---|---|
-c |
显示该行在文件中出现的次数 |
-d |
只显示重复的行 |
-u |
只显示不重复的行 |
混合使用案例
例如我们使用netstat -anput
命令进行筛选时,我只想知道当前主机与那些机器建立了连接,可以使用下面的命令
sudo netstat -anptu | egrep -v "127.0.0.1|:::|0.0.0.0" | awk '{print $5}' | egrep -v 'and|Address' | cut -d ":" -f 1 | sort | uniq
解释:
netstat -anptu
:获取本机所有TCP和UDP的端口连接状态egrep -v "127.0.0.1|:::|0.0.0.1"
: 排除含有127.0.0.1|:::|0.0.0.0
的行awk '{print $5}'
: 使用默认空格
进行分割,获取第五列的信息egrep -v 'and|Address'
: 排除没用的信息and
和Address
cut -d ":" -f 1
: 再次使用cut
使用:
进行分割,获取第一列的信息sort
: 进行排序uniq
: 去除重复的行