Linux常用命令

软件包管理

软件包管理系统dpkgRPM包管理员

软件包管理系统前端:APTYUM

软件包及依赖查询网站

Ubuntu

1
2
3
# 查看依赖
apt-cache depends gnome-core # 正向依赖(查看某个包依赖哪些包)
apt-cache rdepends gnome-core # 反向依赖(查看哪些包依赖这个包)

Centos

1
2
3
# 查看依赖
dnf deplist perl # 正向依赖(查看某个包依赖哪些包)
repoquery --whatrequires perl # 反向依赖(查看哪些包依赖这个包,需要安装 dnf install -y yum-utils

dpkg

https://man.archlinux.org/man/dpkg

1
2
dpkg --help
dpkg -L openssh-server # 显示指定软件包在系统中安装的所有文件和目录的完整路径列表。

apt-get、apt-cache、apt

https://man.archlinux.org/man/apt-get

https://man.archlinux.org/man/apt-cache

https://man.archlinux.org/man/apt

简单来说:

  • apt-get:处理包的安装、升级和移除,是传统的、面向脚本的工具。
  • apt-cache:用于查询本地软件包信息(数据库),例如搜索、查看依赖。
  • apt:是较新的前端工具,结合了 apt-getapt-cache 的最佳功能,并提供了更美观、更友好的用户体验。

三个 APT 工具的详细对比

工具 主要功能/定位 典型命令示例 特点总结
apt-get 核心操作:负责从软件源获取和安装软件包,处理实际的系统更改。传统工具,适合脚本编写。 apt-get install <package> apt-get remove <package> apt-get update apt-get upgrade 面向底层:输出信息相对简单,没有进度条。是 APT 工具家族中历史最悠久、功能最稳定的工具。
apt-cache 查询操作:负责查询本地缓存的软件包数据库(Metadata)。它不会更改系统或下载软件包。 apt-cache search <keyword> apt-cache show <package> apt-cache depends <package> 信息获取:仅用于搜索和显示软件包信息、依赖关系等。是用户了解软件包情况的强大工具。
apt 用户界面:结合了 apt-getapt-cache 的常用功能。推荐日常使用的现代工具。 apt install <package> apt remove <package> apt update apt upgrade apt search <keyword> 用户友好:提供美观的进度条、颜色高亮和更简洁的输出。它不是要取代 apt-get,而是提供一个更好的用户界面。

rpm

https://man.archlinux.org/man/rpm

1
rpm -ql openssh-server # 列出软件包中的文件。显示指定软件包在系统中安装的所有文件和目录的完整路径列表。

dnf/yum

https://man.archlinux.org/man/extra/dnf/dnf4

https://man.archlinux.org/man/extra/dnf5/dnf5

dnfyum 的改进和取代者。

1
dnf --version

查看系统安装了哪些软件包

查看软件包依赖了哪些包

查看软件包依赖了哪些动态库

查看软件包安装了哪些文件

查看文件来自哪个软件包

iptables

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# REDIRECT 是 DNAT 的一种特例,用于将流量“重定向”到本机的某个端口。它会把数据包的 目标 IP 改为本机 IP,并可选地修改目标端口。方向:外部 → 本机。常用场景:本机透明代理、流量重定向/端口转发、本机端口劫持。
# DNAT 改变数据包的目标地址和目标端口,使外部访问被转发到内网主机(入站端口映射)。方向:外部 → 内部。常见场景:外部访问内网服务(端口映射)、公网访问转发到私网服务器。
# SNAT(Source NAT)用于修改数据包的源IP(和可选的源端口),使外部服务器认为请求来自指定的公网IP。方向:内部 → 外部。常见场景:内网主机访问外网时共享一个公网IP、多网卡服务器的流量伪装、NAT 路由器出站流量转换。

# 若忽略出站入栈网卡,则作用于所有网卡流量
iptables -t nat -A PREROUTING -i ens33 -p tcp --dport 8989 -j REDIRECT --to-port 22 #
iptables -t nat -A PREROUTING -i ens33 -p tcp --dport 8989 -j DNAT --to-destination 192.168.0.7:22 #
iptables -t nat -A POSTROUTING -o ens33 -s 192.168.0.0/24 -j SNAT --to-source 114.114.114.114 # 内网 192.168.0.0/24 子网的主机访问外网时,源地址被替换为公网IP 114.114.114.114。

