Linux基本功系列之sort命令实战

news2024/11/25 22:31:46

在这里插入图片描述

文章目录

  • 前言
  • 一. sort命令介绍
  • 二. 语法格式及常用选项
  • 三. 参考案例
    • 3.1 按照文本默认排序
    • 3.2 忽略相同的行
    • 3.3 按数字大小进行排序
    • 3.4 检查文件是否已经按照顺序排序
    • 3.5 将第3列按照数字大小进行排序
    • 3.6 将排序结果输出到文件
  • 四. 探讨 -k的高级用法
  • 总结

前言

大家好,又见面了,我是沐风晓月,本文是专栏【linux基本功-基础命令实战】的第43篇文章。

专栏地址:[linux基本功-基础命令专栏] , 此专栏是沐风晓月对Linux常用命令的汇总,希望能够加深自己的印象,以及帮助到其他的小伙伴😉😉。

如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。

🏠个人主页:我是沐风晓月
🧑个人简介:大家好,我是沐风晓月,双一流院校计算机专业😉😉
💕 座右铭: 先努力成长自己,再帮助更多的人 ,一起加油进步🍺🍺🍺
💕欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信😘

一. sort命令介绍

sort命令是一个排序命令,可以对文件进行排序,然后将排序结果标准输出。

sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。

二. 语法格式及常用选项

依据惯例,我们还是先查看帮助,使用 sort --help

[root@mufenggrow ~]# sort --help
用法:sort [选项]... [文件]...
 或:sort [选项]... --files0-from=F
Write sorted concatenation of all FILE(s) to standard output.

Mandatory arguments to long options are mandatory for short options too.
排序选项:

  -b, --ignore-leading-blanks	忽略前导的空白区域
  -d, --dictionary-order	    只考虑空白区域和字母字符
  -f, --ignore-case		       忽略字母大小写
  -g, --general-numeric-sort  compare according to general numerical value
  -i, --ignore-nonprinting    consider only printable characters
  -M, --month-sort            compare (unknown) < 'JAN' < ... < 'DEC'
  -h, --human-numeric-sort    使用易读性数字(例如: 2K 1G)
  -n, --numeric-sort		  根据字符串数值比较
  -R, --random-sort		     根据随机hash 排序
      --random-source=文件	从指定文件中获得随机字节
  -r, --reverse			    逆序输出排序结果
      --sort=WORD		    按照WORD 指定的格式排序:
					       一般数字-g,高可读性-h,月份-M,数字-n,
					        随机-R,版本-V
  -V, --version-sort		在文本内进行自然版本排序

其他选项:

   --batch-size=NMERGE	             一次最多合并NMERGE 个输入;如果输入更多则使用临时文件
  -c, --check, --check=diagnose-first	检查输入是否已排序,若已有序则不进行操作
  -C, --check=quiet, --check=silent	   类似-c,但不报告第一个无序行
      --compress-program=程序	      使用指定程序压缩临时文件;使用该程序的-d 参数解压缩文件
      --debug			             为用于排序的行添加注释,并将有可能有问题的用法输出到标准错误输出
      --files0-from=文件       	从指定文件读取以NUL 终止的名称,如果该文件被
					            指定为"-"则从标准输入读文件名
  -k, --key=KEYDEF          sort via a key; KEYDEF gives location and type
  -m, --merge               merge already sorted files; do not sort
  -o, --output=文件		     将结果写入到文件而非标准输出
  -s, --stable		     	禁用last-resort 比较以稳定比较算法
  -S, --buffer-size=大小  	指定主内存缓存大小
  -t, --field-separator=分隔符	使用指定的分隔符代替非空格到空格的转换
  -T, --temporary-directory=目录	使用指定目录而非$TMPDIR 或/tmp 作为
					                         临时目录,可用多个选项指定多个目录
      --parallel=N		   将同时运行的排序数改变为N
  -u, --unique		       配合-c,严格校验排序;不配合-c,则只输出一次排序结果
  -z, --zero-terminated  	以0 字节而非新行作为行尾标志
      --help		      显示此帮助信息并退出
      --version		      显示版本信息并退出


