Linux Shell IP地址使用Sort排序统计

在Linux中,sort主要用来对文本文件所有行进行排序,非常简单实用。首先来看下sort的用法:

概要

sort

sort [OPTION]... [FILE]...
sort [OPTION]... --files0-from=F

对文本文件的行进行排序。
将所有输入文件的内容排序后并输出。
当没有文件或文件为-时,读取标准输入。
更多信息:https://www.gnu.org/software/coreutils/sort.

选项

排序选项:

-b, --ignore-leading-blanks    忽略开头的空白。
-d, --dictionary-order         仅考虑空白、字母、数字。
-f, --ignore-case              将小写字母作为大写字母考虑。
-g, --general-numeric-sort     根据数字排序。
-i, --ignore-nonprinting       排除不可打印字符。
-M, --month-sort               按照非月份、一月、十二月的顺序排序。
-h, --human-numeric-sort       根据存储容量排序(注意使用大写字母,例如:2K 1G)。
-n, --numeric-sort             根据数字排序。
-R, --random-sort              随机排序,但分组相同的行。
--random-source=FILE           从FILE中获取随机长度的字节。
-r, --reverse                  将结果倒序排列。
--sort=WORD                    根据WORD排序,其中: general-numeric 等价于 -g,human-numeric 等价于 -h,month 等价于 -M,numeric 等价于 -n,random 等价于 -R,version 等价于 -V。
-V, --version-sort             文本中(版本)数字的自然排序。

其他选项:

--batch-size=NMERGE                    一次合并最多NMERGE个输入;超过部分使用临时文件。
-c, --check, --check=diagnose-first    检查输入是否已排序,该操作不会执行排序。
-C, --check=quiet, --check=silent      类似于 -c 选项,但不输出第一个未排序的行。
--compress-program=PROG                使用PROG压缩临时文件;使用PROG -d解压缩。
--debug                                注释用于排序的行,发送可疑用法的警报到stderr。
--files0-from=F                        从文件F中读取以NUL结尾的所有文件名称;如果F是 - ,那么从标准输入中读取名字。
-k, --key=KEYDEF                       通过一个key排序;KEYDEF给出位置和类型。
-m, --merge                            合并已排序文件,之后不再排序。
-o, --output=FILE                      将结果写入FILE而不是标准输出。
-s, --stable                           通过禁用最后的比较来稳定排序。
-S, --buffer-size=SIZE                 使用SIZE作为内存缓存大小。
-t, --field-separator=SEP              使用SEP作为列的分隔符。
-T, --temporary-directory=DIR          使用DIR作为临时目录,而不是 $TMPDIR 或 /tmp;多次使用该选项指定多个临时目录。
--parallel=N                           将并发运行的排序数更改为N。
-u, --unique                           同时使用-c,严格检查排序;不同时使用-c,输出排序后去重的结果。
-z, --zero-terminated                  设置行终止符为NUL(空),而不是换行符。
--help                                 显示帮助信息并退出。
--version                              显示版本信息并退出。


KEYDEF的格式为:F[.C][OPTS][,F[.C][OPTS]] ,表示开始到结束的位置。
F表示列的编号
C表示
OPTS为[bdfgiMhnRrV]中的一到多个字符,用于覆盖当前排序选项。
使用--debug选项可诊断出错误的用法。


SIZE 可以有以下的乘法后缀:
% 内存的1%;
b 1;
K 1024(默认);
剩余的 M, G, T, P, E, Z, Y 可以类推出来。

在Linux中,使用sort命令按IP地址大小排序需要一些技巧,因为sort命令默认按字典顺序排序,而不是数值顺序。 IP地址由四个八位字节组成,需要将它们视为数值进行比较。

以下是一些常用方法,可以根据具体需求选择:

方法一:使用sort -V (推荐)

对于大多数情况,sort -V 命令是最简单和最有效的方法。 -V 选项启用"版本排序",它能够正确地处理包含数字的字符串,例如IP地址。

