Linux命令

查看现在登陆的用户及登陆过的用户

who

who命令用于显示系统中有哪些使用者正在上面,显示的资料包含了使用者 ID、使用的终端机、从哪边连上来的、上线时间、呆滞时间、CPU 使用量、动作等等。

使用权限:所有使用者都可使用。

1
shell>> who
  • -H 或 --heading:显示各栏位的标题信息列;
  • -i 或 -u 或 --idle:显示闲置时间,若该用户在前一分钟之内有进行任何动作,将标成"."号,如果该用户已超过24小时没有任何动作,则标示出"old"字符串;
  • -m:此参数的效果和指定"am i"字符串相同;
  • -q 或–count:只显示登入系统的帐号名称和总人数;
  • -s:此参数将忽略不予处理,仅负责解决who指令其他版本的兼容性问题;
  • -w 或-T或–mesg或–message或–writable:显示用户的信息状态栏;
  • –help:在线帮助;
  • –version:显示版本信息。

显示当前登录系统的用户

1
2
3
4
5
## who  //显示当前登录系统的用户
root tty7 2014-05-13 12:12 (:0)
root pts/0 2014-05-14 17:09 (:0.0)
root pts/1 2014-05-14 18:51 (192.168.1.17)
root pts/2 2014-05-14 19:48 (192.168.1.17)

显示标题栏

1
2
3
4
5
6
## who -H
NAME LINE TIME COMMENT
root tty7 2014-05-13 12:12 (:0)
root pts/0 2014-05-14 17:09 (:0.0)
root pts/1 2014-05-14 18:51 (192.168.1.17)
root pts/2 2014-05-14 19:48 (192.168.1.17)

显示用户登录来源

1
2
3
4
5
6
7
8
## who -l -H
NAME LINE TIME IDLE PID COMMENT
LOGIN tty4 2014-05-13 12:11 852 id=4
LOGIN tty5 2014-05-13 12:11 855 id=5
LOGIN tty2 2014-05-13 12:11 862 id=2
LOGIN tty3 2014-05-13 12:11 864 id=3
LOGIN tty6 2014-05-13 12:11 867 id=6
LOGIN tty1 2014-05-13 12:11 1021 id=1

显示终端属性

1
2
3
4
5
6
## who -T -H
NAME LINE TIME COMMENT
root + tty7 2014-05-13 12:12 (:0)
root + pts/0 2014-05-14 17:09 (:0.0)
root - pts/1 2014-05-14 18:51 (192.168.1.17)
root - pts/2 2014-05-14 19:48 (192.168.1.17)

只显示当前用户

1
2
3
## who -m -H
NAME LINE TIME COMMENT
root pts/1 2014-05-14 18:51 (192.168.1.17)

精简模式显示

1
2
3
## who -q
root root root root
## users=4

last

last 命令用于显示系统用户的登录记录。它可以显示所有用户的登录和注销信息,包括登录时间、注销时间、登录终端、登录主机等。

1
shell>> last
  • -x:显示系统启动和关闭的记录。

  • -n num:限制显示的记录数量,简写-num

  • -R:不显示主机名或 IP 地址。

  • -F:显示完整的日期和时间。

  • -s <time>:从指定时间开始显示记录。

  • -t <time>:显示到指定时间为止的记录。

  • -F: 显示登录的完整时间

  • -w: 在输出中显示完整的用户名或域名

第一列:用户名

第二列:终端位置(pts/0伪终端,意味着从SSH或telnet等工具远程连接的用户,图形界面终端归于此类。tty0直接连接到计算机或本地连接的用户。后面的数字代表连接编号)

第三列:登录IP或内核(如果是:0.0或者什么都没有,意味着用户通过本地终端连接。除了重启活动,内核版本会显示在状态中)

第四列:开始时间

第五列:结束时间(still login in尚未退出,down直到正常关机,crash直到强制关机)