为了更直观一些,我们把常用的参数用表格来展示:

参数描述
GNU 参数说明
-c检查文件是否按照顺序进行排序
-d排序时,处理英文字母,数字及空格字母外,忽略其他字符
-f排序,将小写字母视为大写字母
-M将前面的3个字母依照月份缩写进行排序
-r以相反的顺序进行排序
-n依照数值的大小进行排序-
-o排序后存入指定的文件
-t指定一个用来区分键位置字符
-k后面跟数字,指定按第几列进行排

有了具体的参数之后,我们再来看实战案例:

三. 参考案例

3.1 按照文本默认排序

此时,无需加任何参数,sort将文件/文本的每一行作为一个单位,相互比较.

比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。

[root@mufenggrow ~]# sort /etc/passwd |head -5
abrt:x:173:173::/etc/abrt:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
chrony:x:993:988::/var/lib/chrony:/sbin/nologin

从上面的代码可以看到: 按照首字符的ASCII码排序,

这里要理解什么是ASCII码:

在计算机中,所有的数据在存储和运算时都要使用二进制表示。而ASCII是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言,它是现今最通用的单字节编码系统。

英文字母对应的ACSII码如下:
在这里插入图片描述

3.2 忽略相同的行

-u参数主要用来忽略相同的行

## 可以看到有相同的行
[root@mufeng-06 ~]# cat a.txt
tiger
deer
lion
elphant
monkey
bear
dog
pig
pig
## 使用-u参数后
[root@mufeng06 ~]# sort -u a.txt    删除重复的行,但是空行不会被删除
 
bear
deer
dog
elphant
lion
monkey
pig
tiger

使用-u参数后,相同的行就没有了。

我们之前写过一个脚本统计在线的IP数有多少个,代码如下:

先写一个测试脚本:

[root@mufenggrow ~]# cat ping1.sh 
#!/bin/bash
str="192.168.1."
for num in {1..10}
do
ip=${str}${num}
ping -c1 -w1 $ip &>/dev/null

if [ $? -eq 0 ];then
echo $ip >>/root/online.txt

fi
done
# 统计在线IP的个数
online=`cat /root/online.txt|wc -l `
echo "在线ip总数为 $online"

执行上面的脚本查看效果:


[root@mufenggrow ~]# ./ping1.sh 
在线ip总数为 12

我们发现执行的结果为12个IP,这个结果是否准确? 我们查看文件内容:

[root@mufenggrow ~]# cat online.txt 
192.168.1.1
192.168.1.2
192.168.1.4
192.168.1.10
192.168.1.1
192.168.1.2
192.168.1.4
192.168.1.10
192.168.1.1
192.168.1.2
192.168.1.4
192.168.1.10

通过查看文件,我们发现文件的内容为中有很多重复的IP,这时候我们就可以使用sort -u 参数:

[root@mufenggrow ~]# sort -u online.txt |wc -l
4

使用这个命令之后,是不是就感觉IP少了很多,去掉了重复的,结果就对了。

3.3 按数字大小进行排序

此处使用-n 参数

当你使用sort命令对数字进行排序,但是又不用-n参数的时候,就会发现是乱序的:

[root@mufenggrow ~]# cat a.txt 
1
2
333
111
110
112
223
229
91
54
[root@mufenggrow ~]# sort a.txt 
1
110
111
112
2
223
229
333
54
91

是不是从排序里感觉112 反而不如2大了?

加上-n参数才是正常的,我们来看下代码:

[root@mufenggrow ~]# sort -n a.txt
1
2
54
91
110
111
112
223
229
333

如果向对数字进行倒序排列,需要加-r 参数, 当然这里要对数字排序,所以-n还是少不了的。

