跳转至

针对Linux用户的命令

在本章中,您将学习如何使用Linux中的命令。


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

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

🏁 用户命令, linux

知识: ⭐
复杂度: ⭐

阅读时间: 40 分钟


概论

现代的 Linux 系统配备有专门用于协助管理员工作的图形工具。 但是,能够使用命令行模式也是很重要的,原因如下:

  • 大多数系统命令对于所有Linux发行版都是通用的,而图形工具则不是这样。
  • 可能发生的情况是——系统不能正确启动,但备份的命令解释器仍然可以被访问。
  • 远程管理是通过在 SSH 终端下的命令行完成的。
  • 为了保留服务器资源,图形界面要么不安装,要么按需启动。
  • 管理工作是由脚本完成的。

学习这些命令可以让系统管理员通过一个 Linux 终端来管理服务器的资源、文件,识别站点、终端和已连接的用户等等。

用户

在 Linux系统中,用户是通过 /etc/passwd 文件中的以下条目定义的:

  • 登录名,更普遍的叫法是 “用户名”,不含有空格;
  • 数字标识符 : UID (用户标识符);
  • 用户组标识符:GID (用户组标识符);
  • 命令解释器(shell),不同用户可以不同;
  • 连接目录家目录

在其他文件中,用户由以下条目定义:

  • 密码,它会在储存之前被加密 (/etc/shadow);
  • 命令提示符,或登录__提示符__, # 代表管理员,$ 代表其他用户 (/etc/profile)。

取决于系统执行的安全策略,密码必须包含一定数量的字符,并满足某些复杂度的要求。

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

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

一个工作站类型的安装 (带有图形界面) 将在终端 1 上开启此界面。 Linux是多用户的,可以在不同的物理终端(TTY) 或虚拟终端(PTS) 上连接多个用户。 虚拟终端可以在图形化环境中使用。 一个用户可以通过 Alt + FxCTRL + Alt + Fx 来切换物理终端。

shell

一旦用户连接到控制台,shell就会显示命令prompt。 然后,在输入每条语句时,它的表现就像一个无限循环:

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

CTRL + C两个按键用于中断正在运行的命令。

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

command [option(s)] [arguments(s)]

命令的名称 通常为小写

每一项都用空格隔开。

短选项以破折号开头(-l),而长选项以两个破折号(--list)开头。 双破折号(--)表示选项列表的结尾。

可以将一些短选项组合在一起,例如:

$ ls -l -i -a

等同于:

$ ls -lia

当然,在选项后面可以跟几个对象:

$ ls -lia /etc /home /var

在文献资料中,术语 "option"(选项) 相当于术语"parameter"(参数),这在编程中更常用。 选项或参数的可选部分用方括号括起来 —— []。 当可能有多个选项时,一个称为 "管道" 的垂直条将它们分隔开来 [a|e|i]

常规命令

aproposwhatisman 命令

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

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读取(“手册是你的朋友”)。 这套手册分为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

将告知用户 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 -c选项将删除当前会话的历史记录(但不会删除.bash_history文件中的内容)。
  • 操作历史:

要操作历史记录,从命令提示符中输入以下命令即可:

键盘输入 功能
!! 调出最后使用的命令。
!n 根据该命令在列表中的编号重新调用该命令。
!string 调出以字符串开头的最近的命令。
调出以字符串开头的最近的命令。
调出以字符串开头的最近的命令。

命令自动补全

自动补全也可以为你提供很好的帮助。

  • 它允许你完成命令、输入路径或文件名的补全。
  • 如果是单一的补全,按一下TAB键就完成了输入补全。
  • 否则,将需要按二次TAB键才能获得可能性列表。

如果双击Tab键没有引起系统反应,则当前没有完成自动补全。

显示和标识

clear 命令

clear 命令表示清除终端屏幕的内容, 事实上更准确地说——它改变了显示方式,使命令提示符位于屏幕第一行的顶部。

在终端中,过往历史命令的输出内容将永久隐藏,而在图形界面中,滚动条将允许你回到虚拟终端的历史记录中去。

提示

CTRL + L 快捷键与 clean 命令具有相同的效果

echo 命令

echo 命令用来输出字符串内容。

此命令最常在管理脚本中使用,用于在执行期间通知用户。

-n 选项表示不换行输出(默认情况下,换行输出字符串)。

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

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

由于各种原因,脚本开发人员可能需要使用特殊的转义符(以\字符开始)。 在这种情况下,使用 -e 选项,从而允许对转义符进行解释。

在常用的转义符中,我们提到的有:

转义符 结果
\a 发出警告声
\b 退格,删除前一个字符
\n 添加换行符,光标移动到下一行的行首
\t 添加一个tab
\v 换行,但是光标的位置不变,即上一行在什么位置,下一行还是一样的位置。