第六列:持续时间

指定显示记录的数量(显示记录中最后登录的数量)

1
2
3
4
5
6
7
8
9
10
11
[root@xnyh ~]# last -10 
root pts/1 129.204.519.11 Thu Feb 25 03:09 still logged in
wangnian pts/0 101.231.234.11 Thu Feb 25 03:00 - 04:00 (01:00)
wangnian pts/1 101.231.234.11 Wed Feb 24 01:26 - 02:27 (01:01)
wangnian pts/5 101.231.234.11 Wed Feb 24 00:03 - 01:03 (01:00)
wangnian pts/4 101.231.234.11 Tue Feb 23 23:59 - 01:03 (01:04)
wangnian pts/3 101.231.234.11 Tue Feb 23 23:58 - 01:27 (01:29)
wangnian pts/2 101.231.234.11 Tue Feb 23 23:58 - 00:57 (00:59)
wangnian pts/1 101.231.234.11 Tue Feb 23 23:23 - 00:23 (01:00)
wangnian pts/0 101.231.234.11 Tue Feb 23 23:23 - 01:04 (01:40)
root pts/3 129.204.519.11 Tue Feb 23 21:46 - 23:03 (01:16)

指定查询的文件,原本默认的是wtmp

1
[root@xnyh ~]# last -10 -f /var/log/btmp

显示特定用户的登录记录

1
last user1

显示系统启动和关闭的记录

1
last -x

显示指定时间之前的10条记录[-t YYYYMMDDHHMMSS]

