跳至内容

Linux 用户命令

在本章中,您将学习 Linux 命令及其用法。


目标:在本章中,未来的 Linux 管理员将学会如何

✔ 在系统树中移动
✔ 创建文本文件,显示其内容并修改它。
✔ 使用最有用的 Linux 命令。

🏁 用户命令Linux

知识⭐
难度⭐

阅读时间:40 分钟


概述

当前的 Linux 系统拥有专用于管理员工作的图形化实用程序。然而,出于多种原因,能够使用命令行界面非常重要。

  • 大多数系统命令对于所有 Linux 发行版都是通用的,而图形化工具则不是。
  • 有时系统可能无法正常启动,但备份命令解释器仍然可用。
  • 远程管理通过 SSH 终端在命令行中完成。
  • 为了节省服务器资源,图形界面要么未安装,要么按需启动。
  • 管理是通过脚本完成的。

学习这些命令可以使管理员连接到 Linux 终端,管理其资源和文件,识别工作站、终端以及已连接的用户等。

用户

Linux 系统的用户将在 /etc/passwd 文件中定义,通过

  • 一个登录名,通常称为“login”,不包含空格。
  • 一个数字标识符:UID(用户标识符)。
  • 一个组标识符:GID(组标识符)。
  • 一个命令解释器,例如 shell,它可以因用户而异。
  • 一个连接目录,例如主目录

在其他文件中,用户将通过以下方式定义

  • 一个密码,在存储之前会进行加密(/etc/shadow)。
  • 一个命令提示符,或提示符 login,它由以下符号表示

    • # 代表管理员
    • $ 代表其他用户(/etc/profile)。

根据系统实施的安全策略,密码将需要一定数量的字符并满足某些复杂性要求。

在现有的命令解释器中,Bourne-Again Shell/bin/bash)是最常用的。它默认分配给新用户。由于各种原因,高级 Linux 用户可以选择替代 shell,如 Korn Shell (ksh)、C Shell (csh) 等。

用户的登录目录按惯例存储在工作站的 /home 目录中。它将包含用户的个人数据和应用程序的配置文件。默认情况下,登录时,登录目录被选为当前目录。

工作站类型的安装(带图形界面)会在终端 1 上启动此界面。Linux 是多用户系统,可以同时连接多个用户,在不同的物理终端(TTY)或虚拟终端(PTS)上。虚拟终端在图形环境中可用。用户可以使用 Alt+Fx 从命令行切换到不同的物理终端,或使用 Ctrl+Alt+Fx

Shell

用户连接到控制台后,Shell 会显示命令提示符。然后它会像一个无限循环一样运行,在每次输入的语句中重复相同的模式

  • 显示命令提示符。
  • 读取命令。
  • 分析语法。
  • 替换特殊字符。
  • 执行命令。
  • 显示命令提示符。
  • 等等。

按键组合 Ctrl+C 用于中断正在运行的命令。

命令的使用通常遵循以下顺序

command [option(s)] [argument(s)]

命令的名称通常是小写

空格分隔每个项目。

短选项以连字符 (-l) 开头,而长选项以两个连字符 (--list) 开头。双连字符 (--) 表示选项列表的结束。

可以将一些短选项组合在一起

ls -l -i -a

相当于

ls -lia

一个选项后可以有多个参数

ls -lia /etc /home /var

在文献中,“选项”一词等同于“参数”,这在编程中更常用。选项或参数的可选部分用方括号 [] 括起来。当可能有一个以上的选项时,一个称为“管道”的竖线将它们分隔开 [a|e|i]

通用命令

apropos, whatisman 命令

任何级别的管理员都不可能详细了解所有命令和选项。通常所有已安装的命令都有手册。

apropos 命令

apropos 命令允许您在这些手册页中按关键字搜索

选项 描述
-s, --sections list--section list 仅限于手册的部分。
-a--and 仅显示与所有提供的关键字匹配的项目。

示例

$ apropos clear
clear (1)            - clear the terminal screen
clear_console (1)    - clear the console
clearenv (3)         - clear the environment
clearerr (3)         - check and reset stream status
clearerr_unlocked (3) - nonlocking stdio functions
feclearexcept (3)    - floating-point rounding and exception handling
fwup_clear_status (3) - library to support management of system firmware updates
klogctl (3)          - read and/or clear kernel message ring buffer; set console_loglevel
sgt-samegame (6)     - block-clearing puzzle
syslog (2)           - read and/or clear kernel message ring buffer; set console_loglevel
timerclear (3)       - timeval operations
XClearArea (3)       - clear area or window
XClearWindow (3)     - clear area or window
XSelectionClearEvent (3) - SelectionClear event structure

要查找允许更改帐户密码的命令

$ apropos --exact password  -a change
chage (1)            - change user password expiry information
passwd (1)           - change user password

whatis 命令