[root@mufenggrow ~]# sort -nr a.txt 
333
229
223
112
111
110
91
54
2
1

3.4 检查文件是否已经按照顺序排序

-c参数,可以检查文件是否按照顺序排序

[root@mufenggrow ~]# sort -c a.txt 
sort:a.txt:4:无序: 111

可以看到无序,表示没有按照顺序排序,这里需要主要,当我们对一个文件排序后,虽然会再屏幕上显示,但并不会修改源文件。

3.5 将第3列按照数字大小进行排序

这里用到以下几个参数:

-n是按照数字大小排序
-r是以相反顺序
-k是指定需要排序的栏位
-t指定栏位分隔符为冒号

我们对/etc/passwd 以冒号为分隔符,把第三列进行大小排序

[root@mufenggrow ~]# sort -t: -nk 3 /etc/passwd |head -5
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

如果我们要将上面的排序变成从大到小排列:

[root@mufenggrow ~]# sort -t: -nrk 3 /etc/passwd |head -5
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
laoxin:x:1000:1000:laoxin:/home/laoxin:/bin/bash
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
colord:x:998:997:User for colord:/var/lib/colord:/sbin/nologin
libstoragemgmt:x:997:995:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin

注意:

-t后面可以跟分隔符,如果分割符为: 比如容易操作,但如果分隔符为空格的时候,需要确认空格是否是规则的,比如有的是多个空格,有的是一个空格,就很难达到预期的效果

root@mufenggrow ~]# sort -t " " -k 3 b.txt 
9 9 1 0
1 2 3 4 
2 2 4 5 
5 6 7 8 
[root@mufenggrow ~]# cat c.txt 
1   2   33   44 
2 2 3 4
7     9   11 4

3 4  6 7

[root@mufenggrow ~]# sort -t " " -k 4 c.txt

1   2   33   44 
2 2 3 4
3 4  6 7
7     9   11 4

最后一个的排序按照第四列,就没成功,所以还是那句话,如果空格比较杂乱的时候,不建议使用空格进行排序,如果非要用空格,可以先做预处理。

3.6 将排序结果输出到文件

-o参数可以将结果输出到文件,比如我们把3.5的排序输出到a.txt中

root@mufenggrow ~]# sort -t: -nrk 3 /etc/passwd -o a.txt

四. 探讨 -k的高级用法

案例一: 使用-u 参数去重的时候,希望参照第一个域进行去重

我们知道-u参数是去重,但是必须两行完全重复才可以,而有时候我们根据一部分来去重。

如果我们只用-u去重:

[root@mufenggrow ~]# sort -u d.txt 
lisi: 34
mufeng: 100
mufeng:60
mufeng:99
wangwu: 66
zhangsan: 59
可以看到有三个mufeng

结合 -k试一下:

[root@mufenggrow ~]# sort -t: -u -k 1,1 d.txt 

lisi: 34
mufeng: 100
wangwu: 66
zhangsan: 59
[root@mufenggrow ~]# 

可以看到mufeng下面的两个mufeng被去掉了。

这里的 -k 1,1 我们写作 -k start,end , 如果start 第一个域的第一个字符~end 最后一个域的最后一个字符,如果完全相同,仅保留第一次出现的行,后面出现的相同行都会被消除。

总结

sort命令在日常工作中,应用的比较广泛,一定要认真学习,记熟记牢常用参数。

💕💕💕 好啦,这就是今天要分享给大家的全部内容了,我们下期再见!✨ ✨ ✨
🍻🍻🍻如果你喜欢的话,就不要吝惜你的一键三连了~

请添加图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/333285.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python设计模式-享元设计模式,抽象工厂设计模式,面向对象设计模式

享元设计模式 享元(flyweight)设计模式属于结构设计模式类别。 它提供了一种减少对象数的方法。 它包含各种有助于改进应用程序结构的功能。享元对象最重要的特性是不可变的。 这意味着一旦构建就不能修改它们。 该模式使用HashMap来存储引用对象 如何实现享元(flyweight)设计…

