Post

Linux 使用

Linux 使用

介绍

WIP…


参考资料


使用

工具


基本使用

系统信息查看

1
2
3
4
5
6
7
8
lsb_release -a        # 显示 LSB 版本信息
uname -r              # 显示内核版本
uname -a              # 查看完整的内核版本信息
hostnamectl           # 显示系统信息,包括主机名、操作系统、内核等
cat /proc/version
cat /etc/os-release
cat /etc/lsb-release
cat /etc/issue

系统资源查看

1
2
3
4
5
6
7
8
9
lscpu          # 查看 CPU 信息
lsmem          # 查看内存信息
lspci          # 查看 PCI 设备信息

intel_gpu_top  # Intel 集显

free -gh       # 以 GB 单位显示内存使用情况
vmstat -S M    # 以 MB 单位显示虚拟内存使用情况
htop           # 显示系统资源;增强版 top

图片查看:eogdisplay


Linux 系统文件颜色

  • 白色:一般性文件,如文本文件,配置文件,代码文件等
  • 蓝色:目录
  • 绿色: 可执行文件
  • 红色:压缩文件
  • 浅蓝色:链接文件

登录 Shell 与非登录 Shell

  • 登录 Shell:物理登录到系统上(如在登录界面输入用户名和密码)或远程登录(如 SSH)
  • 非登录 Shell:打开新终端窗口或启动新 Shell(如输入 bash 命令)

SSH 配置

  • 用户配置:~/.ssh/config
  • 系统配置:/etc/ssh/ssh_config

用户切换

  • 切换到用户:su username
  • 切换到 root:
    • sudo -isudo su 只需输入当前用户密码
    • su 需输入 root 用户的密码,Ubuntu 默认没有设置,需通过 sudo passwd root 给 root 创建密码

1
2
3
4
5
6
7
8
# 设置 root 密码
sudo passwd root

# 安装 ifconfig
sudo apt install net-tools

# 查看 IP 地址 Linux/macOS
ifconfig

Session

用户每次使用 Shell,都会开启一个与 Shell 的 Session(对话)。

Session 有两种类型:登录 Session 和非登录 Session。


登录 Session 是用户登录系统以后,系统为用户开启的原始 Session,通常需要用户输入用户名和密码进行登录。

登录 Session 一般进行整个系统环境的初始化,启动的初始化脚本依次如下:

  • /etc/profile:所有用户的全局配置脚本
  • /etc/profile.d 目录里面所有 .sh 文件
  • ~/.bash_profile~/.bash_login~/.profile:用户的个人配置脚本(执行顺序同书写顺序)

Linux 发行版更新的时候,会更新 /etc 里面的文件,比如 /etc/profile,因此不要直接修改这个文件。如果想修改所有用户的登陆环境,就在 /etc/profile.d 目录里面新建 .sh 脚本。

修改个人的登录环境,一般是写在 ~/.bash_profile 里面。

1
2
bash --login      # 强制执行登录 Session 会执行的脚本
bash --noprofile  # 跳过上面这些 Profile 脚本

非登录 Session 是用户进入系统以后,手动新建的 Session,这时不会进行环境初始化。如执行 bash 命令,就会新建一个非登录 Session。

非登录 Session 的初始化脚本依次如下:

  • /etc/bash.bashrc:对全体用户有效
  • ~/.bashrc:仅对当前用户有效

~/.bashrc 通常是最重要的脚本。非登录 Session 默认会执行它,而登录 Session 一般也会通过调用执行它。每次新建一个 Bash 窗口,就相当于新建一个非登录 Session,所以 ~/.bashrc 每次都会执行。注意,执行脚本相当于新建一个非互动的 Bash 环境,但是这种情况不会调用 ~/.bashrc

1
2
3
bash --norc    # 禁止在非登录 Session 执行 ~/.bashrc 脚本

bash --rcfile testrc  # 指定另一个脚本代替 .bashrc

常用命令

参考:


基本命令

基本命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
man         # 查看命令帮助
echo        # 打印字符串
pwd         # 显示当前路径
cd          # 切换目录
ls          # 列出目录内容;
cat         # 显示文件内容
tac         # 从最后一行显示文件内容
head tail   # 打印文件首尾内容,默认 10 行
less        # 逐页显示文件内容
touch       # 创建文件/修改文件时间属性
mkdir       # 创建目录
mv          # 移动/重命名
cp          # 复制
rm          # 删除
rmdir       # 删除空目录
diff        # 查看文件差异
which       # 查看可执行命令所在路径
cut         # 剪切命令
clear       # 清屏
reset       # 重置终端
dirname
basename
chmod
chown
time
|           # 管道符
>  >>       # 标准输出流重定向
<           # 标准输入流重定向
2>  2>>     # 标准错误流重定向