whatis 命令显示作为参数传递的命令的描述

whatis clear

示例

$ whatis clear
clear (1)            - clear the terminal screen

man 命令

一旦由 aproposwhatis 找到,手册就由 man(“Man is your friend”)读取。这套手册分为 8 个部分,按主题分组信息,默认部分为 1

  1. 可执行程序或命令。
  2. 系统调用(内核提供的函数)。
  3. 库调用(库提供的函数)。
  4. 特殊文件(通常位于 /dev)。
  5. 文件格式和约定(配置文件,如 etc/passwd)。
  6. 游戏(例如基于字符的应用程序)。
  7. 杂项(例如 man (7))。
  8. 系统管理命令(通常仅供 root 使用)。
  9. 内核例程(非标准)。

可以通过输入 man x intro 来访问每个部分的信息,其中 x 是部分编号。

命令

man passwd

将告知管理员关于 passwd 命令、其选项等信息。而

man 5 passwd

将告知他关于与该命令相关的文件。

使用箭头 键在手册中导航。按 Q 键退出手册。

shutdown 命令

shutdown 命令允许您电子关闭 Linux 服务器,可以立即关闭或在一段时间后关闭。

shutdown [-h] [-r] time [message]

hh:mm 格式指定关机时间,或以 +mm 指定延迟分钟数。

要强制立即停止,请使用 now 一词代替时间。在这种情况下,可选消息不会发送给系统的其他用户。

示例

[root]# shutdown -h 0:30 "Server shutdown at 0:30"
[root]# shutdown -r +5

选项

选项 备注
-h 电子关闭系统。
-r 重启系统。

history 命令

history 命令显示用户输入的命令历史记录。

命令存储在用户登录目录的 .bash_history 文件中。

history 命令示例

$ history
147 man ls
148 man history
选项 注释
-w 将当前历史记录写入历史文件。
-c 删除当前会话的历史记录(但不会删除 .bash_history 文件内容)。
  • 操作历史记录

要操作历史记录,从命令提示符输入的以下命令将

功能
!+! 调用最后输入的命令。
!+N 按列表中的编号调用命令。
!+string 调用以字符串开头的最新命令。
按时间倒序导航历史记录,从最新命令开始。
按时间顺序导航历史记录。

自动补全

自动补全是极大的帮助。

  • 补全命令、输入的路径或文件名。
  • 如果只有一个解决方案,请按 Tab 键完成输入。
  • 如果有多个解决方案,请按 Tab 键两次以查看选项。

如果双击 Tab 键没有显示任何选项,则当前补全没有解决方案。

显示和识别

clear 命令

clear 命令清除终端屏幕的内容。更准确地说,它会移动显示,使命令提示符位于屏幕的第一行。

在物理终端上,显示将永久隐藏,而在图形界面中,滚动条允许您返回虚拟终端的历史记录。

技巧

Ctrl+L 的效果与 clear 命令相同。

echo 命令

echo 命令用于显示字符串。

此命令最常用于管理脚本中,以便在执行过程中向用户提供信息。

-n 选项表示不输出换行符(默认是输出换行符)。

shell > echo -n "123";echo "456"
123456

shell > echo "123";echo "456"
123
456

出于各种原因,脚本开发人员可能需要使用特殊序列(以 \ 字符开头)。在这种情况下,将指定 -e 选项,允许解释这些序列。

在频繁使用的序列中,我们可以提及

序列 结果
\a 发出蜂鸣声
\b 退格
\n 添加换行符
\t 添加水平制表符
\v 添加垂直制表符

date 命令

date 命令显示日期和时间。该命令的语法如下

date [-d yyyyMMdd] [format]

示例

$ date
Mon May 24 16:46:53 CEST 2021
$ date -d 20210517 +%j
137

在最后一个示例中,-d 选项显示给定日期。+%j 选项将此日期格式化为仅显示一年中的第几天。

警告

日期的格式可能因环境变量 $LANG 中定义的语言值而异。

日期显示可以遵循以下格式