# 查看 NAT 表 (nat table) 中 PREROUTING 链 的所有规则,并以数字形式显示(不反查 DNS / 服务名)。
# -t nat 指定 NAT 表(专门处理地址转换,DNAT/SNAT/REDIRECT)
# -L 列出(List)该表中指定链的所有规则
# PREROUTING 指定要查看的链(chain)。PREROUTING 用于入站数据包,包到达本机前触发。
# -n 以数字方式显示 IP 和端口,不反查域名或服务名(更快更准确)
# --line-numbers 给每条规则显示一个编号,便于删除或修改特定规则
iptables -t nat -L PREROUTING -n --line-numbers

iptables -t nat -D PREROUTING 1 # 根据行号删除规则
iptables -t nat -D PREROUTING -i ens33 -p tcp --dport 8989 -j REDIRECT --to-port 22 # 按规则内容删除规则

流编辑器——sed

Sed 是一款非常强大且常用的 流编辑器(Stream Editor),非常适合做批量的替换、删除、插入、打印等文本变换。

简介与工作原理

  • 流编辑器: Sed 一次只处理一行内容。
  • 工作空间: Sed 处理文件时,会将当前处理的行读入一个临时缓冲区,称为 “模式空间” (pattern space)
  • 处理流程: Sed 命令会对模式空间中的内容进行处理,处理完成后,默认会将模式空间的内容输出到标准输出(屏幕)。接着清空模式空间,读取下一行,重复上述过程,直到文件末尾。
  • 非破坏性: 默认情况下,Sed 不会修改原文件内容,而是将结果输出到标准输出,除非使用重定向或特定的选项(如 -i)来保存更改。

sed 常用语法格式

最基本的 Sed 命令格式如下:

1
2
3
sed [选项] 'sed命令' 文件名
#
sed [选项] -f 脚本文件 文件名

常用选项 (Options)

选项 作用
-n 静默模式(或安静模式)。默认 Sed 会打印所有行,使用此选项后,只有被显式命令(如 p 打印命令)处理的行才会被打印。
-e 允许多个 Sed 命令/脚本。例如:sed -e 'command1' -e 'command2' file
-f 指定 Sed 脚本文件。例如:sed -f script.sed file
-i 直接修改原文件。这个选项非常重要,但使用时要小心,最好先备份文件。

地址(Address)

Sed 命令可以指定一个地址或一个地址范围,以限制命令的作用范围。

地址格式 作用 示例
无地址 作用于文件中的所有行 's/old/new/'
单行号 作用于指定的行 '5d' (删除第 5 行)
$ 代表文件的最后一行 '$d' (删除最后一行)
/regex/ 作用于匹配正则表达式的行。这是查找命令 '/error/d' (删除包含 “error” 的行)
地址范围 作用于从起始地址到结束地址之间的行(包含边界)。
addr1,addr2 1,5d (删除第 1 到 5 行)
addr1,/regex/ 3,/end/d (删除第 3 行到第一个匹配 /end/ 的行)
/regex1/,/regex2/ /start/,/end/d (删除第一个匹配 /start/ 到第一个匹配 /end/ 的行)

sed 常用命令 (Commands)

sed 命令通常紧跟在地址后面。

替换:s (substitute)

这是 sed 最常用、最强大的功能。

  • 格式: [地址]s/旧字符串/新字符串/标志
  • 示例:
    • s/foo/bar/:将每行中第一个 foo 替换为 bar
    • s/foo/bar/g全局替换,将行中所有 foo 替换为 bar
    • s/foo/bar/p:打印发生替换的行。通常配合 -n 选项使用。
    • s/foo/bar/w output.txt:将发生替换的行写入 output.txt 文件。
    • s#/#\\/#g:当替换内容或目标字符串中包含 / 时,可以使用其他分隔符,例如 #详见下文 sed 命令分隔符

删除:d (delete)

  • 格式: [地址]d
  • 示例:
    • 3d:删除第 3 行。
    • 1,5d:删除第 1 到 5 行。
    • /^#/d:删除以 # 开头的行 (常用于删除注释行)。
    • '/^$/d':删除所有空行。

打印:p (print)

  • 格式: [地址]p
  • 用途: 配合 -n 选项,只打印指定的行或匹配的行。
  • 示例:
    • sed -n '5p' file:只打印第 5 行。
    • sed -n '/config/p' file:只打印包含 config 关键字的行。
    • sed -n '1,10p' file:只打印前 10 行。

追加/插入/更改:a / i / c

  • a (append): 在匹配行之后追加新文本。
    • 示例: '/error/a\--- An Error Occurred ---' (在包含 error 的行后面追加文本)
  • i (insert): 在匹配行之前插入新文本。
    • 示例: '1i\# This is a header' (在文件第一行前插入一行)
  • c (change): 用新文本替换匹配行或匹配范围的所有内容。
    • 示例: '3c\Replacement Text' (用新文本替换第 3 行)