sort -V ip_addresses.txt

# ip_addresses.txt 是包含IP地址的文件,每行一个IP地址。

方法二:使用sort命令结合-t-k选项 (适用于更复杂的排序)

如果需要更精细的控制,例如根据IP地址的特定部分排序,或者需要结合其他字段进行排序,可以使用-t-k选项。 -t指定字段分隔符(这里是.),-k指定排序的字段。 为了数值排序,需要添加n选项。

sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n ip_addresses.txt

这个命令将IP地址视为四个字段,并按每个字段的数值进行排序。 先按第一个字段排序,然后按第二个字段排序,以此类推。

方法三:使用awk (适用于更复杂的处理)

如果文件包含除了IP地址之外的其他字段,并且需要根据IP地址排序的同时保留其他字段,可以使用awk

假设文件格式如下:

hostname1 192.168.1.100 other_data
hostname2 10.0.0.1 other_data
hostname3 192.168.1.1 other_data

可以使用以下awk命令:

awk '{print $2, $0}' ip_addresses.txt | sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n | awk '{print $2}'

这个命令首先使用awk将IP地址移动到每一行的开头,然后使用sort命令按IP地址排序,最后再使用awk恢复原始格式。

对于简单的IP地址排序,sort -V 是最方便快捷的方法。

于更复杂的排序需求,或者需要处理包含其他字段的文件,sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n 或 awk 方法更灵活。

如果IP地址包含在更复杂的文本中,可能需要使用更复杂的正则表达式或其他文本处理工具来提取IP地址,然后再进行排序。


使用 sort 对IP地址排序后,想找出重复的IP该怎么做?其实我们有多种方法可以找出重复的IP地址,取决于IP地址数据是如何存储的。以下是一些常用方法,按需选择使用:

方法一:使用sortuniq (适用于简单的IP地址列表)

如果IP地址在一个简单的文本文件中,每行一个IP地址,可以使用sortuniq命令:

  1. 排序: sort命令将IP地址按字典顺序排序。

  2. 查找重复项: uniq -d 命令只输出重复的行。

sort ip_addresses.txt | uniq -d

方法二:使用awk (适用于更复杂的文本格式)

如果IP地址包含在更复杂的文本文件中,例如每行包含主机名和IP地址,可以使用awk命令:

假设文件格式如下:

hostname1 192.168.1.100
hostname2 10.0.0.1
hostname3 192.168.1.100
hostname4 10.0.0.1

可以使用以下awk命令:

awk '{count[$2]++} END {for (ip in count) if (count[ip] > 1) print ip}' ip_addresses.txt

这个命令使用一个关联数组 count 来统计每个IP地址出现的次数。 END 块遍历数组,如果某个IP地址出现的次数大于1,则输出该IP地址。

方法三:使用sortuniq -c 和 awk (显示重复次数)

结合uniq -c可以显示每个IP地址重复的次数:

sort ip_addresses.txt | uniq -c | awk '$1 > 1 {print $2}'

uniq -c 在每一行前面添加计数,awk '$1 > 1 {print $2}' 过滤掉只出现一次的IP。

方法四:使用Python脚本 (适用于更复杂的处理和数据分析)

对于更复杂的场景,或者需要进行更深入的数据分析,可以使用Python脚本。 以下是一个简单的Python脚本示例:

from collections import Counter

ip_addresses = []
with open("ip_addresses.txt", "r") as f:
    for line in f:
        ip_addresses.append(line.strip())

ip_counts = Counter(ip_addresses)
for ip, count in ip_counts.items():
    if count > 1:
        print(ip)

这个Python脚本使用 collections.Counter 对象来高效地统计IP地址的出现次数。更复杂的需求可能需要使用正则表达式或其它工具类来处理,简单的Shell命令就够用了。


参考:

anzhihe 安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/6218.html | ☆★★每天进步一点点,加油!★★☆ | 

您可能还感兴趣的文章!

发表评论

电子邮件地址不会被公开。 必填项已用*标注