Linux 用户的 advanced 命令¶
一旦您熟悉基本命令, advanced 命令就可以在更专业的情况下提供更大的自定义和控制。
**目标**: 在本章中,未来的 Linux 管理员将学习
上一章中没有涵盖的一些有用命令。
一些 advanced 命令。
**用户命令**, **Linux**
**知识**:
**复杂度**:
**阅读时间**: 20 分钟
uniq
命令¶
uniq
命令是一个非常强大的命令,与 sort
命令一起使用,尤其适用于日志文件分析。它允许您通过删除重复项来排序和显示条目。
为了说明 uniq
命令的工作原理,让我们使用一个名为 firstnames.txt
的文件,其中包含一个名字列表。
antoine
xavier
steven
patrick
xavier
antoine
antoine
steven
注意
uniq
要求输入文件在运行之前进行排序,因为它只比较连续的行。
如果没有参数,uniq
命令将不会显示在 firstnames.txt
文件中彼此相邻的相同行。
$ sort firstnames.txt | uniq
antoine
patrick
steven
xavier
要仅显示只出现一次的行,请使用 -u
选项。
$ sort firstnames.txt | uniq -u
patrick
相反,要仅显示在文件中至少出现两次的行,请使用 -d
选项。
$ sort firstnames.txt | uniq -d
antoine
steven
xavier
要简单地删除只出现一次的行,请使用 -D
选项。
$ sort firstnames.txt | uniq -D
antoine
antoine
antoine
steven
steven
xavier
xavier
最后,要计算每行的出现次数,请使用 -c
选项。
$ sort firstnames.txt | uniq -c
3 antoine
1 patrick
2 steven
2 xavier
$ sort firstnames.txt | uniq -cd
3 antoine
2 steven
2 xavier
xargs
命令¶
xargs
命令允许从标准输入构建和执行命令行。
xargs
命令从标准输入读取以空格或换行符分隔的参数,并使用初始参数和从标准输入读取的参数执行命令(默认情况下为 /bin/echo
)一次或多次。
第一个最简单的示例将是以下内容。
$ xargs
use
of
xargs
<CTRL+D>
use of xargs
xargs
命令等待来自标准 stdin 输入的输入。输入三行。用户输入的结束通过按键序列 Ctrl+D 指定给 xargs
。然后,xargs
执行默认命令 echo
,后跟三个参数,对应于用户输入,即
$ echo "use" "of" "xargs"
use of xargs
可以指定一个命令由 xargs
运行。
在以下示例中,xargs
将在标准输入中指定的文件夹集上运行命令 ls -ld
$ xargs ls -ld
/home
/tmp
/root
<CTRL+D>
drwxr-xr-x. 9 root root 4096 5 avril 11:10 /home
dr-xr-x---. 2 root root 4096 5 avril 15:52 /root
drwxrwxrwt. 3 root root 4096 6 avril 10:25 /tmp
在实践中,xargs
命令执行了 ls -ld /home /tmp /root
命令。
如果要执行的命令不接受多个参数,例如 find
命令,会发生什么?
$ xargs find /var/log -name
*.old
*.log
find: paths must precede expression: *.log
xargs
命令试图使用 -name
选项后的多个参数执行 find
命令,这会导致 find
生成错误。
$ find /var/log -name "*.old" "*.log"
find: paths must precede expression: *.log
在这种情况下,必须强制 xargs
命令多次执行 find
命令(每输入一行一次)。-L
选项后跟一个整数允许您指定一次最多处理的条目数。
$ xargs -L 1 find /var/log -name
*.old
/var/log/dmesg.old
*.log
/var/log/boot.log
/var/log/anaconda.yum.log
/var/log/anaconda.storage.log
/var/log/anaconda.log
/var/log/yum.log
/var/log/audit/audit.log
/var/log/anaconda.ifcfg.log
/var/log/dracut.log
/var/log/anaconda.program.log
<CTRL+D>
要在同一行上指定两个参数,请使用 -n 1
选项。
$ xargs -n 1 find /var/log -name
*.old *.log
/var/log/dmesg.old
/var/log/boot.log
/var/log/anaconda.yum.log
/var/log/anaconda.storage.log
/var/log/anaconda.log
/var/log/yum.log
/var/log/audit/audit.log
/var/log/anaconda.ifcfg.log
/var/log/dracut.log
/var/log/anaconda.program.log
<CTRL+D>
基于搜索的 tar
备份的案例研究。
$ find /var/log/ -name "*.log" -mtime -1 | xargs tar cvfP /root/log.tar
$ tar tvfP /root/log.tar
-rw-r--r-- root/root 1720 2017-04-05 15:43 /var/log/boot.log
-rw-r--r-- root/root 499270 2017-04-06 11:01 /var/log/audit/audit.log
xargs
命令的特殊之处在于它将输入参数放在调用的命令的末尾。这与上面的示例非常有效,因为传入的文件将构成要添加到存档中的文件列表。
以cp
命令为例,要复制目录中的一系列文件,需要将这些文件添加到命令的末尾... 但cp
命令在命令末尾期望的是目标位置。为此,使用-I
选项将输入参数放在行末之外。
find /var/log -type f -name "*.log" | xargs -I % cp % /root/backup
-I
选项允许您指定一个字符(在上面的示例中为%
字符),将xargs
的输入文件放在该字符的位置。
yum-utils
软件包¶
yum-utils
软件包是一组由不同作者为yum
构建的工具,使使用yum
更加容易和强大。
注意
虽然在 Rocky Linux 8 中yum
已被dnf
取代,但软件包名称仍然是yum-utils
,尽管它也可以安装为dnf-utils
。这些是经典的 YUM 工具,在 DNF 之上实现为 CLI shim,以保持与yum-3
的向后兼容性。
以下是一些这些工具的示例。
repoquery
命令¶
repoquery
命令用于查询存储库中的软件包。
使用示例
- 显示软件包的依赖项(可以是已安装或未安装的软件包),相当于
dnf deplist <package-name>
repoquery --requires <package-name>
- 显示已安装软件包提供的文件(不适用于未安装的软件包),相当于
rpm -ql <package-name>
$ repoquery -l yum-utils
/etc/bash_completion.d
/etc/bash_completion.d/yum-utils.bash
/usr/bin/debuginfo-install
/usr/bin/find-repos-of-install
/usr/bin/needs-restarting
/usr/bin/package-cleanup
/usr/bin/repo-graph
/usr/bin/repo-rss
/usr/bin/repoclosure
/usr/bin/repodiff
/usr/bin/repomanage
/usr/bin/repoquery
/usr/bin/reposync
/usr/bin/repotrack
/usr/bin/show-changed-rco
/usr/bin/show-installed
/usr/bin/verifytree
/usr/bin/yum-builddep
/usr/bin/yum-config-manager
/usr/bin/yum-debug-dump
/usr/bin/yum-debug-restore
/usr/bin/yum-groups-manager
/usr/bin/yumdownloader
…
yumdownloader
命令¶
yumdownloader
命令从存储库下载 RPM 软件包。相当于dnf download --downloadonly --downloaddir ./ package-name
注意
此命令非常有用,可以快速构建几个 rpm 的本地存储库!
示例:yumdownloader
将下载samba rpm 软件包及其所有依赖项
$ yumdownloader --destdir /var/tmp --resolve samba
or
$ dnf download --downloadonly --downloaddir /var/tmp --resolve samba
选项 | 注释 |
---|---|
--destdir | 下载的软件包将存储在指定的文件夹中。 |
--resolve | 还会下载软件包依赖项。 |
psmisc
软件包¶
psmisc
软件包包含用于管理系统进程的工具
pstree
:pstree
命令以树状结构显示系统上的当前进程。killall
:killall
命令向所有按名称识别的进程发送终止信号。fuser
:fuser
命令识别使用指定文件或文件系统的进程的PID
。
示例
$ pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
├─agetty
├─auditd───{auditd}
├─crond
├─dbus-daemon───{dbus-daemon}
├─firewalld───{firewalld}
├─lvmetad
├─master─┬─pickup
│ └─qmgr
├─polkitd───5*[{polkitd}]
├─rsyslogd───2*[{rsyslogd}]
├─sshd───sshd───bash───pstree
├─systemd-journal
├─systemd-logind
├─systemd-udevd
└─tuned───4*[{tuned}]
# killall httpd
杀死(选项-k
)访问/etc/httpd/conf/httpd.conf
文件的进程
# fuser -k /etc/httpd/conf/httpd.conf
watch
命令¶
watch
命令定期执行命令并在终端的完整屏幕中显示结果。
-n
选项允许您指定每次执行命令之间的时间间隔(秒)。
注意
要退出watch
命令,您必须输入以下按键:Ctrl+C以终止进程。
示例
- 每 5 秒显示
/etc/passwd
文件的末尾
watch -n 5 tail -n 3 /etc/passwd
结果
Every 5.0s: tail -n 3 /etc/passwd rockstar.rockylinux.lan: Thu Jul 1 15:43:59 2021
sssd:x:996:993:User for sssd:/:/sbin/nologin
chrony:x:995:992::/var/lib/chrony:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
- 监视文件夹中的文件数量
watch -n 1 'ls -l | wc -l'
- 显示时钟
watch -t -n 1 date
install
命令¶
与它的名字可能暗示的相反,install
命令不用于安装新软件包。
此命令结合了文件复制(cp
)和目录创建(mkdir
),以及权限管理(chmod
、chown
)和其他有用的功能(如备份)。
install source dest
install -t directory source [...]
install -d directory
选项
选项 | 备注 |
---|---|
-b 或 --backup[=suffix] | 创建目标文件的备份 |
-d | 将参数视为目录名称 |
-D | 在将 SOURCE 复制到 DEST 之前创建所有前导组件 |
-g 和 -o | 设置所有权 |
-m | 设置权限 |
-p | 保留源文件的日期时间戳 |
-t | 将所有源参数复制到目录 |
注意
有一些用于管理 SELinux 上下文的选项(请参阅手册页)。
示例
使用-d
选项创建目录
install -d ~/samples
将文件从源位置复制到目录
install src/sample.txt ~/samples/
这两个命令可以用一个命令执行
$ install -v -D -t ~/samples/ src/sample.txt
install: creating directory '~/samples'
'src/sample.txt' -> '~/samples/sample.txt'
此命令已经节省了时间。将它与所有者、所有者组和权限管理相结合,以提高时间节省
sudo install -v -o rocky -g users -m 644 -D -t ~/samples/ src/sample.txt
注意
在这种情况下,需要sudo
来进行属性更改。
您还可以使用-b
选项创建现有文件的备份
$ install -v -b -D -t ~/samples/ src/sample.txt
'src/sample.txt' -> '~/samples/sample.txt' (archive: '~/samples/sample.txt~')
如您所见,install
命令创建了一个备份文件,并在原始文件名后附加了~
波浪号。
可以使用-S
选项指定后缀
$ install -v -b -S ".bak" -D -t ~/samples/ src/sample.txt
'src/sample.txt' -> '~/samples/sample.txt' (archive: '~/samples/sample.txt.bak')
tree
命令¶
以树状方式展开目录中的文件或目录。
选项 | 描述 |
---|---|
-a | 列出所有文件 |
-h | 以更人性化的方式打印大小 |
-u | 显示文件所有者或 UID 号码 |
-g | 显示文件组所有者或 GID 号码 |
-p | 打印每个文件的保护信息 |
例如
$ tree -hugp /etc/yum.repos.d/
/etc/yum.repos.d/
├── [-rw-r--r-- root root 1.6K] epel-modular.repo
├── [-rw-r--r-- root root 1.3K] epel.repo
├── [-rw-r--r-- root root 1.7K] epel-testing-modular.repo
├── [-rw-r--r-- root root 1.4K] epel-testing.repo
├── [-rw-r--r-- root root 710] Rocky-AppStream.repo
├── [-rw-r--r-- root root 695] Rocky-BaseOS.repo
├── [-rw-r--r-- root root 1.7K] Rocky-Debuginfo.repo
├── [-rw-r--r-- root root 360] Rocky-Devel.repo
├── [-rw-r--r-- root root 695] Rocky-Extras.repo
├── [-rw-r--r-- root root 731] Rocky-HighAvailability.repo
├── [-rw-r--r-- root root 680] Rocky-Media.repo
├── [-rw-r--r-- root root 680] Rocky-NFV.repo
├── [-rw-r--r-- root root 690] Rocky-Plus.repo
├── [-rw-r--r-- root root 715] Rocky-PowerTools.repo
├── [-rw-r--r-- root root 746] Rocky-ResilientStorage.repo
├── [-rw-r--r-- root root 681] Rocky-RT.repo
└── [-rw-r--r-- root root 2.3K] Rocky-Sources.repo
0 directories, 17 files
stat
命令¶
stat
命令显示文件或文件系统的状态。
$ stat /root/anaconda-ks.cfg
File: /root/anaconda-ks.cfg
Size: 1352 Blocks: 8 IO Block: 4096 regular file
Device: 10302h/66306d Inode: 2757097 Links: 1
Access: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2024-01-20 13:04:57.012033583 +0800
Modify: 2023-09-25 14:04:48.524760784 +0800
Change: 2024-01-24 16:37:34.315995221 +0800
Birth: 2
文件
- 显示文件的路径位置。大小
- 以字节为单位显示文件大小。如果是目录,则显示目录名称占用的固定 4096 字节。块
- 显示已分配的块数。请注意!此命令中每个块的大小为 512 字节。ls -ls
中每个块的默认大小为 1024 字节。设备
- 十进制或十六进制表示的设备号。inode
- inode 是 Linux 内核分配给文件或目录的唯一 ID 号。链接
- 硬链接的数量。硬链接有时被称为物理链接。访问
- 文件和目录的最后访问时间,即 GNU/Linux 中的atime
。修改
- 文件和目录的最后修改时间,即 GNU/Linux 中的mtime
。更改
- 属性最后更改的时间,即 GNU/Linux 中的ctime
。出生
- 出生时间(创建时间)。在某些文档中,它缩写为btime
或crtime
。您需要高于某个版本的系统文件和内核版本才能显示创建时间。
对于文件
atime - 使用cat
、less
、more
和head
等命令访问文件内容后,可以更新文件的atime
。请注意!文件的atime
不会实时更新,出于性能考虑,它需要等待一段时间才能显示。 mtime - 修改文件内容会更新文件的mtime
(例如,通过重定向追加或覆盖文件内容),因为文件大小是文件的属性,ctime
也会同时更新。 ctime - 更改文件的拥有者、组、权限、文件大小和链接(软链接和硬链接)会更新 ctime。
对于目录
atime - 使用cd
命令进入之前从未访问过的新目录后,可以更新并修复该目录的atime
。 mtime - 在该目录中执行创建、删除和重命名文件等操作会更新目录的mtime
和ctime
。 ctime - 当目录的权限、所有者、组等发生更改时,目录的ctime
将被更新。
提示
- 如果创建新的文件或目录,其
atime
、mtime
和ctime
完全相同 - 如果修改文件内容,文件的
mtime
和ctime
将不可避免地被更新。 - 如果在目录中创建全新的文件,则该目录的
atime
、ctime
和mtime
将同时更新。 - 如果目录的
mtime
被更新,则该目录的ctime
也必须被更新。