注意: aic 命令后的文本必须换行书写(在命令行中通常用 \ 来转义换行符,或者直接跟在命令后,用 \ 隔开)。

sed 命令分隔符

分隔符(delimiter)在 sed 命令中主要用于 替换命令查找命令 / ,尤其是涉及到正则表达式的部分。默认是 /

替换命令 (s)

这是最常见的使用自定义分隔符的场景。

  • 基本格式: s/查找模式/替换字符串/标志
  • 使用自定义分隔符的格式: sX查找模式X替换字符串X标志
    • 这里的 X 可以是任何非空格、非换行符的单个字符。
示例命令 分隔符 场景说明
s#/var/log#/tmp/log#g # 当查找或替换的内容中包含 / 时(例如文件路径),使用 # 可以避免对 / 进行转义。
s@^#@ @ @ 当查找或替换的内容中包含 # 时(例如配置文件中的注释),可以使用 @

查找/地址命令 (/regex/)

分隔符也可以用于定义地址(即指定 Sed 命令作用的行范围)。当您需要查找的模式中包含默认分隔符 / 时,可以自定义分隔符。

  • 基本格式: /正则表达式/命令
  • 使用自定义分隔符的格式: \X正则表达式X命令
    • 注意: 在自定义分隔符前需要加上反斜杠 \
示例命令 分隔符 场景说明
/\//d / (默认) 删除包含默认分隔符 / 的行,但需要转义 (\/)。
sed '\#/home/#d' file # (自定义) 删除包含 /home/ 路径的行,无需转义路径中的 /,但需在开头用 \ 声明自定义分隔符。

进阶示例

组合多个命令

使用 -e 选项或分号 ;

1
2
3
4
# 删除空行,并将所有的 'old' 替换为 'new'
sed -e '/^$/d' -e 's/old/new/g' file.txt
# 或者使用分号
sed '/^$/d ; s/old/new/g' file.txt

括号分组和后向引用

在替换命令 s 中,可以使用括号 () 对匹配模式的一部分进行分组,并在替换字符串中用 \1, \2, … 进行引用。注意: 括号需要用 \ 进行转义,即 \(\)

  • 示例: 交换行中两个单词的位置。
1
2
3
# 假设一行内容是 "apple banana"
# 将其转换为 "banana apple"
echo "apple banana" | sed 's/\(apple\) \(banana\)/\2 \1/'
  • \(apple\) 匹配并捕获第一个单词,标记为 \1
  • \(banana\) 匹配并捕获第二个单词,标记为 \2
  • 替换字符串 \2 \1 将它们的位置交换。

文件定位

whereis命令locate/slocate命令find命令which命令rpm命令

以 nginx 安装目录为例:

1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost ~]# whereis nginx
[root@localhost ~]# whereis -b nginx # 定位指令的二进制程序、源代码文件和man手册页等相关文件的路径
[root@localhost ~]# locate nginx # 搜索一个数据库/var/lib/locatedb,查找目录与文件,但查不到最新的变动,为避免这种情况应先使用updatedb命令
[root@localhost ~]# find / | grep nginx # 在指定目录下查找子目录与文件

[root@localhost ~]# which nginx # 查找并显示给定命令(可执行程序)的绝对路径。查看某个系统命令是否存在并显示命令位置。

# rpm命令是RPM软件包的管理工具
[root@localhost ~]# rpm -qa | grep nginx # 列出安装过的软件包,且包含字符串nginx
[root@localhost ~]# rpm -q nginx # 获取nginx软件包的全名
[root@localhost ~]# rpm -ql nginx # rpm包中文件的安装位置
[root@localhost ~]# rpm -qal | grep nginx

网络状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
yum install -y lsof
lsof -i:8080 # 查看端口是否被占用,有列头,推荐使用

yum install -y net-tools
netstat -ntlp # 查看当前所有tcp端口
netstat -nulp # 查看当前所有udp端口
netstat -an | grep 80 # 查看所有包含80的端口使用情况
netstat -ntulp | grep 80 # 查看所有包含80的端口使用情况,包括PID(进程ID)、进程名。
netstat -tunlp | grep 80 # 查看所有包含80的端口使用情况,包括PID(进程ID)、进程名。
# -t : 指明显示TCP端口
# -u : 指明显示UDP端口
# -l : 仅显示监听套接字(所谓套接字就是使应用程序能够读写与收发通讯协议(protocol)与资料的程序)
# -p : 显示进程标识符和程序名称,每一个套接字/端口都属于一个程序。
# -n : 不进行DNS轮询,显示IP(可以加速操作)