基本命令进阶用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
man man                 # 查看如何使用 man 命令
man 3 printf            # 查看如何使用 printf 库函数
man -k xxx              # 检索关键字含有 xxx 的命令

ls -a                   # 会列出 . 和 ..
ls -A                   # almost all,不列出 . 和 ..
ls -1 | grep -v 'XXX*'  # ls 不列出特定的文件/目录

cd -                    # 返回上一次的目录

mkdir -p xxx/xxx        # 创建多级目录

tail -n +2 file         # 从第二行开始输出内容

# 建议设置 
alias mv="mv -v"
alias cp="cp -v"
alias rm="rm -v"

# 对比目录差异
diff -urp folder1 folder2 2>/dev/null

which -a command  # 查看所有同名命令

readlink -f path  # 查看相对路径文件的绝对路径

cut -d, -f3 file  # 从每一行文本中提取以逗号分隔的第三个字段

tar

  • 打包命令,非压缩/解压缩命令(和其他程序如 gzip、bzip2 等一起实现压缩/解压缩功能)
  • 不同压缩格式的文件体积大小:tar.gz > tar.bz2 > tar.xz
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 常用参数
-c             # 创建归档
-x             # 从归档中提取文件
-v             # 显示详细信息
-f             # 指定归档文件名称
-z             # tar.gz 格式
-j             # tar.bz2 格式
-J             # tar.xz 格式
--zstd         # tar.zst 格式
-t             # 显示归档文件中的内容,而非提取文件
-C             # 指定路径
--exclude      # 排除指定文件或目录


# 示例
tar -czvf file.tar.gz file  # 压缩
# 指定解压缩路径
tar -xzvf archive.tar.gz -C DEST
# 排除指定文件
tar -czvf archive.tar.gz --exclude=exclude_file file

gzip -d all.gz  # 解压 .gz 文件
gunzip all.gz   # 同上

zip file.zip file         # 压缩
zip -r xxx.zip directory  # 递归压缩目录
unzip all.zip             # 解压 .zip 文件

zcat     # 查看 .gz 文件
bzcat    # 查看 .bz2 文件

ln