【个人作品】非侵入式智能开关

一、产品简介 一款可以通过网络实现语音、APP、小程序控制&#xff0c;实现模拟手动操作各种开关的非侵入式智能开关作品。 非侵入式&#xff0c;指的是不需要对现有的电路和开关做任何改动&#xff0c;只需要将此设备使用魔术无痕胶带固定在旁边即可。 以下为 ABS 材质的渲…

你知道 BI 是什么吗?关于 BI 系统的概述

BI 作为信息化建设中的关键一环&#xff0c;在企业中通常起到承上启下的作用&#xff0c;下能连接打通企业业务系统数据库&#xff0c;将各部门数据分类分级统一储存到数据仓库&#xff0c;简化存储取数流程&#xff0c;减少人力、时间成本&#xff1b;上能提供数据可视化报表…

Elasticsearch安装IK分词器、配置自定义分词词库

一、分词简介 在Elasticsearch中&#xff0c;假设搜索条件是“华为手机平板电脑”&#xff0c;要求是只要满足了其中任意一个词语组合的数据都要查询出来。借助 Elasticseach 的文本分析功能可以轻松将搜索条件进行分词处理&#xff0c;再结合倒排索引实现快速检索。Elasticse…

你是什么时候从轻视到高看软件测试的?

刚开始学软件测试很轻视&#xff0c;因为我那时很无知&#xff0c;这也是那时绝大多数人员的心态&#xff0c;那时中国最讲究“编程才是硬道理”。 如今却非常热爱软件测试&#xff0c;包括软件测试工具&#xff0c;方法&#xff0c;理论&#xff0c;技术。因为我在3年的测试工…

NLP学习——信息抽取

信息抽取 自动从半结构或无结构的文本中抽取出结构化信息的任务。常见的信息抽取任务有三类&#xff1a;实体抽取、关系抽取、事件抽取。 1、实体抽取 从一段文本中抽取出文本内容并识别为预定义的类别。 实体抽取任务中的复杂问题&#xff1a; 重复嵌套&#xff0c;原文中…

虚拟机磁盘重新分区增加Docker磁盘空间

目录一、简介二、重新分区 挂载目录2.1 增加虚拟机硬盘空间2.2 重新分区2.3 格式化新分区2.4 挂载docker目录三、重新拉取一、简介 今天在使用docker pull 拉取镜像时&#xff0c;报了no such file or directory的信息&#xff0c;原来是Docker的磁盘空间满了 #查看Docker Roo…

跳跃游戏 II 解析

题目描述给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处:0 < j < nums[i] i j < n返回到达 nums[n - 1] 的…

推荐一个前后端分离.NetCore+Angular快速开发框架

更多开源项目请查看&#xff1a;一个专注推荐.Net开源项目的榜单 今天给大家推荐一个开源项目&#xff0c;基于.NetCore开发的、前后端分离、前端有Vue、Angular、MVC多个版本的快速开发框架。 项目简介 这是一个基于.NetCore开发的快速开发框架&#xff0c;项目采用模块化架…

go语言实现的一个基于go-zero框架的微服务影院票务系统cinema-ticket

一个基于go-zero框架的微服务影院票务系统cinema-ticket 前言 项目基本介绍 项目开源地址&#xff1a;butane123/cinema-ticket: 一个基于go-zero框架的微服务影院票务系统cinema-ticket (github.com) 这是一个微服务影院票务系统&#xff0c;基于go-zero框架实现&#xff0c…

Monkey

文章目录一、简介二、原理2.1 特殊处理三、命令3.1 启动3.2 关闭四、事件4.1 触摸事件4.2 手势事件4.3 二指缩放事件4.4 轨迹事件4.5 屏幕旋转事件4.6 基本导航事件4.7 主要导航事件4.8 系统按键事件4.9 启动activity事件4.10 键盘事件4.11 其他类型事件五、参数5.1 常规类参数…