进程状态

Linux ps 命令 - 菜鸟

1
2
3
4
5
6
7
8
[root@localhost ~]# ps aux
[root@localhost ~]# ps aux | grep nginx

[root@localhost ~]# ps -f
[root@localhost ~]# ps -ef
[root@localhost ~]# ps -ef | grep nginx

ps axw -o pid,ppid,user,%cpu,vsz,wchan,command | egrep '(nginx|PID)'

输出头(标题)

Linux head 命令 - 菜鸟

在使用Linux命令时,如果命令中有管道 | ,则输出的信息中,头(标题)信息丢失,要想看每一列代表什么意思很不方便。

例如 ps auxw

1
2
3
4
5
6
7
8
9
10
11
$ ps axuw
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 193984 6556 ? Ss 08:51 0:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S 08:51 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< 08:51 0:00 [kworker/0:0H]
root 5 0.0 0.0 0 0 ? S 08:51 0:00 [kworker/u128:0]
root 6 0.0 0.0 0 0 ? S 08:51 0:00 [ksoftirqd/0]
root 7 0.0 0.0 0 0 ? S 08:51 0:01 [migration/0]
root 8 0.0 0.0 0 0 ? S 08:51 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? S 08:51 0:03 [rcu_sched]
root 10 0.0 0.0 0 0 ? S< 08:51 0:00 [lru-add-drain]

再加上管道符后

1
2
3
4
5
$ ps axuw | grep redis
esuser 2636 0.0 0.0 192 4 ? Ss 08:52 0:00 /usr/bin/dumb-init -- /redis-commander/docker/entrypoint.sh
polkitd 2654 0.2 0.4 52956 9020 ? Ssl 08:52 0:09 redis-server *:6379
esuser 2810 0.0 1.9 272292 36548 ? Ssl 08:52 0:01 /usr/bin/node ./bin/redis-commander
root 39925 0.0 0.0 112824 980 pts/0 S+ 10:05 0:00 grep --color=auto redis

可以看到头(标题)已经丢失。

一个简单的办法,通过 2 条命令叠加,获取头和内容:

1
2
3
4
5
6
$ ps axuw | head -1;ps axuw | grep redis
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
esuser 2636 0.0 0.0 192 4 ? Ss 08:52 0:00 /usr/bin/dumb-init -- /redis-commander/docker/entrypoint.sh
polkitd 2654 0.2 0.4 52956 9020 ? Ssl 08:52 0:09 redis-server *:6379
esuser 2810 0.0 1.9 272292 36548 ? Ssl 08:52 0:01 /usr/bin/node ./bin/redis-commander
root 40905 0.0 0.0 112824 984 pts/0 S+ 10:07 0:00 grep --color=auto redis

也就是先用命令本身加 | head -1 取到头(标题),然后再使用该命令输出内容,两者叠加输出即得到所要结果。

排序——sort

Linux sort命令 - 菜鸟

排序命令——sort

按列排序,数字大的在前:

1
2
3
4
5
6
7
8
$ ps auxw | sort -rnk 2
root 44271 0.0 0.0 126840 928 pts/0 S+ 10:14 0:00 sort -rnk 2
root 44270 0.0 0.0 155448 1868 pts/0 R+ 10:14 0:00 ps auxw
root 44269 0.0 0.0 108052 612 ? S 10:14 0:00 sleep 1
201 44263 0.0 0.0 1560 248 ? SN 10:14 0:00 sleep 1
201 33288 0.0 0.0 2412 1400 ? SN 09:52 0:01 bash /usr/libexec/netdata/plugins.d/tc-qos-helper.sh 1
root 8204 0.0 0.0 0 0 ? S< 09:02 0:00 [kworker/11:1H]
......

该例子,将第 2 列进行排序,最大的数排前面。

若只想看前10条的内容:

1
$ ps auxw | sort -rnk 2 | head -10

将实际内存消耗最大的10个进程显示出来:

1
2
$ ps auxw | head -1; ps auxw | sort -rnk 6 | head -10
$ ps auxw --sort=-rss | head -11

统计——wc

统计命令——wc

切分——cut

切分命令——cut

去重——uniq

去重命令——uniq

强大的文本分析命令——awk

awk 命令 - 菜鸟
强大的文本分析命令——awk

1
ps -ef | grep mar-service.jar:60002 | grep -v grep | awk '{ print }'

服务管理

systemctl命令 :是系统服务管理器指令,它实际上将 servicechkconfig 这两个命令组合到一起。