给文件/目录设置软/字符链接(需绝对路径

1
2
3
4
5
ln -s path/src path/des

# -f force 创建新链接前删除与之同名的文件或链接
# 在当前目录创建与目标文件同名的符号链接
ln -s -f .tmux/.tmux.conf

curl

利用 URL 规则在命令行下工作的文件传输工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 常用参数
-o             # 指定保存文件名
-O             # 保存文件名与远程文件相同
--progress     # 显示进度条
-L             # 跟随重定向,如果服务器返回重定向响应,将自动请求新的 URL
-C             # 下载中断时,继续下载,通常与 -o 一起使用
-s             # 安静模式,减少输出信息,只显示错误信息
-I             # 仅获取远程文件的头部信息,而不下载实际内容
-f             # 请求发生错误时,返回非零的退出状态码,表示请求失败
-S             # 在发生错误时显示错误信息


# 示例
curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh

# 有趣 curl 命令;输出 ascii live 字符
curl parrot.live
curl ascii.live/forrest
curl ascii.live/parrot

wget

从网络下载文件

1
2
3
4
5
6
7
8
9
# 参数
-P         # 指定保存目录
-O         # 指定保存文件名


# 示例
wget https://gitee.com/Devkings/oh_my_zsh_install/raw/master/install.sh -O install.sh

# wget -O - 将下载的内容输出到标准输出,而非将其保存为文件

find

查找文件;与另外两个命令对比:

  • whereis:查找程序的二进制文件、源代码文件和 man 手册路径
  • locate:通过数据库定位文件路径(可能需要自己安装,数据库更新慢)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 常用参数
-name          # 按照文件名查找
-iname         # 按照文件名查找,忽略大小写
-type          # 文件类型;f 普通文件,d 目录,l 软链接
-maxdepth      # 目录最大深度
-mindepth      # 目录最小深度
-size          # 文件大小
-regex         # 正则表达式匹配
-iregex        # 正则表达式匹配,忽略大小写
-exec          # 执行指令
-ok            # 执行指令,但需确认
-perm          # 按照文件权限查找;111 精确匹配,/111 任意一个匹配,-111 都必须匹配


# 示例
# 查找 txt 或 pdf 文件
find . -type f -name "*.txt" -or -name "*.pdf"
# 查找 tar.gz 文件并删除
find . -type f -name "*.tar.gz" -exec rm {} +

# 找到含下划线的 Python 脚本,并将其换成连字符输出
fes=$(find . -maxdepth 2 -type f -name "*_*.py"); for f in ${fes}; do echo ${f//_/-}; done


# 安装 locate
sudo apt install mlocate

# 更新 locate 数据库
sudo updatedb

locate libstdc++.so.6

# 查看库文件中包含的字符串信息
strings libstdc++.so.6 | grep GLIBCXX

sed

文本处理工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 命令格式
sed [options] 'command' file(s)

# 常用 options
-i             # 直接修改文件内容,而不是输出到标准输出
-n             # 只处理特定行,常与 p 命令一起使用
-e             # 多个命令

# 常用命令
s              # 替换指定字符串
d              # 删除行
p              # 打印行
a              # 在行后添加文本
i              # 在行前插入文本
c              # 替换行

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 替换指定字符串
sed 's/old/new/' file  # 只替换每行第一个匹配的
sed 's/old/new/g' file  # 标志 g 全局替换
sed 's/old/new/Ng' file  # 从第 N 处匹配开始替换

# 定界符
# / 在 sed 中作为定界符使用,可使用其他任意的定界符
sed 's:old:new:g' file
sed 's|old|new|g' file

# 在行后添加文本
sed '1a\content' file  # 在第 1 行添加内容
sed -i '$a\content' file  # 在最后一行添加内容

# 在行前插入文本
sed '1i\content' file  # 在第 1 行前插入内容
sed '/pattern/i\content' file  # 在匹配内容所在行前插入内容

# 删除行
sed '/cat/d' file  # 删除含 cat 的行
sed '$d' file  # 删除最后一行
sed 'N,Md' file  # 删除第 N-M 行
sed '/^$/d' file  # 删除空白行

# 打印行
sed -n 4p file  # 打印第 4 行
sed -n 4,8p file  # 打印第 4-8 行

# 替换行
sed '1c\content' file  # 替换第 1 行内容

# 组合多个命令
sed -e '1d' -e '/pattern/d' file  # 删除多行

grep

文本搜索工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 常用参数
-i             # 忽略字符大小写
-n             # 显示行号
-c             # 统计匹配的行数
-A N           # N 数字;输出匹配行及之后 N 行
-B N           # N 数字;输出匹配行及之前 N 行
-C N           # N 数字;输出匹配行及之前后各 N 行
-E             # 使用扩展正则表达式
-o             # 只输出匹配到的部分
-v             # 反向匹配 即输出不匹配指定模式的行
-I             # 跳过二进制文件 等同于 --binary-files=without-match
--exclude-dir  # 排除目录
--exclude      # 排除文件
-r             # 递归
-h             # 在匹配内容前标示文件名
-H             # 在匹配内容前不标示文件名
-l             # 列出匹配内容前所属文件名
-L             # 列出无匹配内容的文件名
-m N           # 找到 N 行结果后停止查找,用来限制匹配行数

awk

文本处理工具

  • 将输入数据视为记录,每个记录又被进一步划分为字段
  • 默认分隔符为空格(可以为多个空格),指定分隔符(-F:
  • awk 程序由模式和动作组成(可以没有模式)
  • -v var= 定义变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# awk 中的变量
$0        # 所有字段
$n        # 第 n 个字段
NR        # 记录行号
NF        # 记录字段数(列数)
FNR       # 记录文件数

# awk 中的模式
BEGIN     # 在 awk 开始读取输入数据流之前执行一些初始化操作
END       # 在 awk 读取完输入数据流之后执行一些最终操作

# 语法
BEGIN {
   command
}

END {
   command
}

常用功能 awk 命令实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
awk '{ print NR, $0 }' file  # 输出文件内容并显示行号 

awk 'END { print NR }' file  # 统计行数

awk '{ nf = nf + NF } END { print nf }' file  # 返回总字段数

awk '$3 == 0' file  # 输出第三列为 0 的行

awk 'NR % 2 == 1' file  # 打印奇数行

awk '{ print $NF }' file  # 输出最后一列

# 输出最后一行
awk 'END { print $0 }' file
awk '{ last = $0 } END { print last }' file

# 将第 2 列输出成一行
awk '{printf "%s ", $2}' file
awk '{ names = names $2 " " } END { print names }' file

awk '{printf "%s", $0} END {print ""}' file  # 将所有行输出成 1 行

awk '{ temp = $1; $1 = $2; $2 = temp; print }' file  # 第 1、2 列交换

awk '{ for (i = NF; i > 0; i = i - 1) {printf("%s ", $i)} {printf("\n")}}'  # 逆向排列

awk 'FNR == NR {a[NR] = $0; next} {print a[FNR], $0}' file1 file2 > concat  # 列拼接文件

# 去除重复行(包括空行)
awk '!seen [$0]++' file
# 去除重复行(不包括空行)
awk '!seen[$0]++ || $0 == ""' file

其他命令

  • cat
1
2
3
4
5
6
7
cat -          # 读取标准输入
echo '#' | cat - test.log  # 将标准输入的内容和文件内容一并显示

# 参数
-n             # 附加行号
-b             # 给非空行附加行号
-s             # 压缩连续的空行到一行
  • du:查看文件/目录大小
1
2
du -sh file/folder
du -sh file/folder | sort -h  # 按大小排序
  • dirs:显示目录堆栈,按照最近访问的目录排序(ohmyzsh 有关 dirs 的 alias 是 d
1
2
3
4
5
# 常用参数
-l             # 展开 ~
-p             # 每个目录按行显示
-v             # 每个目录按行显示并进行编号
-c             # 清空目录堆栈
  • xargs:参数转化器,将输入数据转换为命令行参数并执行命令。常用于将管道或标准输入 (stdin) 的数据转换为命令的参数。
1
2
3
4
5
# 将 find 找到的文件删除
find . -name *.tmp | xargs rm -f

# 每行 3 个输出
echo "a b c d" | xargs -n 2 echo
  • tee:从标准输入读取数据并重定向到标准输出和文件(即输出到屏幕上,也保存到文件中,可以多个文件)
1
2
3
4
command | tee file

-a             # 不覆盖文件,输出附加到文件的末尾
-i             # 忽略中断信号
  • nohup:全称 no hang up。允许在用户注销或者断开终端连接之后,仍然运行后台的程序(或直接在命令后添加 &,使程序进入后台运行)
1
2
nohup command &
nohup command > output.log &
  • paste: 可以用来进行多个(csv)文件之间的列合并
1
paste -d' ' file1 file2  # 以空格为间隔符来进行列合并文件
  • kill:杀死进程
1
kill -9 PID  # 发送强制终止信号给进程
  • column:将文本输入格式化成多列输出
1
column -s, -t data.csv  # 指定分隔符格式化(表格形式)输出
  • nl:显示行号
1
2
3
4
5
nl file         # 显示行号
nl -n ln file   # 行号在荧幕的最左方显示;
nl -n rn file   # 行号在自己栏位的最右方显示,且不加 0 ;
nl -n rz file   # 行号在自己栏位的最右方显示,且加 0 ;
nl -b a file    # 表示不论是否为空行,也同样列出行号
  • type:判断命令的来源(内置命令,外部程序);命令的类型:别名(alias),关键词(keyword),函数(function),内置命令(builtin)和文件(file)
1
2
3
# 参数
-a    # 查看一个命令的所有定义
-t    # 返回一个命令的类型
1
2
3
date                       # Sun Mar 12 00:32:26 CST 2023
date +%Y%m%d               # 20240228
date +"%Y/%m/%d %H:%M:%S"  # 2023/03/12 00:32:33
  • hostname:输出主机名
1
2
3
4
5
6
7
/etc/hostname  # 配置文件路径

# 临时修改主机名
hostname new_hostname

# 永久修改主机名
hostnamectl set-hostname new_hostname
  • ldconfig: 用于创建、更新和维护动态链接器运行时绑定的缓存;常在系统启动时运行
1
2
ldconfig -p    # 查看库文件路径和实际缓存的库
sudo ldconfig  # 更新缓存
  • 文件行数统计
1
2
3
4
grep -c '' file
awk 'END { print NR }' file
wc -l file
sed -n '$=' file
  • 其他
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ldd                    # 列出可执行文件在运行时所需要的共享库
ldd --version          # 查看 GLIBC 版本

echo -n 'XXX' | wc -c  # 统计字符串长度 c 可换成 m

getconf NAME_MAX /     # 获取系统中文件名的最大长度

# Win 行尾符通常是 \r\n(回车符+换行符),Unix/Linux 为 \n
tr -d '\r'             # 删除字符串中的回车符

zcat                   # 查看 gz 压缩文件内容

cal 2024               # 显示 2024 年的日历;或 cal 8 2024,精确到月

env                    # 显示环境变量

pstree                 # 将所有进程以树状图显示
nmon                   # 监控系统资源(应该不常用)

文件系统层次结构

ft.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/bin              # 基本二进制程序;对所有用户可用
/sbin             # 系统二进制程序
/etc              # 配置文件
/lib              # 库文件
/usr              # 包含用户程序和数据
  /usr/bin          # 用户二进制文件
  /usr/sbin         # 
  /usr/lib          # 
  /usr/local        # 
/home             # 用户家目录
/root             # root 用户家目录
/var              # 变量/化文件
  /var/cache        # 应用程序缓存数据
  /var/log          # 日志文件
/tmp              # 临时文件
/boot             # 引导启动文件
/proc             # 虚拟文件系统,以文件形式提供对内核和进程信息
/mnt              # 临时挂载文件系统
/opt              # 可选应用软件包

其他

1
2
# 详细列出给定目录及其子目录的文件信息
lsr() { find "${@:-.}" -print0 | sort -z | xargs -0 ls --color=auto -dlha; }
  • zsh 与 bash 之间的一些区别:
    • zsh 数组索引从 1 开始, bash 从 0 开始
This post is licensed under CC BY 4.0 by the author.