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+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
、whatis
和 man
命令¶
任何级别的管理员都无法详细了解所有命令和选项。通常为所有已安装的命令提供手册。
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
命令¶
一旦通过 apropos
或 whatis
找到,手册就可以通过 man
(“Man is your friend”) 阅读。这套手册分为 8 个部分,按主题对信息进行分组,默认部分为 1
- 可执行程序或命令。
- 系统调用(内核提供的函数)。
- 库调用(库提供的函数)。
- 特殊文件(通常位于 /dev 中)。
- 文件格式和约定(配置文件,如 etc/passwd)。
- 游戏(如基于字符的应用程序)。
- 杂项(例如 man (7))。
- 系统管理命令(通常仅供 root 使用)。
- 内核例程(非标准)。
有关每个部分的信息可以通过键入 man x intro
来访问,其中 x
是部分号。
命令
man passwd
将告诉管理员有关 passwd 命令、它的选项等信息。而
man 5 passwd
将告诉他有关与该命令相关的文件的信息。
使用箭头 Up 和 Down 在手册中导航。按下 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]"
id
、who
和 whoami
命令¶
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
在上面的示例中,"..
" 指的是当前目录的父目录。
即使是空的目录,也必然包含至少 **两个引用**
.
:指向自身。..
:指向当前目录的父目录。
因此,相对路径可以以 ./
或 ../
开头。当相对路径指的是当前目录中的子目录或文件时,./
通常会被省略。在树中提到第一个 ./
实际上只在运行可执行文件时是必要的。
路径错误会导致很多问题:在错误的位置创建文件夹或文件、意外删除等。因此,强烈建议在输入路径时使用自动完成功能。
在上面的示例中,我们希望给出 bob 目录中 myfile
文件的位置。
- 使用 **绝对路径**,当前目录无关紧要。我们从根目录开始,向下遍历
home
、groupA
、alice
目录,最后到达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 |
以最合适的格式(字节、千字节、兆字节、吉字节...)显示文件大小。 | -s |
以块为单位显示每个文件的分配大小。在 | -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------ )。 |
子目录数量(包括 | rockstar |
子目录数量(包括 | 用户所有权。 |
4096 | 组所有权。 |
对于文件,它显示文件的大小。对于目录,它显示文件命名占用的固定值 4096 字节。要计算目录的总大小,请使用 | 25 oct. 08:10 |
子目录数量(包括 | 最后修改日期。 |
文件名(或目录名)。
注意
**别名** 经常出现在常用的发行版中。
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
选项 | 信息 |
---|---|
| -t date |
将文件的最后修改日期更改为指定日期。
提示
日期格式:[AAAA]MMJJhhmm[ss]
touch
命令主要用于创建空文件,但对于增量备份或差异备份等情况非常有用。实际上,在文件上执行 touch
的唯一效果是强制它在下次备份时保存。
rmdir
命令¶
示例
rmdir /home/rockstar/work
选项 | 信息 |
---|---|
| -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 解释为选项。 |
-i | mv 命令¶ |
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
的内容替换文件的内容。
将 file1
和 file2
移动到 /tmp
目录中。
将 file1
移动到 repexist
并将其重命名为 file2
。
cp file [file ...] destination
示例
cp -r /home/rockstar /tmp
选项 | 信息 |
---|---|
-i | 将 file1 重命名为 file2 。 |
任何文件或目录的删除都是最终的。 | 如果目标目录存在,则将 file1 移动到 /repexist 。 |
| 如果目标目录不存在,则将 file1 在根目录中重命名为 wrongrep 。 |
-r | cp 命令¶ |
以最合适的格式(字节、千字节、兆字节、吉字节...)显示文件大小。 | cp 命令复制文件。 |
cp file1 /repexist/file2
-i
cp file1 file2
如果覆盖,则请求确认(默认值)。
cp file1 /repexist
-f
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 或 H | 帮助。 |
Up Down Right Left | 向上、向下移动一行,或向右或向左移动。 |
Enter | 向下移动一行。 |
Space | 向下移动一页。 |
Page Up 和 Page Down | 向上或向下移动一页。 |
g 和 G | 移动到第一页和最后一页。 |
/text | 搜索文本。 |
q 或 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
命令¶
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.txt
、log2.txt
和 log3.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 |
以最合适的格式(字节、千字节、兆字节、吉字节...)显示文件大小。 | 只搜索手册页。 |
-s
只搜索源文件。
grep [-w] [-i] [-v] "string" file
示例
$ grep -w "root:" /etc/passwd
root:x:0:0:root:/root:/bin/bash
选项 | 描述 |
---|---|
-i | 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
库输入或输出信息。
这些流被称为 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
命令。
警告
结束关键字(这里为END
或STOP
)必须是行上的唯一单词,并且必须位于行的开头。
标准输入重定向很少使用,因为大多数命令接受文件名作为参数。
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
选项将追加到文件,而不是覆盖文件。
alias
和unalias
命令¶
使用别名是让 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