选项 格式
+%A 本地化的完整星期名称(例如,星期日)
+%B 本地化的完整月份名称(例如,一月)
+%c 本地化的日期和时间(例如,2005 年 3 月 3 日星期四 23:05:25)
+%d 月份中的日期(例如,01)
+%F 日期格式为 YYYY-MM-DD
+%G 年份
+%H 小时(00..23)
+%j 一年中的第几天(001..366)
+%m 月份(01..12)
+%M 分钟(00..59)
+%R 时间格式为 hh:mm
+%s 自 1970 年 1 月 1 日以来的秒数
+%S 秒(00..60)
+%T 时间格式为 hh:mm:ss
+%u 星期中的第几天(1 代表星期一)
+%V 周数(+%V
+%x 日期格式为 DD/MM/YYYY

date 命令还允许您更改系统日期和时间。在这种情况下,将使用 -s 选项。

[root]# date -s "2021-05-24 10:19"

-s 选项之后使用的格式如下

date -s "yyyy-MM-dd hh:mm[:ss]"

id, whowhoami 命令

id 命令用于显示有关用户和组的信息。默认情况下,不添加用户参数,并显示当前登录用户和组的信息。

$ id rockstar
uid=1000(rockstar) gid=1000(rockstar) groups=1000(rockstar),10(wheel)

-g, -G, -n-u 选项分别显示主组 GID、子组 GIDs、名称而非数字标识符以及用户的 UID。

whoami 命令显示当前用户的登录名。

单独使用 who 命令会显示已登录用户的名称

$ who
rockstar tty1   2021-05-24 10:30
root     pts/0  2021-05-24 10:31

由于 Linux 是多用户系统,可能在一个工作站上打开多个会话,无论是物理会话还是网络会话。了解哪些用户已登录很有趣,即使只是为了通过发送消息与他们交流。

  • tty:表示一个终端。
  • pts/:表示图形环境中的虚拟控制台,后面的数字表示虚拟控制台的实例(0、1、2...)

-r 选项还显示运行级别(请参阅“启动”章节)。

文件树

在 Linux 中,文件树是倒置的树,称为单一分层树,其根目录是 / 目录。

当前目录是用户所在的目录。

连接目录是与用户关联的工作目录。登录目录默认存储在 /home 目录中。

当用户登录时,当前目录是登录目录。

绝对路径通过遍历整个树直到文件级别来引用从根目录开始的文件

  • /home/groupA/alice/file

相对路径通过从当前目录遍历整个树来引用同一个文件

  • ../alice/file

在上面的示例中,“..” 指的是当前目录的父目录。

一个目录,即使它是空的,也至少会包含两个引用

  • .:引用自身。
  • ..:引用当前目录的父目录。

因此,相对路径可以以 ./../ 开头。当相对路径引用当前目录下的子目录或文件时,通常会省略 ./。只有在运行可执行文件时,才真正需要提及第一个 ./

路径中的错误会导致许多问题:在错误的位置创建文件夹或文件,意外删除等。因此,强烈建议在输入路径时使用自动补全。

our example tree

在上面的示例中,我们试图从 bob 的目录中找到文件 myfile 的位置。

  • 使用绝对路径,当前目录无关紧要。我们从根目录开始,向下遍历到 homegroupAalice 目录,最后到文件 myfile/home/groupA/alice/myfile
  • 使用相对路径,我们的起点是当前目录 bob,我们通过 .. 向上移动一个级别(即进入 groupA 目录),然后向下进入 alice 目录,最后是 myfile 文件:../alice/myfile

pwd 命令

pwd(Print Working Directory)命令显示当前目录的绝对路径。

$ pwd
/home/rockstar

要使用相对路径引用文件或目录,或使用 cd 命令移动到另一个目录,您必须知道其在文件树中的位置。

根据 shell 的类型及其配置文件中的不同参数,终端提示符(也称为命令提示符)将显示当前目录的绝对路径或相对路径。

cd 命令

cd(Change Directory)命令允许您更改当前目录,换句话说,就是在树中移动。

$ cd /tmp
$ pwd
/tmp
$ cd ../
$ pwd
/
$ cd
$ pwd
/home/rockstar

如上面最后一个示例所示,不带参数的 cd 命令会将当前目录更改为主目录

ls 命令

ls 命令显示目录的内容。

ls [-a] [-i] [-l] [directory1] [directory2] []

示例

$ ls /home
.    ..    rockstar

ls 命令的主要选项包括

选项 信息
-a 显示所有文件,包括隐藏文件。Linux 中的隐藏文件是以 . 开头的。
-i 显示 inode 号。
-l 使用长列表格式,即每行显示文件或目录的长格式信息。

ls 命令有很多选项(参见 man

选项 信息
-d 显示目录的信息,而不是列出其内容。
-g 与 -l 选项相同,但不列出所有者。
-h 以最合适的格式(字节、千字节、兆字节、吉字节等)显示文件大小。h 表示人类可读。需要与 -l 选项一起使用。
-s 以块为单位显示每个文件的分配大小。在 ls 命令中,单个块的默认大小是 1024 字节。在 GNU/Linux 操作系统中,“块”是文件系统中最小的存储单元,总的来说,一个块等于 4096 字节。在 Windows 操作系统中,以 NTFS 文件系统为例,其最小存储单元称为“簇”。最小存储单元名称的定义可能因文件系统而异。
-A 显示目录中的所有文件,不包括 ...
-R 递归显示子目录的内容。
-F 显示文件类型。目录显示 /,可执行文件显示 *,符号链接显示 @,文本文件则不显示任何内容。
-X 按扩展名对文件进行排序。
  • 运行 ls -lia 命令生成的列说明
$ ls -lia /home
78489 drwx------ 4 rockstar rockstar 4096 25 oct. 08:10 rockstar
信息
78489 Inode 号。
drwx------ 文件类型(d)和权限(rwx------)。
4 子目录数(包括 ...)。对于文件,它表示硬链接数,1 表示自身。
rockstar 用户所有权。
rockstar 组所有权。
4096 对于文件,它显示文件大小。对于目录,它显示文件命名占用的固定 4096 字节。要计算目录的总大小,请使用 du -sh rockstar/
25 oct. 08:10 最后修改日期。
rockstar 文件名(或目录名)。

注意

别名通常在常见发行版中设置。

别名 ll 就是这种情况。

alias ll='ls -l --color=auto'

ls 命令有很多选项。这里是一些高级用法示例

  • 按最后修改时间列出 /etc 中的文件
$ ls -ltr /etc
total 1332
-rw-r--r--.  1 root root    662 29 may   2021 logrotate.conf
-rw-r--r--.  1 root root    272 17 may.   2021 mailcap
-rw-------.  1 root root    122 12 may.  2021 securetty
...
-rw-r--r--.  2 root root     85 18 may.  17:04 resolv.conf
-rw-r--r--.  1 root root     44 18 may.  17:04 adjtime
-rw-r--r--.  1 root root    283 18 may.  17:05 mtab
  • 列出大于 1MB 但小于 1GB 的 /var 文件。此示例使用了高级 grep 命令和正则表达式。初学者不必费力,未来会有专门的教程介绍这些正则表达式。
$ ls -lhR /var/ | grep ^\- | grep -E "[1-9]*\.[0-9]*M" 
...
-rw-r--r--. 1 apache apache 1.2M 10 may.  13:02 XB RiyazBdIt.ttf
-rw-r--r--. 1 apache apache 1.2M 10 may.  13:02 XB RiyazBd.ttf
-rw-r--r--. 1 apache apache 1.1M 10 may.  13:02 XB RiyazIt.ttf
...

当然,我们强烈建议您使用 find 命令。

find /var -size +1M -a -size -1024M  -a -type f  -exec ls -lh {} \;
  • 显示文件夹的权限

要查看文件夹的权限,在我们的示例 /etc 中,以下命令合适

$ ls -l /etc
total 1332
-rw-r--r--.  1 root root     44 18 nov.  17:04 adjtime
-rw-r--r--.  1 root root   1512 12 janv.  2010 aliases
-rw-r--r--.  1 root root  12288 17 nov.  17:41 aliases.db
drwxr-xr-x.  2 root root   4096 17 nov.  17:48 alternatives
...

上面的命令将默认显示文件夹的内容(内部)。对于文件夹本身,您可以使用 -d 选项。

ls -ld /etc
drwxr-xr-x. 69 root root 4096 18 nov.  17:05 /etc
  • 按文件大小排序,最大的在前
ls -lhS
  • 时间/日期格式与 -l
$ ls -l --time-style="+%Y-%m-%d %m-%d %H:%M" /
total 12378
dr-xr-xr-x. 2 root root 4096 2014-11-23 11-23 03:13 bin
dr-xr-xr-x. 5 root root 1024 2014-11-23 11-23 05:29 boot
  • 在文件夹末尾添加斜杠

默认情况下,ls 命令不显示文件夹的最后一个斜杠。在某些情况下,例如用于脚本时,显示它们很有用。

$ ls -dF /etc
/etc/
  • 隐藏某些扩展名
ls /etc --hide=*.conf

mkdir 命令

mkdir 命令创建目录或目录树。

mkdir [-p] directory [directory] [...]

示例

mkdir /home/rockstar/work

要创建“work”目录,必须先存在“rockstar”目录。

否则,应使用 -p 选项。-p 选项会在父目录不存在时创建它们。

危险

不建议将 Linux 命令名称用作目录或文件名。

touch 命令

touch 命令更改文件的修改时间戳,如果文件不存在则创建一个空文件。

touch [-t date] file

示例

touch /home/rockstar/myfile
选项 信息
-t date 使用指定日期更改文件的最后修改日期。

日期格式:[AAAA]MMJJhhmm[ss]

技巧

touch 命令主要用于创建空文件,但它可能对增量或差异备份有用。事实上,执行 touch 命令对文件的唯一效果是强制其在下次备份时保存。

rmdir 命令

rmdir 命令删除空目录。

示例

rmdir /home/rockstar/work
选项 信息
-p 如果提供的父目录为空,则删除它们。

技巧

要删除非空目录及其内容,请使用 rm 命令。

rm 命令

rm 命令删除文件或目录。

rm [-f] [-r] file [file] [...]

危险

任何文件或目录的删除都是最终的。

选项 信息
-f 不询问是否删除。
-i 询问是否删除。
-r 删除目录并递归删除其子目录。

注意

rm 命令本身在删除文件时不会要求确认。但是,在 Red Hat/Rocky 发行版中,rm 会要求删除确认,因为 rm 命令是 rm -i 命令的别名。如果您在另一个发行版(例如 Debian)上没有收到确认请求,请不要感到惊讶。

使用 rm 命令删除文件夹,无论该文件夹是否为空,都需要添加 -r 选项。

选项的结束由双连字符 -- 告知 shell。

在示例中

$ >-hard-hard # To create an empty file called -hard-hard
hard-hard
[CTRL+C] To interrupt the creation of the file
$ rm -f -- -hard-hard

硬链接文件名以 - 开头。如果不使用 --,shell 会将 -hard-hard 中的 -d 解释为选项。

mv 命令

mv 命令移动并重命名文件。

mv file [file ...] destination

示例

mv /home/rockstar/file1 /home/rockstar/file2

mv /home/rockstar/file1 /home/rockstar/file2 /tmp
选项 信息
-f 如果覆盖目标文件,不询问确认。
-i 如果覆盖目标文件,请求确认(默认)。

几个具体案例将帮助您理解可能出现的问题

mv /home/rockstar/file1 /home/rockstar/file2

file1 重命名为 file2。如果 file2 已存在,则用 file1 的内容覆盖。

mv /home/rockstar/file1 /home/rockstar/file2 /tmp

file1file2 移动到 /tmp 目录。

mv file1 /repexist/file2

file1 移动到 repexist 并将其重命名为 file2

mv file1 file2

file1 重命名为 file2

mv file1 /repexist

如果目标目录存在,则将 file1 移动到 /repexist

mv file1 /wrongrep

如果目标目录不存在,则将 file1 在根目录中重命名为 wrongrep

cp 命令

cp 命令复制文件。

cp file [file ...] destination

示例

cp -r /home/rockstar /tmp
选项 信息
-i 如果覆盖(默认),请求确认。
-f 如果覆盖目标文件,不询问确认。
-p 保留复制文件的所有者、权限和修改时间。
-r 复制目录及其文件和子目录。
-s 创建符号链接而不是复制。
cp file1 /repexist/file2

file1 复制到 /repexist,文件名为 file2

cp file1 file2

file1 复制为该目录下的 file2

cp file1 /repexist

如果目标目录存在,则将 file1 复制到 /repexist

cp file1 /wrongrep

如果目标目录不存在,则将 file1 复制到根目录,文件名为 wrongrep

可视化

file 命令

file 命令显示文件的类型。

file file1 [files]

示例

$ file /etc/passwd /etc
/etc/passwd:    ASCII text
/etc:        directory

more 命令

more 命令逐屏显示一个或多个文件的内容。

more file1 [files]

示例

$ more /etc/passwd
root:x:0:0:root:/root:/bin/bash
...

使用 Enter 键逐行移动。使用 Space 键逐页移动。/text 允许您在文件中搜索匹配项。

less 命令

less 命令显示一个或多个文件的内容。less 命令是交互式的,并有自己的命令可供使用。

less file1 [files]

less 的特定命令是

命令 操作
hH 帮助。
向上、向下移动一行,或向右或向左移动。
回车 向下移动一行。
空格 向下移动一页。
Page UpPage Down 向上或向下移动一页。
gG 跳转到第一页和最后一页
/text 搜索文本。
qQ 退出 less 命令。

cat 命令

cat 命令将多个文件的内容连接起来,并将结果显示在标准输出上。

cat file1 [files]

示例 1 - 将文件内容显示到标准输出

cat /etc/passwd

示例 2 - 将多个文件的内容显示到标准输出

cat /etc/passwd /etc/group

示例 3 - 使用输出重定向将多个文件的内容合并到一个文件中

cat /etc/passwd /etc/group > usersAndGroups.txt

示例 4 - 显示行号

$ cat -n /etc/profile
     1    # /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
     2    # and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).
     3
     4    if [ "`id -u`" -eq 0 ]; then
     5      PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
     6    else

示例 5 - 显示非空行的编号

$ cat -b /etc/profile
     1    # /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
     2    # and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

     3    if [ "`id -u`" -eq 0 ]; then
     4      PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
     5    else

tac 命令

tac 命令的功能与 cat 命令几乎相反。它从末尾开始显示文件内容(这对于读取日志特别有用!)。

示例:通过先显示最后一行来显示日志文件

[root]# tac /var/log/messages | less

head 命令

head 命令显示文件开头的内容。

head [-n x] file
选项 描述
-n x 显示文件的前 x

默认情况下(没有 -n 选项),head 命令将显示文件的前 10 行。

tail 命令

tail 命令显示文件结尾的内容。

tail [-f] [-n x] file
选项 描述
-n x 显示文件最后 x
-f 实时显示文件更改

示例

tail -n 3 /etc/passwd
sshd:x:74:74:Privilege-separeted sshd:/var/empty /sshd:/sbin/nologin
tcpdump::x:72:72::/:/sbin/nologin
user1:x:500:500:grp1:/home/user1:/bin/bash

使用 -f 选项,文件更改信息将一直输出,直到用户使用 Ctrl+C 退出监控状态。此选项非常频繁地用于实时跟踪日志文件。

如果没有 -n 选项,tail 命令将显示文件最后 10 行。

sort 命令

sort 命令对文件的行进行排序。

它允许您以指定的顺序(数字、字母、大小(KB、MB、GB)或反序)对命令结果或文件内容进行排序。

sort [-k] [-n] [-u] [-o file] [-t] file

示例

$ sort -k 3,4 -t ":" -n /etc/passwd
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm/:/sbin/nologin
选项 描述
-k 指定要分隔的列。您可以指定多个列。
-n 要求进行数字排序。
-o file 将排序结果保存到指定文件。
-t 指定一个分隔符,这要求相应文件的内容必须是规则分隔的列内容,否则无法正确排序。
-r 反转结果的顺序。与 -n 选项一起使用,可以从大到小排序。
-u 排序后删除重复项。相当于 sort FILE | uniq 命令。

sort 命令仅在屏幕上对文件进行排序。文件不会因排序而修改。要保存排序结果,请使用 -o 选项或输出重定向 >

默认情况下,数字是根据其字符排序的。因此,“110”会在“20”之前,而“20”会在“3”之前。必须指定 -n 选项,以便数字字符块按其值排序。

sort 命令使用 -r 选项反转结果的顺序

$ sort -k 3 -t ":" -n -r /etc/passwd
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin

在此示例中,sort 命令将按 uid(用户标识符)从大到小的顺序对 /etc/passwd 文件的内容进行排序。

sort 命令的一些高级用法示例

  • 打乱值

sort 命令也允许使用 -R 选项打乱值。

sort -R /etc/passwd
  • 排序 IP 地址

系统管理员很快就会面临处理其服务日志中的 IP 地址,例如 SMTP、VSFTP 或 Apache。这些地址通常使用 cut 命令提取。

以下是使用 dns-client.txt 文件的示例

192.168.1.10
192.168.1.200
5.1.150.146
208.128.150.98
208.128.150.99
$ sort -nr dns-client.txt
208.128.150.99
208.128.150.98
192.168.1.200
192.168.1.10
5.1.150.146
  • 按删除重复项排序文件

sort 命令可以使用 -u 作为选项来识别并删除文件输出中的重复项。

以下是使用 colours.txt 文件的示例

Red
Green
Blue
Red
Pink
$ sort -u colours.txt
Blue
Green
Pink
Red
  • 按大小排序文件

sort 命令可以识别文件大小,例如来自 ls 命令和 -h 选项。

以下是使用 size.txt 文件的示例

1.7G
18M
69K
2.4M
1.2M
4.2G
6M
124M
12.4M
4G
$ sort -hr size.txt
4.2G
4G
1.7G
124M
18M
12.4M
6M
2.4M
1.2M
69K

wc 命令

wc 命令计算文件中行数、单词数和/或字节数。

wc [-l] [-m] [-w] file [files]
选项 描述
-c 计算字节数。
-m 计算字符数。
-l 计算行数。
-w 计算单词数。

find 命令

find 命令用于搜索文件或目录的位置。

find directory [-name name] [-type type] [-user login] [-date date]

由于 find 命令的选项非常多,最好参考 man

如果未指定搜索目录,find 命令将从当前目录开始搜索。

选项 描述
-perm 权限 按权限搜索文件。
-size 大小 按大小搜索文件。

find 命令的 -exec 选项

可以使用 find 命令的 -exec 选项对每个结果行执行命令。

find /tmp -name *.txt -exec rm -f {} \;

前面的命令搜索 /tmp 目录中所有名为 *.txt 的文件并删除它们。

理解 -exec 选项

在上面的示例中,find 命令将构建一个表示要执行的命令的字符串。

如果 find 命令找到三个名为 log1.txtlog2.txtlog3.txt 的文件,那么 find 命令将通过用搜索结果之一替换字符串 rm -f {} \; 中的大括号来构建字符串,并为每个结果执行此操作。

这将得到

rm -f /tmp/log1.txt ; rm -f /tmp/log2.txt ; rm -f /tmp/log3.txt ;

; 字符是一个特殊的 shell 字符,必须用 \ 进行保护,以防止它被 find 命令(而不是在 -exec 中)过早解释。

技巧

$ find /tmp -name *.txt -delete 执行相同操作。

whereis 命令

whereis 命令搜索与命令相关的文件。

whereis [-b] [-m] [-s] command

示例

$ whereis -b ls
ls: /bin/ls
选项 描述
-b 仅搜索二进制文件。
-m 仅搜索 man 页。
-s 仅搜索源文件。

grep 命令

grep 命令在文件中搜索字符串。

grep [-w] [-i] [-v] "string" file

示例

$ grep -w "root:" /etc/passwd
root:x:0:0:root:/root:/bin/bash
选项 描述
-i 忽略搜索字符串的大小写。
-v 排除包含字符串的行。
-w 搜索精确单词。

grep 命令返回包含您要查找的字符串的整行。

  • ^ 特殊字符用于在行首搜索字符串。
  • $ 特殊字符在行尾搜索字符串。

    grep -w "^root" /etc/passwd
    

注意

此命令功能强大,强烈建议查阅其手册。它有许多变体。

可以使用 -R 选项在文件树中搜索字符串。

grep -R "Virtual" /etc/httpd

元字符(通配符)

元字符在搜索过程中替换一个或多个字符(甚至没有字符)。这些元字符也称为通配符。

它们可以组合使用。

* 字符替换由任何字符组成的字符串。* 字符也可以代表没有字符。

$ find /home -name "test*"
/home/rockstar/test
/home/rockstar/test1
/home/rockstar/test11
/home/rockstar/tests
/home/rockstar/test362

元字符允许通过替换单词的全部或部分来进行更复杂的搜索。只需用这些特殊字符替换未知部分。

? 字符替换单个字符,无论它是什么。

$ find /home -name "test?"
/home/rockstar/test1
/home/rockstar/tests

方括号 [] 用于指定单个字符可以取的值。

$ find /home -name "test[123]*"
/home/rockstar/test1
/home/rockstar/test11
/home/rockstar/test362

注意

始终将包含元字符的单词用 " 括起来,以防止它们被满足条件的文件的名称替换。

警告

不要混淆 shell 元字符和正则表达式元字符。grep 命令使用正则表达式元字符。

重定向和管道

标准输入和输出

在 UNIX 和 Linux 系统上,有三个标准流。它们允许程序通过 stdio.h 库输入或输出信息。

这些流称为 X 通道或 X 文件描述符。

默认情况下

  • 键盘是通道 0 的输入设备,称为stdin
  • 屏幕是通道 1 和 2 的输出设备,称为stdoutstderr

standards channels

stderr 接收命令返回的错误流。其他流被导向 stdout

这些流指向外围文件,但由于 UNIX/Linux 中一切皆文件,I/O 流可以轻松地重定向到其他文件。这个原则是 shell 的强大之处。

输入重定向

可以使用 <<< 字符将输入流重定向到另一个文件。命令将读取文件而不是键盘。

ftp -in serverftp << ftp-commands.txt

注意

只有需要键盘输入的命令才能处理输入重定向。

输入重定向还可以用于模拟用户交互。命令将读取输入流,直到遇到输入重定向后定义的关键字。

此功能用于脚本化交互式命令。

$ ftp -in serverftp << END
user alice password
put file
bye
END

关键字 END 可以替换为任何单词。

$ ftp -in serverftp << STOP
user alice password
put file
bye
STOP

当 shell 收到仅包含关键字的行时,它会退出 ftp 命令。

警告

结束关键字,此处为 ENDSTOP,必须是行中的唯一单词,并且必须位于行首。

标准输入重定向很少使用,因为大多数命令都接受文件名作为参数。

wc 命令可以这样使用

$ wc -l .bash_profile
27 .bash_profile # the number of lines is followed by the file name
$ wc -l < .bash_profile
27 # returns only the number of lines

输出重定向

标准输出可以使用 >>> 字符重定向到其他文件。

简单的 > 重定向会覆盖输出文件的内容。

date +%F > date_file

当使用 >> 字符时,表示命令的输出结果将被追加到文件内容中。

date +%F >> date_file

在这两种情况下,文件在不存在时都会自动创建。

标准错误输出也可以重定向到另一个文件。这次需要指定通道号(通道 0 和 1 可以省略)。

ls -R / 2> errors_file

ls -R / 2>> errors_file

重定向示例

将 2 个输出重定向到 2 个文件

ls -R / >> ok_file 2>> nok_file

将 2 个输出重定向到单个文件

ls -R / >> log_file 2>&1

stderr重定向到“无底洞”(/dev/null

ls -R / 2>> /dev/null

当两个输出流都被重定向时,屏幕上不会显示任何信息。要同时使用输出重定向并保留显示,您需要使用 tee 命令。

管道

管道是一种机制,允许您将第一个命令的标准输出连接到第二个命令的标准输入。

这种通信是单向的,使用 | 符号进行。管道符号 | 通过同时按 Shift+| 键获得。

pipe

管道左侧的命令通过标准输出通道发送的所有数据都被发送到管道右侧命令的标准输入通道。

管道后面特别使用的命令是过滤器。

  • 示例

仅显示开头

ls -lia / | head

仅显示结尾

ls -lia / | tail

对结果进行排序

ls -lia / | sort

计算单词/字符数

ls -lia / | wc

在结果中搜索字符串

ls -lia / | grep fichier

特殊点

tee 命令

tee 命令用于将命令的标准输出重定向到文件,同时保持屏幕显示。

它与 | 管道结合使用,以接收要重定向的命令的输出作为输入。

ls -lia / | tee fic

cat fic

-a 选项是将内容追加到文件而不是覆盖。

aliasunalias 命令

使用别名是一种让 shell 记住特定命令及其选项并为其命名的方式。

例如

ll

将替换命令

ls -l

alias 命令列出当前会话的别名。Linux 发行版默认设置了别名。这里是 Rocky 服务器的别名。

$ alias
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

别名仅临时定义,在用户会话期间有效。

要永久使用,必须在以下文件中创建它们:

  • 用户登录目录下的 .bashrc 文件;
  • 所有用户的 /etc/bashrc 文件。

警告

使用别名时必须格外小心,这可能很危险!例如,在管理员不知情的情况下设置的别名

alias cd='rm -Rf'

unalias 命令允许您删除别名。

要删除单个别名

unalias ll

删除所有别名

unalias -a

要临时禁用别名,可以使用 \<alias name> 的组合。

例如,如果我们这样做

type ls

它可能会返回以下内容

ls is an alias to « ls -rt »

现在已知这一点,我们可以通过执行以下命令来查看使用别名或一次禁用它的结果(使用 \)。

$ ls file*   # order by time
file3.txt  file2.txt  file1.txt
$ \ls file*  # order by name
file1.txt  file2.txt  file3.txt

别名和有用函数

  • grep 别名。

grep 命令的结果添加颜色:alias grep='grep --color=auto'

  • mcd 函数

通常需要创建一个文件夹然后进入该文件夹:mcd() { mkdir -p "$1"; cd "$1"; }

  • cls 函数

移动到一个文件夹并列出其内容:cls() { cd "$1"; ls; }

  • backup 函数

创建文件备份副本:backup() { cp "$1"{,.bak}; }

  • extract 函数

提取任何类型的存档

extract () {
  if [ -f $1 ] ; then
    case $1 in
      *.tar.bz2) tar xjf $1 ;;
      *.tar.gz) tar xzf $1 ;;
      *.bz2) bunzip2 $1 ;;
      *.rar) unrar e $1 ;;
      *.gz) gunzip $1 ;;
      *.tar) tar xf $1 ;;
      *.tbz2) tar xjf $1 ;;
      *.tgz) tar xzf $1 ;;
      *.zip) unzip $1 ;;
      *.Z) uncompress $1 ;;
      *.7z) 7z x $1 ;;
      *)
        echo "'$1' cannot be extracted via extract()" ;;
    esac
  else
    echo "'$1' is not a valid file"
  fi
}
  • 如果 alias cmount 返回以下内容:alias cmount="mount | column -t"