1
2
3
4
5
6
7
8
9
10
11
# 查看所有可用的单元文件
[root@localhost ~]# systemctl list-unit-files | grep ''
# 查看所有已安装服务
[root@localhost ~]# systemctl list-unit-files --type=service | grep ''

# 输出激活的unit,下面两个命令等效
[root@localhost ~]# systemctl | grep ''
[root@localhost ~]# systemctl list-units | grep ''
# 输出激活的类型为service的unit
[root@localhost ~]# systemctl list-units --type=service | grep ''
[root@localhost ~]# systemctl list-units --type=service | grep nginx

vim 中查找和替换

vi / vim 键位图: https://www.runoob.com/linux/linux-vim.html

https://harttle.land/2016/08/08/vim-search-in-file.html

https://blog.csdn.net/ballack_linux/article/details/53187283

清空历史命令

history命令

.bash_history 默认可记录 500 条历史命令。

只有在正常退出当前 shell 时,在当前 shell 中运行的命令才会保存至 .bash_history 文件中。

1
2
3
[root@localhost ~]# history 10               # 显示最近使用的10条历史命令
[root@localhost ~]# history -c # 清空当前shell历史命令记录
[root@localhost ~]# rm -rf ~/.bash_history # 删除'.bash_history'文件

若想在每次登录后都清空历史记录,可以在登录后登出前执行 rm -rf ~/.bash_history 即可。

Wget 和 cURL

百科: Wgetwget命令cURLcurl命令

curl 与 wget

wget命令 用来从指定的URL下载文件。

curl命令 是一个利用URL规则在命令行下工作的文件传输工具。curl URL 默认将下载文件输出到stdout,将进度信息输出到stderr(默认也是终端),可以使用 -O(使用原文件名)或 -o(指定输出文件名)指定输出位置。curl支持更多的协议,还支持cookies、认证、限速、文件大小等特征。

1
2
[root@localhost ~]# wget -c URL
[root@localhost ~]# curl URL -O --progress

删除文件/文件夹

1
2
3
4
rm -rf # 文件或文件夹名
# -i 删除前逐一询问确认。
# -f 即使原档案属性设为唯读,亦直接删除,无需逐一确认。
# -r 将目录及以下之档案亦逐一删除。

解压缩

tar

1
2
3
# 解压
tar -zxvf jdk-7u80-linux-i586.tar.gz
tar -zxvf /mnt/hgfs/SharedFolders/openjdk-11+28_linux-x64_bin.tar.gz -C /data/

zip

1
2
3
4
5
6
7
8
9
10
11
12
# 安装zip、unzip应用
yum install zip unzip # Centos
apt install zip unzip # Ubuntu

# 解压
unzip /mnt/hgfs/SharedFolders/linuxx64_12201_database.zip -d /data
# 将 /home/html/ 这个目录下所有文件和文件夹打包为当前目录下的 html.zip
zip -q -r html.zip /home/html
# 如果在我们在 /home/html 目录下,可以执行该命令
zip -q -r html.zip *
# 从压缩文件 cp.zip 中删除文件 a.c
zip -dv cp.zip a.c

7z

Linux有问必答:Linux 中如何安装 7zip

支持 7Z,ZIP,Zip64,TAR,RAR,CAB,ARJ,GZIP,BZIP2,CPIO,RPM,ISO,DEB 压缩文件格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 安装
$ yum install p7zip p7zip-plugins
$ apt install p7zip-full p7zip-rar

# 将01.jpg和02.png压缩成一个7z包
$ 7z a pkg.7z 01.jpg 02.png
# 将所有的.jpg文件压缩成一个7z包
$ 7z a pkg.7z *.jpg
# 将文件夹folder压缩成一个7z包
$ 7z a pkg.7z folder
# 将pkg.7z中的所有文件解压出来,e是解压到当前路径
$ 7z e pkg.7z # 不实用
# 将pkg.7z中的所有文件解压出来,x是解压到压缩包命名的目录下
$ 7z x pkg.7z # 正确的解压方法

nohup

相关链接: 百科Linux nohup 命令 - 菜鸟shell中的特殊字符大全

nohup命令可以将程序以忽略挂起信号的方式运行起来,被运行的程序的输出信息将不会显示到终端。 如果不将 nohup 命令的输出重定向,输出将追加到当前目录的 nohup.out 文件中。

nohup command >/dev/null 2>&1 & 意思就是,将command保持在后台运行,并且将输出的日志忽略。

1
2
# 启动java服务
nohup java -jar -Dserver.port=9088 gateway.jar >/dev/null 2>log &