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 的行

上述案例也可以使用egrepegrep使用方法和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进行筛选

cutawk命令类似的作用,也就是说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' : 排除没用的信息andAddress
  • cut -d ":" -f 1 : 再次使用cut使用:进行分割,获取第一列的信息
  • sort : 进行排序
  • uniq : 去除重复的行
posted @ 2023-05-15 09:44  Junglezt  阅读(886)  评论(0编辑  收藏  举报