然后我们可以使用 cmount 以这种方式显示所有系统挂载:[root]# cmount

这将以以下格式返回我们的挂载文件系统

/dev/simfs  on  /                                          type  simfs        (rw,relatime,usrquota,grpquota)
proc        on  /proc                                      type  proc         (rw,relatime)
sysfs       on  /sys                                       type  sysfs        (rw,relatime)
none        on  /dev                                       type  devtmpfs     (rw,relatime,mode=755)
none        on  /dev/pts                                   type  devpts       (rw,relatime,mode=600,ptmxmode=000)
none        on  /dev/shm                                   type  tmpfs        (rw,relatime)
none        on  /proc/sys/fs/binfmt_misc                   type  binfmt_misc  (rw,relatime)

分号(;)字符

; 字符将命令串联起来。

用户按下 Enter 键后,所有命令将按输入顺序依次运行。

ls /; cd /home; ls -lia; cd /

检验您的知识

✔ Linux 下的用户定义是什么?(7 个答案)

✔ 命令的长选项有什么特点?

✔ 哪些命令允许您搜索命令帮助?

  • google
  • chuck --norris
  • 信息
  • apropos
  • whatis

✔ 哪个命令可以查看用户的历史记录?

✔ 哪个命令可以在文件中搜索文本?

  • find
  • grep

✔ 哪个命令可以搜索文件?

  • find
  • grep

✔ 哪个命令将命令的错误流重定向到新的 errors.log 文件?

  • ls -R / 2> errors.log
  • ls -R / 2>> errors.log
  • ls -R / 2> errors.log 2>&1

作者:Antoine Le Morvan

贡献者:Steven Spencer, Aditya Putta, tianci li, Grammaresque, Ganna Zhyrnova