ThreadLocal原理、内存泄漏的验证

文章目录前言正文1、ThreadLocal 的常见使用场景2、从ThreadLocal的源码开始2.1 ThreadLocalMap2.2 ThreadLocalMap的 set 方法2.3 ThreadLocalMap的 remove 方法2.4 ThreadLocal 的 set 方法2.5 ThreadLocal 的 remove 方法3、内存泄漏3.1 内存泄漏的概念3.2 为什么说entry的k…

《唐诗三百首》数据源网络下载

2023年的 元宵之夜&#xff0c;这场以“长安”为主题的音乐会火了&#xff01;在抖音&#xff0c;超过2300万人次观看了直播&#xff0c;在线同赏唐诗与交响乐的融合。许多网友惊呼&#xff0c;上学时那些害怕背诵的诗句&#xff0c;原来还可以有这么美的表达这场近80分钟的音乐…

【dapr】服务调用(Service Invokation) - app id的解析

逻辑图解 上图来自Dapr官网教程&#xff0c;其中Checkout是一个服务&#xff0c;负责生成订单号&#xff0c; Order Processor是另一个服务&#xff0c;负责处理订单。Checkout服务需要调用Order Processor的API&#xff0c; 让Order Processor获取到其生成的订单号并进行处理。…

Chapter4:机器人仿真

ROS1{\rm ROS1}ROS1的基础及应用&#xff0c;基于古月的课&#xff0c;各位可以去看&#xff0c;基于hawkbot{\rm hawkbot}hawkbot机器人进行实际操作。 ROS{\rm ROS}ROS版本&#xff1a;ROS1{\rm ROS1}ROS1的Melodic{\rm Melodic}Melodic&#xff1b;实际机器人&#xff1a;Ha…

打造安全可信的通信服务,阿里云云通信发布《短信服务安全白皮书》

随着数字化经济的发展&#xff0c;信息保护和数据安全成为企业、个人关注的焦点。近日&#xff0c;阿里云云通信发布《短信服务安全白皮书》&#xff0c;该白皮书包含安全责任共担、安全合规、安全架构三大板块&#xff0c;呈现了阿里云云通信在信息安全保护方面的技术能力、安…

【知识梳理】Go语言核心编程

基础知识 Go语言就是为了解决编程语言对并发支持不友好、编译速度慢、编程复杂这三个问题而诞生的 特点: Go语言选择组合思想,抛弃继承关系通过接口组合,自由组合成新接口,用接口实现层与层之间的解耦语言特性对比: package mainimport "fmt"func main() {fmt…

防灾必看,边滑坡安全预警解决方案

一、行业背景在我国大部分地区经常会有雨季发生&#xff0c;大量的雨水渗透到了土壤内部&#xff0c;长时间饱含雨水的土壤会变得很重而且还会减少与下方岩石之间的摩擦力&#xff0c;顺着山坡这个滑梯滑下去&#xff0c;造成崩塌、滑坡、泥石流等地质灾害。地质灾害每年都是有…

ccs导入工程失败的处理方法

文章目录当导入CCS新工程时出现下述错误怎么办&#xff1f;方法一 从TI官网下载安装包进行安装&#xff0c;下载链接&#xff1a;软件下载完成 安装路径为上面的文件夹点击安装完成后&#xff0c;导入安装路径&#xff0c;并点击Refresh按钮&#xff0c;依据路径进行更新&#…

电磁隔离放大器-模拟信号4-20mA/0-±10mA/0-±10V转0-75mV/0-2.5V/0-20mA信号转换模块

概述&#xff1a;导轨安装DIN11 IPO EM系列模拟信号隔离放大器是一种将输入信号隔离放大、转换成按比例输出的直流信号混合集成电路。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等需要电量隔离测控的行业。该模块内部嵌入了一个高效微功率的电源&#xff0c;…