1
2
3
4
5
6
7
8
9
10
11
[root@ftp 2021022512314]# last -10 -t 20210221000000
root pts/4 114.82.16.196 Sat Feb 20 22:17 - 23:17 (01:00)
root pts/3 101.231.234.12 Sat Feb 20 21:17 - 22:19 (01:02)
root pts/3 101.231.234.12 Sat Feb 20 20:01 - 21:02 (01:00)
root pts/3 101.231.234.12 Sat Feb 20 18:42 - 19:43 (01:00)
root pts/3 101.231.234.12 Sat Feb 20 16:38 - 17:40 (01:01)
root pts/4 101.231.234.12 Sat Feb 20 15:45 - 16:46 (01:00)
root pts/3 101.231.234.12 Sat Feb 20 14:58 - 16:00 (01:01)
root pts/5 101.231.234.12 Sat Feb 20 14:19 - 15:39 (01:20)
root pts/4 101.231.234.12 Sat Feb 20 14:09 - 15:30 (01:20)
root pts/3 101.231.234.12 Sat Feb 20 13:30 - 14:21 (00:50

ssh

ssh-key 是用于 SSH(Secure Shell)连接的身份验证机制,通过公钥和私钥对来实现安全的无密码登录。

1
ssh-keygen -t rsa -b 2048
  • -t rsa:指定生成的密钥类型为 RSA。
  • -b 2048:指定密钥长度为 2048 位(推荐使用 2048 位或更高)。

执行该命令后,系统会提示你输入保存密钥的文件路径和密码(可选):

1
2
3
4
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
  • 文件路径:默认路径为 ~/.ssh/id_rsa
  • 密码:可以选择设置一个密码来保护私钥,增加安全性。如果不需要密码,直接按回车键即可。

生成的密钥对包括:

  • 私钥~/.ssh/id_rsa
  • 公钥~/.ssh/id_rsa.pub

生成 Ed25519 密钥对:

Ed25519 是一种更现代的密钥类型,具有更高的安全性和性能。生成 Ed25519 密钥对的命令如下:

1
ssh-keygen -t ed25519

将公钥复制到远程服务器

生成密钥对后,需要将公钥复制到远程服务器的 ~/.ssh/authorized_keys 文件中。可以使用 ssh-copy-id 命令来完成这一操作:

1
ssh-copy-id user@remote_host
  • user:远程服务器上的用户名。
  • remote_host:远程服务器的主机名或 IP 地址。

执行该命令后,系统会提示你输入远程服务器的密码。成功后,公钥将被添加到远程服务器的 ~/.ssh/authorized_keys 文件中。

手动复制添加公钥

如果 ssh-copy-id 命令不可用,可以手动将公钥添加到远程服务器的 ~/.ssh/authorized_keys 文件中:

  1. 查看公钥内容

    1
    cat ~/.ssh/id_rsa.pub
  2. 将公钥内容复制到剪贴板

  3. 登录到远程服务器

    1
    ssh user@remote_host
  4. 创建 ~/.ssh 目录(如果不存在)

    1
    2
    mkdir -p ~/.ssh
    chmod 700 ~/.ssh
  5. 编辑 ~/.ssh/authorized_keys 文件

    1
    nano ~/.ssh/authorized_keys
  6. 将公钥内容粘贴到 authorized_keys 文件中,保存并退出编辑器。

  7. 设置 authorized_keys 文件的权限

    1
    chmod 600 ~/.ssh/authorized_keys

配置完成后,你可以使用 SSH 密钥进行无密码登录:

1
ssh user@remote_host

如果一切配置正确,你应该能够直接登录到远程服务器,而无需输入密码。

总结

通过生成 SSH 密钥对并配置公钥,可以实现安全的无密码登录。这不仅提高了登录的便利性,还增强了系统的安全性。以下是主要步骤的总结:

  1. 生成密钥对:使用 ssh-keygen 命令生成 RSA 或 Ed25519 密钥对。
  2. 配置公钥:使用 ssh-copy-id 或手动将公钥添加到远程服务器的 ~/.ssh/authorized_keys 文件中。
  3. 使用密钥登录:使用 ssh 命令进行无密码登录,或指定特定的私钥文件。
1
ssh -t -i /data/id_rsa_ops -o StrictHostKeyChecking=no -p 22 ops@192.168.101.225 "sudo -i"

选项和参数详解

  1. ssh
  • 功能:用于通过 SSH 协议连接到远程服务器。
  1. -t
  • 全称-t--tty
  • 功能:强制分配一个伪终端(pseudo-terminal)。这对于需要交互式操作的命令(如 sudo -i)非常重要,因为它允许你在远程服务器上进行交互式会话。
  • 解释-t 确保即使在非交互式命令中,也会分配一个终端,以便 sudo -i 能够正常工作。
  1. -i /data/id_rsa_ops
  • 全称-i--identity
  • 功能:指定用于身份验证的私钥文件。
  • 解释/data/scripts/id_rsa_ops 是私钥文件的路径,用于身份验证。
  1. -o StrictHostKeyChecking=no
  • 全称-o--option
  • 功能:设置 SSH 客户端的配置选项。
  • 解释StrictHostKeyChecking=no 表示在连接到新的或未知的主机时,不进行主机密钥检查。这可以避免首次连接时的确认提示,适用于自动化脚本。
  1. -p 22
  • 全称-p--port
  • 功能:指定连接的端口号。
  • 解释59679 是远程服务器的 SSH 服务监听的端口号。
  1. ops@192.168.101.225
  • 功能:指定远程服务器的用户名和主机名(或 IP 地址)。
  • 解释ops 是远程服务器上的用户名,164.52.47.9 是远程服务器的 IP 地址。
  1. "sudo -i"
  • 功能:在远程服务器上执行的命令。
  • 解释sudo -i 表示以 root 用户身份启动一个新的 shell 会话。-i 选项模拟初始登录,加载 root 用户的环境。

综合解释

这条命令的完整含义是:

  1. 连接到远程服务器:使用 ssh 命令连接到 IP 地址为 192.168.101.225 的远程服务器,使用用户名 ops
  2. 指定端口号:连接时使用端口号 22
  3. 使用私钥文件:使用 /data/id_rsa_ops 作为私钥文件进行身份验证。
  4. 禁用主机密钥检查:通过 StrictHostKeyChecking=no 选项禁用主机密钥检查,避免首次连接时的确认提示。
  5. 分配伪终端:通过 -t 选项强制分配一个伪终端,以便 sudo -i 能够正常工作。
  6. 执行命令:在远程服务器上执行 sudo -i 命令,以 root 用户身份启动一个新的 shell 会话。

使用场景

这条命令通常用于自动化脚本或需要以 root 用户身份执行某些操作的场景。例如,你可能需要在多台服务器上自动执行某些管理任务,而这些任务需要 root 权限。

注意事项

  1. 安全性:禁用主机密钥检查 (StrictHostKeyChecking=no) 会降低安全性,因为它允许连接到未知的主机。在生产环境中使用时需谨慎。
  2. 私钥保护:确保私钥文件的安全性,设置适当的权限(如 chmod 600)。

假设你有一个本地目录 /root/hq,其中包含一些重要文件,需要同步到远程服务器 192.168.101.225/tmp/ 目录,并且需要以 root 权限进行同步。你可以使用以下命令:

1
rsync -av -e 'ssh -i /data/id_rsa_ops -o StrictHostKeyChecking=no -p 22' --rsync-path="sudo rsync" /root/hq ops@192.168.101.225:/tmp/

选项和参数详解

  1. rsync
  • 功能:用于文件和目录的同步工具。
  1. -a
  • 全称--archive
  • 功能:归档模式,相当于 -rlptgoD 的组合,保留文件的属性(如权限、时间戳、符号链接等)。
  1. -v
  • 全称--verbose
  • 功能:详细模式,显示传输过程中的详细信息。
  1. -e 'ssh -i /data/scripts/id_rsa_ops -o StrictHostKeyChecking=no -p 59679'
  • 全称-e--rsh
  • 功能:指定用于远程连接的 shell 程序。
  • 解释ssh -i /data/id_rsa_ops -o StrictHostKeyChecking=no -p 22是一个完整的ssh命令,用于指定 SSH 连接的参数。
    • -i /data/id_rsa_ops:指定用于身份验证的私钥文件。
    • -o StrictHostKeyChecking=no:禁用主机密钥检查,避免首次连接时的确认提示。
    • -p 22:指定连接的端口号。
  1. --rsync-path="sudo rsync"
  • 功能:指定远程服务器上使用的 rsync 命令路径。
  • 解释sudo rsync 表示在远程服务器上使用 sudo 运行 rsync 命令,以提升权限。
  1. /root/hq
  • 功能:指定本地源目录。
  • 解释/root/hq 是本地需要同步的目录。
  1. ops@192.168.101.225:/tmp/
  • 功能:指定远程目标目录。
  • 解释ops@192.168.101.225 是远程服务器的用户名和 IP 地址,/tmp/ 是远程服务器上的目标目录。

综合解释

这条命令的完整含义是:

  1. 同步文件:使用 rsync 命令同步本地目录 /root/hq 到远程服务器 192.168.101.225 上的 /tmp/ 目录。
  2. 归档模式:使用 -a 选项保留文件的属性(如权限、时间戳、符号链接等)。
  3. 详细模式:使用 -v 选项显示传输过程中的详细信息。
  4. 指定 SSH 连接参数:使用 -e 选项指定 ssh 命令及其参数,包括私钥文件、禁用主机密钥检查和指定端口号。
  5. 提升远程权限:使用 --rsync-path="sudo rsync" 选项在远程服务器上使用 sudo 运行 rsync 命令,以提升权限。

通过 SSH 链接服务器运行本地 Shell 脚本 posts/1562562224/

sed

sed(stream editor)是一个强大的文本处理工具,常用于在Unix/Linux系统中对文本文件进行快速的解析和转换。它的工作方式是读取输入流(可以是文件或标准输入),根据给定的命令修改文本,并将结果输出到标准输出。

1
sed [选项]... '{脚本}' [输入文件]...
  • -n:通常情况下,sed会将每一行都输出到屏幕。使用-n参数后,只有经过sed命令处理并明确要求打印的行才会被显示出来。
  • -e script:允许添加多条编辑命令。每个命令之间用分号(;)隔开。
  • -f script-file:从文件中读取sed命令。
  • -i:直接修改文件内容,而不是输出到标准输出。
  • --help:显示帮助信息。
  • --version:显示版本信息。

假设有一个文件example.txt,其内容为:

1
2
Hello, World!
This is a test file.
  1. 替换文本

要将所有出现的“test”替换为“sed”,可以使用以下命令:

1
sed 's/test/sed/g' example.txt

这里的s/old/new/是替换命令,其中s表示替换,old是要被替换的字符串,new是新的字符串,g表示全局替换(即一行中的所有匹配项都会被替换)。

  1. 删除行

删除example.txt中所有包含“World”的行,可以使用:

1
sed '/World/d' example.txt

这里/World/d表示删除所有包含“World”的行。

  1. 打印特定行

只打印example.txt的第一行,可以使用:

1
sed -n '1p' example.txt

这里-n参数阻止了默认的输出行为,而1p命令指定了只打印第一行。

  1. 插入和追加文本

example.txt的第二行之前插入一行文本“Insert before line 2”:

1
sed '2i\Insert before line 2' example.txt

若要在第二行之后追加一行文本“Append after line 2”:

1
sed '2a\Append after line 2' example.txt

在包含关键字“Hello”的行之后插入一行Inserted line after 'Hello',可以使用以下命令:

1
sed '/Hello/a Inserted line after '\''Hello'\'' ' example.txt

这里的/Hello/a表示在匹配“test”的行之后追加文本。注意,由于命令中包含了单引号,所以我们需要对内部的单引号进行转义,使用\''来实现这一点。

在包含关键字“Hello”的行之前插入一行Prepended line before 'Hello',可以使用以下命令:

1
sed '/Hello/i Prepended line before '\''Hello'\'' ' example.txt
  1. 插入和追加文件

example.txt 中包含关键字“Hello”的行之后追加 append.txt 的内容,可以使用以下命令:

1
sed '/Hello/r append.txt' example.txt
  • /test/:匹配包含“test”的行。
  • r append.txt:在匹配到的行之后读取并插入 append.txt 的内容。

通过这种方式,你可以在 sed 中灵活地追加另一个文件复杂的内容而不用转义。

awk

1
awk [选项] '程序' [文件]
  • 记录(Record):默认情况下,每行是一个记录。
  • 字段(Field):每行中的列,字段之间默认由空格或制表符分隔。
  • 内置变量
    • NR:当前记录号(行号)。
    • NF:当前记录中的字段数。
    • $0:当前记录的全部内容。
    • $1, $2, …:当前记录中的第1个字段、第2个字段等。
    • FS:字段分隔符,默认为空格或制表符。
    • OFS:输出字段分隔符,默认为空格。
    • ORS:输出记录分隔符,默认为换行符。

假设我们有一个文件 data.csv,内容如下:

1
2
3
John,Doe,25
Jane,Smith,30
Alice,Johnson,28
  1. 打印文件中的特定字段

要打印每个人的姓名(第一列)和年龄(第三列),可以使用:

1
awk -F, '{print $1, $3}' data.csv

可以使用 FS 变量来设置分隔符

  1. 条件选择

只想打印年龄大于25岁的人的信息,可以使用条件语句:

1
awk -F, '$3 > 25 {print $1, $3}' data.csv
  1. 使用 BEGIN 和 END 块

BEGIN 块在处理任何输入之前执行,END 块在处理完所有输入后执行。例如,计算文件中所有人的平均年龄:

1
awk -F, 'BEGIN {sum=0; count=0} {sum += $3; count++} END {print "Average age:", sum/count}' data.csv

输出:

1
Average age: 27.6667
  1. 处理多行记录

有时,记录可能跨越多行。可以使用 RS 变量来设置记录分隔符。假设 data.txt 内容如下:

1
2
3
4
5
6
7
8
Name: John Doe
Age: 25

Name: Jane Smith
Age: 30

Name: Alice Johnson
Age: 28

要提取每个人的信息,可以使用:

1
awk -v RS= 'BEGIN {FS="\n"; OFS=": "} {print $1, $2}' data.txt

输出:

1
2
3
Name: John Doe: Age: 25
Name: Jane Smith: Age: 30
Name: Alice Johnson: Age: 28

正则匹配

假设 access.log 文件内容如下:

1
2
3
192.168.1.1 - - [10/Oct/2023:12:34:56 +0000] "GET /index.html HTTP/1.1" 200 1024
192.168.1.2 - - [10/Oct/2023:13:45:56 +0000] "POST /login HTTP/1.1" 200 512
192.168.1.3 - - [10/Oct/2023:14:56:56 +0000] "GET /about.html HTTP/1.1" 200 2048

提取每行的 URL:

1
awk '{match($0, /"([A-Z]+) ([^ ]+) HTTP\/[0-9\.]+"/, arr); print arr[2]}' access.log

输出:

1
2
3
/index.html
/login
/about.html

逐行解释

match($0, /"([A-Z]+) ([^ ]+) HTTP\/[0-9\.]+"/, arr);

  • matchawk 的内置函数,用于在字符串中查找与正则表达式匹配的部分。
  • $0:当前行的全部内容。
  • /"([A-Z]+) ([^ ]+) HTTP\/[0-9\.]+"/:正则表达式,用于匹配请求行。
  • arr:一个数组,用于存储匹配的结果。

正则表达式详解

  • ":匹配双引号。
  • ([A-Z]+):匹配一个或多个大写字母,并将其捕获到第一个分组(arr[1])。
  • :匹配一个空格。
  • ([^ ]+):匹配一个或多个非空格字符,并将其捕获到第二个分组(arr[2])。
  • :匹配一个空格。
  • HTTP\/[0-9\.]+:匹配 HTTP/ 后跟一个或多个数字或点。
  • ":匹配双引号。

print arr[2]

  • printawk 的内置函数,用于输出内容。
  • arr[2]:数组 arr 的第二个元素,即匹配到的 URL。

执行过程

读取第一行:

  • match 函数找到匹配的部分 "GET /index.html HTTP/1.1"
  • arr数组的内容:
    • arr[0]"GET /index.html HTTP/1.1"
    • arr[1]GET
    • arr[2]/index.html
  • print arr[2] 输出:/index.html

算术运算

假设我们有一个文件 grades.txt,内容如下:

1
2
3
4
5
85
90
78
92
88

使用 awk 来计算这些成绩的平均值:

1
awk '{sum += $1; count++} END {print "Average:", sum/count}' grades.txt

输出:

1
Average: 86.6

解释:

  • {sum += $1; count++}:将每行的第一个字段(即成绩)累加到变量 sum 中,并计数行数。
  • END {print "Average:", sum/count}:在处理完所有行后,计算并打印平均值。

条件判断

假设我们有一个文件 sales.txt,内容如下:

1
2
3
4
2023-01-01,apple,10
2023-01-01,banana,5
2023-01-02,apple,15
2023-01-02,orange,8

我们可以使用 awk 来计算特定产品的总销量:

1
awk -F, '$2 == "apple" {total += $3} END {print "Total sales of apple:", total}' sales.txt

输出:

1
Total sales of apple: 25

解释:

  • -F,:设置字段分隔符为逗号。
  • $2 == "apple" {total += $3}:如果第二列是 “apple”,则将第三列的值累加到变量 total 中。
  • END {print "Total sales of apple:", total}:在处理完所有行后,打印苹果的总销量。

列重复次数

awk 命令用来统计多列数据中,每对唯一值组合出现的次数的

假设有一个文件 data.txt,内容如下:

1
2
3
4
5
6
A 1  
B 2
A 1
C 3
B 2
A 2

运行命令:

1
awk '{a[$1" "$2]++} END {for (i in a) print i, a[i]}' data.txt
  1. awk:这是命令行中的 awk 程序,用于处理文本和数据。
  2. '{a[$1" "$2]++}':这是 awk 的动作部分,用单引号括起来。
    • $1$2:分别代表当前行的第一列和第二列的值。
    • $1" "$2:将第一列和第二列的值用空格连接起来,形成一个字符串。这样做是为了将两列的数据作为一个整体来处理,以便统计它们的组合出现的次数。
    • a[$1" "$2]++:这里使用了一个关联数组 a,其索引是上述由第一列和第二列值组成的字符串。对于每一行,如果某个索引(即某对列值组合)已经存在于数组 a 中,则将其对应的值增加 1;如果不存在,则在数组中创建这个索引,并将其值初始化为 1。
  3. END {for (i in a) print i, a[i]}:这是 awkEND 块,它在处理完所有输入行后执行。
    • for (i in a):遍历数组 a 的所有索引(即所有唯一的列值组合)。
    • print i, a[i]:对于数组中的每个索引 i(即每对列值组合),打印该索引(组合)和对应的值(出现次数)。

将会得到输出:

1
2
3
4
A 1 2  
B 2 2
C 3 1
A 2 1

sort

sort 是一个非常强大的命令行工具,用于对文本文件中的行进行排序。它可以按字母顺序、数值顺序、日期顺序等多种方式进行排序。下面我们将详细介绍 sort 的基本用法、常用选项以及一些示例。

1
sort [选项] [文件]
  • -k--key=POS1[,POS2]:指定排序的键(字段)。POS1 是起始字段,POS2 是结束字段。
  • -t--field-separator=SEP:指定字段分隔符。
  • -n--numeric-sort:按数值排序。
  • -r--reverse:反转排序顺序。
  • -u--unique:去除重复行。
  • -M--month-sort:按月份排序。
  • -h--human-numeric-sort:按人类可读的数值(如 K, M, G)排序,能够正确处理带有单位的数值。
  • -g--general-numeric-sort:按通用数值排序(支持科学记数法)。
  • -c--check:检查文件是否已排序。
  • -C--check=silent:检查文件是否已排序,但不输出错误信息。
  • -o--output=FILE:将输出写入指定文件。
  • -V--version-sort:按版本排序。主要适用于文件名或版本号的排序,能够正确处理像 1.10 大于 1.2 这样的版本号,也能处理类似 1K, 1M, 1G 的文件大小。

假设我们有一个文件 employees.txt,内容如下:

1
2
3
4
5
Alice 25 HR
Bob 30 IT
Charlie 28 HR
David 22 IT
Alice 20 HR

我们希望按部门(第三列)排序,再按年龄(第二列)排序,并去除重复行:

1
sort -k3,3 -k2,2n -u employees.txt

-k3,3

  • -k--key=POS1[,POS2]:指定排序的键(字段)。
  • 3,3:表示排序键从第3个字段开始,到第3个字段结束。也就是说,只按第3个字段排序。

-k2,2n

  • -k2,2n:表示排序键从第2个字段开始,到第2个字段结束,并且按数值排序。

  • 2,2:表示排序键为第2个字段。

  • n:表示按数值排序(numeric sort)。

  • -u--unique:去除重复行。在排序后的结果中,只保留第一次出现的行,去掉后续的重复行。

输出:

1
2
3
4
Alice 20 HR
Charlie 28 HR
Bob 30 IT
David 22 IT