linux环境下使用sort命令完成常见排序操作
文章目录
- 前言
- 命令作用
- 常见选项
- 数据文件
- 核心参数
- 用法展示
- 按照指定列排序
- 将排序结果存入指定文件
- 查看文件是否已经排序好
- 去掉排序结果中的重复行
- 按照数值结果进行排序
- 反向排序
- 自定义分割字符
- 综合排序
- 总结
前言
linux 系统下的命令常常给人一种短小精悍的感觉,使用起来就像一把把锋利的小刀,在自己专注的领域做到极致,今天要聊的就是 linux 环境下的排序命令 sort
,处理文本按列排序非常方便,最近使用 sort
命令来排序日志查找问题,为了防止一段时间不用又会忘记,所以记录下来便于下次查找。
命令作用
sort
命令默认会将待排序内容以空格划分为多个列,然后对内容进行按列排序,命令本身不会修改待排序内容,而是将排序结果重新输出,如果想修改待排序源文件的内容,可以通过重定向命令来实现。
命令格式为:
sort [选项] 文件名
常见选项
sort
作为一个强大的命令,参数选项还挺多的,不过我只列举一些常见的参数,方便日常使用即可。
- -k: 指定排序依据的列数,可以分多次指定
- -o: 将排序后的结果存入指定文件
- -c: 检查指定文件是否已经排好序
- -u: 删除所有重复行
- -b: 忽略每行或字段前面开始出的空格字符
- -f: 排序比较时忽略大小写
- -n: 转化为数字,按照数值的大小排序
- -r: 反向排序,从大到小
- -t: 指定排序时划分列数的分隔字符
数据文件
为了展示 sort
命令的作用,专门利用 ls
命令产生了一段数据,并保存在了 data.txt 文件中,之后会利用这个文件来展示 sort
的用法,文件内容展示如下:
albert@home-pc:~$ cat data.txt
-rwxrwxr-x 1 albert albert 9272 Jul 18 22:27 a.out*
-rw------- 1 albert albert 7064 Oct 17 22:14 .bash_history
-rw-r--r-- 1 albert albert 220 Jul 16 00:52 .bash_logout
-rw-r--r-- 1 albert albert 3771 Jul 16 00:52 .bashrc
drwxrwxrwx 1 albert albert 4096 Jul 16 01:10 .cache/
drwx------ 1 albert albert 4096 Jul 16 00:52 .config/
-rw------- 1 albert albert 35 Jul 19 14:14 .lesshst
-rwxrwxr-x 1 albert albert 20328 Jul 18 19:49 mainpro*
-rw-rw-r-- 1 albert albert 195 Jul 18 22:27 mainpro.cpp
-rw-r--r-- 1 albert albert 655 Jul 16 00:52 .profile
-rw-r--r-- 1 albert albert 0 Jul 16 00:52 .sudo_as_admin_successful
-rw------- 1 root root 2257 Jul 16 01:10 .viminfo
drwxrwxrwx 1 albert albert 4096 Jul 19 21:19 .vscode-server/
-rw------- 1 albert albert 61 Sep 20 09:42 .Xauthority
这个文件中的内容在使用 sort
命令排序时默认以空格分割,所以共有9列,在指定列数时从1开始,接下来我们用这些数据来测试一下排序命令的用法。
核心参数
对于我来说 sort
命令的核心参数是 -k
,其完整的参数列表为 -k START_F[.START_C][OPTIONS][,END_F[.END_C][OPTIONS]]
,参数列表很长,但是不要恐惧,逐步分析就可以了。
-k
后面这已打算都是用来指定排序依据的范围的,其中 START_F
和 END_F
表示开始和结束的字段,也就是列数,.START_C
和 .END_C
表示指定字段开始和结束的字符数,OPTIONS
是由一个或多个单个字母排序的选项[bdfgiMhnRrV],这些选项中常用的已经列举在前面了,写在此处的选项会覆盖全局排序选项。
这样文字叙述有些枯燥,可以看下这个参数 -k 6.2b,6.3b
,这个排序选项的含义是把内容按照第6列的第2个字符到第6列的第3个字符排序,查找字符位置的时候要去掉前面的空白。
用法展示
看了以上的参数可能还是不太清楚具体怎样用,所以举了下面这些例子,可以方便的处理常用的排序工作。
按照指定列排序
这是最普通的排序要求了,也是我用的最多的情况,需要使用-k参数
- 按照第3列排序
albert@home-pc:~$ sort -k3,3 data.txt
drwx------ 1 albert albert 4096 Jul 16 00:52 .config/
drwxrwxrwx 1 albert albert 4096 Jul 16 01:10 .cache/
drwxrwxrwx 1 albert albert 4096 Jul 19 21:19 .vscode-server/
-rw------- 1 albert albert 35 Jul 19 14:14 .lesshst
-rw------- 1 albert albert 61 Sep 20 09:42 .Xauthority
-rw------- 1 albert albert 7064 Oct 17 22:14 .bash_history
-rw-r--r-- 1 albert albert 0 Jul 16 00:52 .sudo_as_admin_successful
-rw-r--r-- 1 albert albert 220 Jul 16 00:52 .bash_logout
-rw-r--r-- 1 albert albert 3771 Jul 16 00:52 .bashrc
-rw-r--r-- 1 albert albert 655 Jul 16 00:52 .profile
-rw-rw-r-- 1 albert albert 195 Jul 18 22:27 mainpro.cpp
-rwxrwxr-x 1 albert albert 20328 Jul 18 19:49 mainpro*
-rwxrwxr-x 1 albert albert 9272 Jul 18 22:27 a.out*
-rw------- 1 root root 2257 Jul 16 01:10 .viminfo
root 已经被排到了所有albert的后面
将排序结果存入指定文件
albert@home-pc:~$ sort -k3,3 data.txt -o dst.txt
albert@home-pc:~$ cat dst.txt
drwx------ 1 albert albert 4096 Jul 16 00:52 .config/
drwxrwxrwx 1 albert albert 4096 Jul 16 01:10 .cache/
drwxrwxrwx 1 albert albert 4096 Jul 19 21:19 .vscode-server/
-rw------- 1 albert albert 35 Jul 19 14:14 .lesshst
-rw------- 1 albert albert 61 Sep 20 09:42 .Xauthority
-rw------- 1 albert albert 7064 Oct 17 22:14 .bash_history
-rw-r--r-- 1 albert albert 0 Jul 16 00:52 .sudo_as_admin_successful
-rw-r--r-- 1 albert albert 220 Jul 16 00:52 .bash_logout
-rw-r--r-- 1 albert albert 3771 Jul 16 00:52 .bashrc
-rw-r--r-- 1 albert albert 655 Jul 16 00:52 .profile
-rw-rw-r-- 1 albert albert 195 Jul 18 22:27 mainpro.cpp
-rwxrwxr-x 1 albert albert 20328 Jul 18 19:49 mainpro*
-rwxrwxr-x 1 albert albert 9272 Jul 18 22:27 a.out*
-rw------- 1 root root 2257 Jul 16 01:10 .viminfo
排序结果已经被存储到了文件 dst.txt 中,其实这个命令还可以改写成
sort data.txt > dst.txt
查看文件是否已经排序好
- 测试没排好序的文件
albert@home-pc:~$ sort -k3,3 data.txt -c
sort: data.txt:2: disorder: -rw------- 1 albert albert 7064 Oct 17 22:14 .bash_history
- 测试已经排序的文件
albert@home-pc:~$ sort -k3,3 dst.txt -c
albert@home-pc:~$
对于已经拍好序的文件使用 -c 参数没有任何输出,如果是未排序的文件则会给出提示
去掉排序结果中的重复行
albert@home-pc:~$ sort -k3,3 data.txt -u
-rwxrwxr-x 1 albert albert 9272 Jul 18 22:27 a.out*
-rw------- 1 root root 2257 Jul 16 01:10 .viminfo
这里的重复行参考是你指定排序依据的列数,也就是第3列如果重复就会认为是重复行,结果中只能出现一次
按照数值结果进行排序
albert@home-pc:~$ sort -k5n,5 data.txt
-rw-r--r-- 1 albert albert 0 Jul 16 00:52 .sudo_as_admin_successful
-rw------- 1 albert albert 35 Jul 19 14:14 .lesshst
-rw------- 1 albert albert 61 Sep 20 09:42 .Xauthority
-rw-rw-r-- 1 albert albert 195 Jul 18 22:27 mainpro.cpp
-rw-r--r-- 1 albert albert 220 Jul 16 00:52 .bash_logout
-rw-r--r-- 1 albert albert 655 Jul 16 00:52 .profile
-rw------- 1 root root 2257 Jul 16 01:10 .viminfo
-rw-r--r-- 1 albert albert 3771 Jul 16 00:52 .bashrc
drwx------ 1 albert albert 4096 Jul 16 00:52 .config/
drwxrwxrwx 1 albert albert 4096 Jul 16 01:10 .cache/
drwxrwxrwx 1 albert albert 4096 Jul 19 21:19 .vscode-server/
-rw------- 1 albert albert 7064 Oct 17 22:14 .bash_history
-rwxrwxr-x 1 albert albert 9272 Jul 18 22:27 a.out*
-rwxrwxr-x 1 albert albert 20328 Jul 18 19:49 mainpro*
这里使用了 -k5n,5 作为排序选项,其中的 n 表示以数值方式排序,如果不加 n 的排序结果如下:
albert@home-pc:~$ sort -k5,5 data.txt
-rw-r--r-- 1 albert albert 0 Jul 16 00:52 .sudo_as_admin_successful
-rw-rw-r-- 1 albert albert 195 Jul 18 22:27 mainpro.cpp
-rwxrwxr-x 1 albert albert 20328 Jul 18 19:49 mainpro*
-rw-r--r-- 1 albert albert 220 Jul 16 00:52 .bash_logout
-rw------- 1 root root 2257 Jul 16 01:10 .viminfo
-rw------- 1 albert albert 35 Jul 19 14:14 .lesshst
-rw-r--r-- 1 albert albert 3771 Jul 16 00:52 .bashrc
drwx------ 1 albert albert 4096 Jul 16 00:52 .config/
drwxrwxrwx 1 albert albert 4096 Jul 16 01:10 .cache/
drwxrwxrwx 1 albert albert 4096 Jul 19 21:19 .vscode-server/
-rw------- 1 albert albert 61 Sep 20 09:42 .Xauthority
-rw-r--r-- 1 albert albert 655 Jul 16 00:52 .profile
-rw------- 1 albert albert 7064 Oct 17 22:14 .bash_history
-rwxrwxr-x 1 albert albert 9272 Jul 18 22:27 a.out*
数据看起来很乱,其实也是按照第5列排好序的,仔细分析你会发现是把这些数字当成字符串排的序
反向排序
albert@home-pc:~$ sort -k3,3 data.txt -r
-rw------- 1 root root 2257 Jul 16 01:10 .viminfo
-rwxrwxr-x 1 albert albert 9272 Jul 18 22:27 a.out*
-rwxrwxr-x 1 albert albert 20328 Jul 18 19:49 mainpro*
-rw-rw-r-- 1 albert albert 195 Jul 18 22:27 mainpro.cpp
-rw-r--r-- 1 albert albert 655 Jul 16 00:52 .profile
-rw-r--r-- 1 albert albert 3771 Jul 16 00:52 .bashrc
-rw-r--r-- 1 albert albert 220 Jul 16 00:52 .bash_logout
-rw-r--r-- 1 albert albert 0 Jul 16 00:52 .sudo_as_admin_successful
-rw------- 1 albert albert 7064 Oct 17 22:14 .bash_history
-rw------- 1 albert albert 61 Sep 20 09:42 .Xauthority
-rw------- 1 albert albert 35 Jul 19 14:14 .lesshst
drwxrwxrwx 1 albert albert 4096 Jul 19 21:19 .vscode-server/
drwxrwxrwx 1 albert albert 4096 Jul 16 01:10 .cache/
drwx------ 1 albert albert 4096 Jul 16 00:52 .config/
按照第3列反向排序,root就排到了所有albert的前面
自定义分割字符
sort
命令默认是以空格作为列的分割符号的,可以使用 -t
选项自定义分割符,比如我们使用 :
作为分隔符,然后以第二列进行排序
albert@home-pc:~$ sort -t ":" -k2,2 data.txt
drwxrwxrwx 1 albert albert 4096 Jul 16 01:10 .cache/
-rw------- 1 root root 2257 Jul 16 01:10 .viminfo
-rw------- 1 albert albert 7064 Oct 17 22:14 .bash_history
-rw------- 1 albert albert 35 Jul 19 14:14 .lesshst
drwxrwxrwx 1 albert albert 4096 Jul 19 21:19 .vscode-server/
-rwxrwxr-x 1 albert albert 9272 Jul 18 22:27 a.out*
-rw-rw-r-- 1 albert albert 195 Jul 18 22:27 mainpro.cpp
-rw------- 1 albert albert 61 Sep 20 09:42 .Xauthority
-rwxrwxr-x 1 albert albert 20328 Jul 18 19:49 mainpro*
-rw-r--r-- 1 albert albert 220 Jul 16 00:52 .bash_logout
-rw-r--r-- 1 albert albert 3771 Jul 16 00:52 .bashrc
drwx------ 1 albert albert 4096 Jul 16 00:52 .config/
-rw-r--r-- 1 albert albert 655 Jul 16 00:52 .profile
-rw-r--r-- 1 albert albert 0 Jul 16 00:52 .sudo_as_admin_successful
结果是以分钟数进行的排序
综合排序
学习了上面这么多参数,可以做一个综合的例子,以第6列的月份从小到大排序,以第5列文件大小逆序排列,通过组合上面的参数,可以使用下面的命令:
albert@home-pc:~$ sort -k6,6 -k5rn,5 data.txt
-rwxrwxr-x 1 albert albert 20328 Jul 18 19:49 mainpro*
-rwxrwxr-x 1 albert albert 9272 Jul 18 22:27 a.out*
drwx------ 1 albert albert 4096 Jul 16 00:52 .config/
drwxrwxrwx 1 albert albert 4096 Jul 16 01:10 .cache/
drwxrwxrwx 1 albert albert 4096 Jul 19 21:19 .vscode-server/
-rw-r--r-- 1 albert albert 3771 Jul 16 00:52 .bashrc
-rw------- 1 root root 2257 Jul 16 01:10 .viminfo
-rw-r--r-- 1 albert albert 655 Jul 16 00:52 .profile
-rw-r--r-- 1 albert albert 220 Jul 16 00:52 .bash_logout
-rw-rw-r-- 1 albert albert 195 Jul 18 22:27 mainpro.cpp
-rw------- 1 albert albert 35 Jul 19 14:14 .lesshst
-rw-r--r-- 1 albert albert 0 Jul 16 00:52 .sudo_as_admin_successful
-rw------- 1 albert albert 7064 Oct 17 22:14 .bash_history
-rw------- 1 albert albert 61 Sep 20 09:42 .Xauthority
总结
sort
命令中的-k
选项是最重要的参数,可以指定排序依据的列数sort
命令中的-n
选项也是常用的参数,可以进行数值比较- 在实际问题中常常需要综合运用这些参数,参考综合例子中的方式逐步确定参数选项就可以了。
==>> 反爬链接,请勿点击,原地爆炸,概不负责!<<==
业精于勤,荒于嬉;行成于思,毁于随。没有人能随随便便成功~
linux环境下使用sort命令完成常见排序操作相关推荐
- linux简单命令解释器设计,Linux环境下模拟实现命令解释器
在Linux环境下模拟实现命令解释器 一.程序概述 1.进入系统概述 本次课程设计是在红帽Linux发行版(Red Hat Enterprise Linux AS release 4 (Nahant ...
- linux curl命令 post,linux环境下使用curl命令设置Header参数发送post请求
linux环境下使用curl命令设置Header参数发送post请求 linux环境下使用curl命令设置Header参数发送post请求 案例1:curl命令发送post请求并且获取返回结果以及响应 ...
- 用python写linux中的ls,Python实现Linux环境下的ls命令
在Linux下使用ls命令结合正则表达式,能够高效地进行文件搜索,并通过参数操作文件,于是就想用Python实现这个功能以便在Windows上使用 import os import re import ...
- Linux环境下通过gstack命令查看进程的运行堆栈信息
gstack命令的说明如下: NAMEgstack - print a stack trace of a running process SYNOPSISgstack pid DESCRIPTIONg ...
- Linux环境下Git常用命令
Git常见命令 git本地仓库常见命令 git init (初始化本地仓库) git clone 远程仓库地址 (克隆远程地址仓库中的数据) git status (查看文件状态) git add ( ...
- Linux环境下MySQL基础命令(3)----增、删、改、查语句
MySQL中的增.删.改.查命令是最基础的语句,通常应用在对表内数据的维护工作中.本文是对mysql数据库name库中的users表进行实例演示.name库以及users表均为本人建立,并非自带. 1 ...
- linux中mysql如何删除库,Linux环境下MySQL基础命令(2)----查看、创建、删除库和表...
案例二,查看数据库 MySQL是一套数据库管理系统,支持运行多个库,每个库相当于一个容器,存放着许多表.数据就存在这些表中,所以查看.创建.删除库和表,在工作中必不可少. 一,查看 1,查看当前服务器 ...
- mysql的删除命令+linux命令大全,Linux环境下MySQL基础命令----查看、创建、删除库和表...
案例二,查看数据库 MySQL是一套数据库管理系统,支持运行多个库,每个库相当于一个容器,存放着许多表.数据就存在这些表中,所以查看.创建.删除库和表,在工作中必不可少. 一,查看 1,查看当前服务器 ...
- 在docker容器里的Linux环境下,执行netstat命令显示 command not found
在docker容器里 root@38f61d87d288:/# netstat -ano | grep 80 bash: netstat: command not found 于是想安装 netsta ...
最新文章
- 知名5G女教授邱锂力加盟MSRA,任职副院长!出走半生,回归上海
- 使用构建器模式来帮助您的单元测试
- leetcode28 Implement strStr() 在字符串中寻找目标字符串
- Unity3D基础29:消息发送
- 《深度学习》 --李宏毅学习导图总结
- 意境级讲解二分查找算法、python
- VC运行库修复安装一键安装
- 经验系列之java拦截器获取POST入参导致@RequestBody参数丢失问题解决
- Verilog实现千兆以太网传输
- 使用表格制作流量查询表
- 我的一百个2019(五):2019,我为什么还在坚持?
- 基础理论知识复习(上)
- linux读取excel并导入mysql_mysql命令行的导入导出sql,txt,excel(都在linux或windows命令行操作)(转自筑梦悠然)...
- 凌波微课|南农大资环学院钟山学术讲坛第五十四讲——特邀南京师范大学戴传超教授
- 【数据聚类】基于蝙蝠算法实现数据聚类附matlab代码
- 菜鸟要飞向ARM城堡——MDK中对基于S3C2440工程的配置
- 计算机电学原理,什么是与门电路及与非门电路原理?
- 【40nm版图问题记录】
- japan-movie-night-restraut
- JAVA工程师的工资真的很高吗?
热门文章
- 友盟+U-APM:全方面无忧助力APP启动速度优化
- bilibili正在缓冲却无法播放
- 量化感知训练_《量化健身 动作精讲》:专业解读健身动作的秘密
- 华工2018计算机接口技术大作业,2018华工接口技术课后作业
- 计算机simp按键,三招教你干掉流氓插件,让电脑从此安静下来
- 解决navicat 导出excel id 变成 科学计数法
- Zed Shaw:程序员的常见健康问题
- 4.四大类(DDL、DML、DQL、DCL)
- vlc多媒体播放器VLC Media Player 3.0.7.1中文版
- 笔记-redis深入学习-1