date 命令

date 命令用来显示日期和时间。 该命令具有以下语法:

date [-d AAAAMMJJ] [format]

示例:

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

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

警告

日期的格式可能会根据环境变量$LANG中定义的语言值而变化。

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

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

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

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

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

date -s "[AA]AA-MM-JJ hh:mm:[ss]"

idwhowhoami命令

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

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

-g-G-n-u选项分别表示显示主组GID、附加组GID、名称而不是数字标识符、用户的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选项显示运行级别(参见"startup"篇章)。

文件树

在Linux当中,文件树是一棵倒置的树,我们叫它 单一层次树,根目录为/

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

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

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

一个绝对路径通过遍历整个树到文件级,从根目录上引用文件:

  • /home/groupA/alice/file

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

  • ../alice/file

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

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

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

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

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

我们的示例树

在上面的示例中,我们希望提供文件myfile在bob目录中的位置。

  • 通过绝对路径的方式,当前目录无关紧要。 我们从根目录开始,一直到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 -l命令以列的形式显示文件的垂直列表和附加信息。

但是,ls命令有很多选项(见man):

选项 信息
-d 显示有关目录的信息,而不是列出其内容。
-g 显示UID和GID,而非其对应名称。
-h 以最合适的格式显示文件大小(字节、千字节、兆字节、千兆字节等)。 h 表示站在人类角度的可读性。
-s 显示文件占用的块数量。 一个块等于 400K。
-A 显示目录中除...之外的所有文件
-R 递归显示子目录的内容。
-F 显示文件的类型。 为目录打印/,为执行文件打印*,为符号链接打印@,对文本文件不打印任何内容。
-X 根据文件的扩展名对文件进行排序。
  • 列的说明:
$ ls -lia /home
78489 drwx------ 4 rockstar rockstar 4096 25 oct. 08:10 rockstar
信息
78489 文件序列号。
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
  • 列出/var目录下大于1 MB但小于1 GB的文件:
$ ls -lhR  /var | grep \- | grep [1-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

必须存在 "rockstar" 目录才能创建 "work" 目录。

否则,应使用-p选项。 -p选项会创建父目录(如果父目录不存在的话)。

危险

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

touch命令

ouch命令用来更改文件的时间戳,或者如果文件不存在,则创建一个空文件。

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命令本身在删除文件时不会被询问。 然而,对于RedHat/Rocky发行版,rm会询问是否要删除,因为rm命令是rm-i命令的alias。 如果在另一个发行版上,例如Debian,您不会收到询问请求,请勿感到意外。

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

选项的末尾通过双破折号`--</code向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
`

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 移动到 repext 并重命名为 file2

$ mv file1 file2

file1已重命名为file2

$ mv file1 /repexist

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

$ mv file1 /wrongrep

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

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的特定命令有:

命令 动作
h 帮助。
向上、向下、向右或向左移动。
Enter 下移一行。
Space 向下移动一页。
PgUpPgDn 向上或向下移动一个页面。
ggG 移动到文件的首页或尾页。
/texte 搜索文本。
q 退出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 命令用来显示文件的开头部分。

尾色 [-f] [-n x] 文件
选项 描述
-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命令将对/etc/passwd文件的内容进行排序,这次是从最大的uid到最小的uid。

使用sort命令的一些高级示例:

  • 随机排序值

sort 命令也允许您用 -R 选项来随机排序值:

$ sort -R /etc/passwd
  • 对 IP 地址进行排序

系统管理员很快就会面临处理其服务(如SMTP、VSFTP或Apache)日志中的IP地址的问题。 通常使用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命令知道如何从带有-h选项的ls等命令识别文件大小。

这是文件 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 只搜索手册页。
-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

标准通道

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 + | 获得。

管道

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

管道后使用特别的命令进行过滤筛选

  • 示例:

仅显示开头:

$ 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 /

检测所学知识

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

:heavy_check_mark: 命令的长选项的特点是什么?

:heavy_check_mark: 哪些命令允许您搜索有关命令的帮助?

  • [ ] google
  • [ ] chuck --norris
  • [ ] info
  • [ ] apropos
  • [ ] whatis

:heavy_check_mark: 哪个命令允许您查看用户的历史记录?

:heavy_check_mark: 哪个命令允许您在文件中搜索文本?

  • [ ] find
  • [ ] grep

:heavy_check_mark: 哪个命令允许您搜索文件?

  • [ ] find
  • [ ] grep

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

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

最后更新: May 3, 2022

Author: Antoine Le Morvan

Contributors: Steven Spencer, Aditya Putta, tianci li

回到页面顶部