跳过内容

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 用户可以选择其他 shell,例如 Korn Shell (ksh),C Shell (csh) 等等。

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

工作站类型安装(带图形界面)在终端 1 上启动此界面。Linux 是多用户系统,可以将多个用户连接到多个**物理终端** (TTY) 或**虚拟终端** (PTS)。虚拟终端在图形环境中可用。用户使用命令行中的 Alt+FxCtrl+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]

通用命令

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 (“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

将告诉他有关与该命令相关的文件的信息。

使用箭头 UpDown 在手册中导航。按下 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
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]"

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 选项还会显示运行级别(请参阅“启动”一章)。

文件树

在 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(打印工作目录)命令显示当前目录的绝对路径。

$ pwd
/home/rockstar

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

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

cd 命令

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

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

如您在上面的最后一个示例中所见,不带参数的 cd 命令会将当前目录移动到 home 目录

ls 命令

ls 命令显示目录的内容。

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

示例

$ ls /home
.    ..    rockstar

ls 命令的主要选项有

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

但是,ls 命令有很多选项(请参阅 man

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

文件名(或目录名)。

注意

**别名** 经常出现在常用的发行版中。

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

例如,别名 ll

  • ls 命令有很多选项。以下是一些高级用法示例。
$ 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
  • 按最后修改时间顺序列出 /etc 中的文件。
$ 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
...

列出 /var 中大于 1 兆字节但小于 1 吉字节的文件。此示例使用带有正则表达式的 grep 命令。初学者不必过多地纠结,以后会有专门的教程介绍这些正则表达式。

find /var -size +1M -a -size -1024M  -a -type f  -exec ls -lh {} \;
  • 当然,我们强烈建议您使用 find 命令。

显示文件夹的权限

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

要找出文件夹的权限,例如 /etc,以下命令 **不** 适用。

ls -ld /etc
drwxr-xr-x. 69 root root 4096 18 nov.  17:05 /etc
  • 上面的命令将默认显示文件夹(内部)的内容。对于文件夹本身,可以使用 -d 选项。
ls -lhS
  • 按文件大小排序,从最大到最小
$ 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
  • 使用 -l 格式化时间/日期

在文件夹末尾添加 *尾部斜杠*

$ ls -dF /etc
/etc/
  • 默认情况下,ls 命令不会显示文件夹的最后一个斜杠。在某些情况下,例如脚本,显示它们很有用。
ls /etc --hide=*.conf

隐藏某些扩展名

mkdir 命令

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

示例

mkdir /home/rockstar/work

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

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

否则,应使用 -p 选项。-p 选项将在不存在的情况下创建父目录。

危险

不建议使用 Linux 命令名作为目录或文件名。

touch 命令

touch [-t date] file

示例

touch /home/rockstar/myfile
选项信息
touch 命令更改文件的最后修改时间戳,如果文件不存在,则创建空文件。-t date

将文件的最后修改日期更改为指定日期。

提示

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

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

rmdir 命令

示例

rmdir /home/rockstar/work
选项信息
rmdir 命令删除空目录。-p

提示

如果提供的父目录为空,则删除它们。

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

rm 命令

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

否则,应使用 -p 选项。-p 选项将在不存在的情况下创建父目录。

rm 命令删除文件或目录。

选项信息
任何文件或目录的删除都是最终的。-f
-i不要询问是否删除。
-r-i

文件名(或目录名)。

询问是否删除。

-r

删除目录并递归地删除其子目录。

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

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

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

选项的结束用双破折号 -- 表示。

在示例中

mv file [file ...] destination

示例

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

mv /home/rockstar/file1 /home/rockstar/file2 /tmp
选项信息
任何文件或目录的删除都是最终的。硬硬文件名以 - 开头。如果不使用 --,shell 会将 -hard-hard 中的 -d 解释为选项。
-imv 命令

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

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

-f

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

如果覆盖目标文件,不要询问确认。

mv file1 /repexist/file2

-i

mv file1 file2

如果覆盖目标文件,则请求确认(默认值)。

mv file1 /repexist

以下几个具体示例将帮助您了解可能出现的困难。

mv file1 /wrongrep

file1 重命名为 file2。如果 file2 已经存在,则用 file1 的内容替换文件的内容。

file1file2 移动到 /tmp 目录中。

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

cp file [file ...] destination

示例

cp -r /home/rockstar /tmp
选项信息
-ifile1 重命名为 file2
任何文件或目录的删除都是最终的。如果目标目录存在,则将 file1 移动到 /repexist
rmdir 命令删除空目录。如果目标目录不存在,则将 file1 在根目录中重命名为 wrongrep
-rcp 命令
以最合适的格式(字节、千字节、兆字节、吉字节...)显示文件大小。h 代表人类可读。需要与 -l 选项一起使用。cp 命令复制文件。
cp file1 /repexist/file2

-i

cp file1 file2

如果覆盖,则请求确认(默认值)。

cp file1 /repexist

-f

cp file1 /wrongrep

如果目标目录不存在,则将file1wrongrep为名复制到根目录下。

可视化

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帮助。
Up Down Right Left向上、向下移动一行,或向右或向左移动。
Enter向下移动一行。
Space向下移动一页。
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
任何文件或目录的删除都是最终的。实时显示文件中的更改

示例

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 选项,以便按数字字符块的数值排序。

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

$ 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 permissions按权限搜索文件。
-size 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-m
以最合适的格式(字节、千字节、兆字节、吉字节...)显示文件大小。h 代表人类可读。需要与 -l 选项一起使用。只搜索手册页。

-s

只搜索源文件。

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

示例

$ grep -w "root:" /etc/passwd
root:x:0:0:root:/root:/bin/bash
选项描述
-igrep 命令
grep 命令在文件中搜索字符串。-i
-w忽略搜索字符串的大小写。

-v

  • 排除包含该字符串的行。
  • -w

    grep -w "^root" /etc/passwd
    

文件名(或目录名)。

搜索完全匹配的单词。

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

grep -R "Virtual" /etc/httpd

特殊字符 ^ 用于搜索一行开头的字符串。

特殊字符 $ 用于搜索一行末尾的字符串。

这个命令非常强大,强烈建议您查阅它的手册。它有很多衍生命令。

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

$ 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 库输入或输出信息。

standards channels

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

这些流指向外围文件,但由于在 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
  • info
  • 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