build_embed_linux_system

Linux Shell命令行总结

Linux Shell由一系列脚本命令组成,其内容如下所示。

在Linux系统构建中,shell命令是使用Linux平台的基础技能,可以说大部分的开发和应用都依赖这些命令。shell命令支持依赖于支持的运行环境,常见的有bash, ash,korn,tcsh,zsh。shell命令一般指的是在Linux命令行模式下可以直接使用的可执行命令,这些命令包含内置命令,以及存在于系统目录(echo $PATH)中的”/bin/,/usr/bin/,/usr/sbin/”以及$PATH目录指定下的可执行程序或者脚本;这些脚本和程序按照来源不同如下所示。

这些命令的最重要特征是可以全局执行,可以通过whereis或者which来查找命令的位置,部分指令可以通过man [command]查看说明。本篇对于命令的说明只能说是沧海一粟,对于实际运用中,需要长期的经验积累不断学习。这里列出参考文档或者书籍,如果有时间去系统的学习了解,十分有意义。

注意:本章节中所有的指令只提供说明和例程指令,如果需要具体的功能和参数,建议在Linux系统中使用man命令查看,或者参考如下书籍系统的学习。

basic_knowledge

在本小节中会列出一些常见命令的使用和系统设备信息查看方法。

常见技巧

# 退出当前shell命令行
Ctrl+D  

# 退出当前shell命令行
exit

# 软件以守护进程形式执行
[command/app] &

# 显示系统信息
sudo apt-get install neofetch
neofetch

系统预设变量

变量名 描述
UID 当前账户的ID号
USER 当前账户的账户名称
HISTSIZE 当前终端的最大历史命令条目数量
HOME 当前账户的根目录
LANG 当前环境使用的语言
PATH 命令搜索路径
PWD 当前工作目录
RANDOM 随机返回0~32767的整数
$0 返回当前命令的名称
$n 返回位置参数,大于9需要使用${n}
$# 命令参数的个数
$* 命令行的所有参数,”$*“所有参数作为一个整体
$@ 命令行的所有参数,”$@”所有参数作为独立个体
$? 返回上一条命令退出时的状态代码,0表示正确,非0失败
$$ 返回当前进程的进程号
$! 返回最后一个进程的进程号

系统关键信息

#/etc目录
/etc/issue                      # 显示操作系统登录时输出信息
/etc/passwd                     # 用户名,组和启动执行定义文件
/etc/shadow                     # passwd的影子目录,保存口令信息
/etc/hosts                      # ip地址映射目录,主机名映射在此添加
    # 定义网址的映射
    127.0.0.1   localhost
    xx.xx.xx.xx github.com
/etc/resolv.conf                # dns服务器地址映射目录,网络正常无法访问网址在此更新dns服务器
    # dns ipaddress
    nameserver 192.168.1.1
    nameserver 8.8.8.8
/etc/apt/sources.list           # 镜像源网址,用于apt更新访问的目录
/etc/ssh/sshd_config            # sshd服务器配置文件.
/etc/ssh/ssh_config             # ssh客户端配置文件.
/etc/init.d/rcS                 # 开机自启动的脚本
/etc/network/interfaces         # 设置网络静态ip,需要为debian系Linux系统(debian,ubuntu)
/etc/hostname                   # 记录主机名称,也可通过hostname查看
/etc/os-release                 # 文件系统版本信息

#/proc目录
/proc/cpuinfo                   # 列出cpu信息
/proc/device-tree/              # 设备树信息
/proc/devices                   # 列出了系统中已注册的设备驱动程序及其主设备号
/proc/kallsyms                  # 查看导出的内核符号表
/proc/misc                      # 显示已经注册杂项设备的子设备号
/proc/filesystems               # 列出了当前系统支持的文件系统类型
/pro/interrupts                 # 系统已经注册的中断
/pro/meminfo                    # 系统的内存分配信息
/proc/mounts                    # 系统已经挂载的文件目录
/proc/net/dev                   # 系统当前网络设备
/proc/sys/kernal/threads-max    # 最大线程数
/proc/sys/kernal/pid_max        # 支持最大的pid数目
/proc/sys/vm/max_map_count      # 一个进程可以拥有的vma数量
/proc/sys/vm/min_free_kbytes    # 定义最小回收内存字节(lower为125%, high为150%)
/proc/sys/vm/drop_caches        # 用于控制内核的缓存(页面,目录和索引节点),
    - 0: 不清理任何缓存 
    - 1: 清理页面缓存
    - 2: 清理目录和索引节点缓存
    - 3: 清理页面,目录和索引节点缓存
/proc/sys/fs/dentry-state       # 这个文件提供了关于文件系统目录项(dentry)缓存状态的信息
    - nr_dentry 当前目录项缓存中的目录项数量
    - nr_unused 当前未使用的目录项数量
    = nr_innode 当前使用的inode数量
    - nr_inode_unused 当前未使用的inode数量
/proc/version                   # 显示内核的版本
    # 举例: Linux version 5.15.153.1-microsoft-standard-WSL2 (root@941d701f84f1) (gcc (GCC) 11.2.0, GNU ld (GNU Binutils) 2.37) #1 SMP Fri Mar 29 23:14:13 UTC 2024
    # 格式: 内核版本 | gcc: 编译工具 | #1: 清理内核编译次数 | SMP: Linux内核 | 内核编译时间 |
/proc/sys/kernel/printk         # 控制内核的打印权限(printk, dev_dbg...),小于等于的权限值都可以打印(1-7)
    echo "7 7 1 7" > /proc/sys/kernel/printk

# socket缓冲区
/proc/sys/net/core/rmem_max     # 接收缓冲区最大值
/proc/sys/net/core/wmem_max     # 发送缓冲区最大值
/proc/sys/net/core/rmem_default # 接收缓冲区默认值
/proc/sys/net/core/wmem_default # 发送缓冲区默认值

/proc/sys/net/ipv4/tcp_rmem     # tcp接收缓冲区内存信息<min default max>
/proc/sys/net/ipv4/tcp_wmem     # tcp发送缓冲区内存信息<min default max>
/proc/sys/net/ipv4/tcp_mem      # tcp内存信息<low pressure high>,
# min:TCP使用的内存的最小值(以页为单位)。在这个水平下,内核将不会释放TCP内存,即使其他应用程序请求内存。
# pressure:当TCP使用的内存超过这个值时,内核会开始回收TCP内存,但会尽量保持TCP性能。
# max:TCP可以使用的内存的最大值。当达到这个值时,TCP可能会开始丢弃数据包,从而影响网络性能。
# 通过echo命令可以修改特定的配置项,单次生效
echo "92901 123870 185802" > /proc/sys/net/ipv4/tcp_mem

/proc/sys/net/ipv4/udp_rmem_min # udp接收缓冲区最小值
/proc/sys/net/ipv4/udp_wmem_min # udp发送缓冲区最小值
/proc/sys/net/ipv4/udp_mem      # udp内存信息<low pressure high>
# low:当UDP内存使用量低于此值时,内核不会尝试回收UDP内存。
# pressure:当UDP内存使用量达到此值时,内核开始考虑回收UDP内存。
# high:当UDP内存使用量达到或超过此值时,内核会积极地回收UDP内存。

# 永久配置可修改在/etc/sysctl.conf中
net.core.rmem_default = 212992
net.core.rmem_max = 212992
net.core.wmem_default = 212992
net.core.wmem_max = 212992
net.ipv4.tcp_mem = 92901 123870 185802
net.ipv4.tcp_rmem = 4096 131072 6291456
net.ipv4.tcp_wmem = 4096 16384 419304

# cpu信息
/sys/class/thermal/cpu0/                                            # 设备的温度信息
/sys/class/thermal/thermal_zone0/temp                               # 设备当前温度
/sys/bus/cpu/devices/cpu0/cpufreq                                   # 设备当前的时钟频率(可读写)
/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor               # 当前的主频模式(可读写)
/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies  # 可配置的主时钟频率
/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors    # 可配置的主频工作模式

Linux-shell

# 查询内核版本信息
uname -a

# 查询系统版本信息(ubuntu)
lsb_release -a

# 测试磁盘性能
hdparm -tT /dev/sda

# 显示处理器架构
arch

口令和用户功能

在root用户下,可通过passwd命令修改口令, 支持命令如下:

# 修改root账户口令
passwd root

# 修改用户账户口令
passwd [user]

# 删除用户口令
passwd -d [user]

# 添加用户
useradd [user]

# 删除用户
userdel [user]

# 添加用户组
groupadd [group]

# 删除用户组
groupdel [group]

# 重命名一个用户组
groupmod -n new_group_name old_group_name

# 检查/etc/passwd的文件格式
pwck

切换用户

在linux下,可通过如下命令切换用户和退出root.

# 切换到root用户
sudo su

# 切换到其它用户
su [user]

# 在root权限下可以退出到普通用户
exit

git的安装和使用

git更换用户后,访问原用户需要增加安全限制

# git添加对于不安全目录的访问支持
git config --global --add safe.directory D:/user_project/git/build_embed_linux_system

网络相关应用

网络相关命令主要有ifconfig, ethtool, ping, iperf等,相关说明如下所示。

# 查看网络设备信息
ifconfig eth0                   # 查看网口状态
cat /proc/net/dev               # 查看收发包统计
cat /sys/class/net/eth0/speed   # 查看当前速率

# 打开/关闭网络设备
ifconfig eth0 up                # 打开网络设备
ifconfig eth0 down              # 关闭网络设备

# 配置网络设备
ifconfig eth0 192.168.1.100     # 配置静态ip
ifconfig eth0 hw ether 00:01:02:03:04:04  # 配置mac地址
udhcpc -i eth0                  # 动态获取ip地址
ethtool -s eth0 speed 100 duplex full autoneg on # 设置速率100Mbps, 全双工,自适应

# 常用测试命令
ping 192.168.1.120             # 测试设备连接性

# tcp吞吐测试
iperf -s -i 1                  # server端tcp吞吐测试
iperf -c 192.168.1.100 -i 1 -t 60 -P 4  # client端tcp吞吐测试

# udp吞吐测试
iperf -u -s -i  1                                   # server端udp吞吐测试
iperf -c 192.168.1.100 -u -b 100M -i 1 -t 60 -P 4  # client端udp吞吐测试

command_list

关于本节涉及的命令和列表如下。

file_manage

apt

apt是一款适用于Unix和Linux系统的软件包管理工具,主要用于检索、安装、更新和删除应用程序

# 从软件源更新list
sudo apt-get update

# 从软件源升级软件
sudo apt-get upgrade

# 安装软件
sudo apt-get install [package]

# 移除软件(彻底删除,包含配置文件)
sudo apt-get purge [package]

# 检查没有依赖会自己删除
sudo apt-get autoremove

# 查询已经安装的软件列表
sudo apt --installed list

# 安装失败后,用于修复之前安装需要的环境
sudo apt --fix-broken install

#查询软件包, 支持通配
apt search [package]
apt --names-only search [package]

# 显示
# Hit: 表示命中,检查包列表上的时间戳,匹配且没有变化
# Ign: 忽略,索引文件没有变化,也不会更新
# Get: 从目标获取文件,更新索引

如果apt出问题,可删除索引,重新更新
sudo rm -rf /var/lib/apt/list/*
sudo apt update

awk

awk 命令是一种文本处理工具,用于从文本文件中提取和处理数据。它基于模式扫描和处理文本,并支持自定义字段分隔符和记录分隔符。

用法: awk [选项] ‘模式 {动作}’ [文件]

-F: 指定字段分隔符。
-v: 定义变量。
-f: 从文件中读取 awk 脚本。

具体示例如下。

# 输出文件的第一列
awk '{print $1}' file.txt

# 输出文件的第二列和第三列
awk '{print $2, $3}' file.txt

# 使用指定的分隔符
awk -F: '{print $1}' /etc/passwd

# 定义变量
awk -v var="value" '{print var, $1}' file.txt

# 从文件中读取 awk 脚本
awk -f script.awk file.txt

cat

cat 命令主要用于读取、创建或合并文件的内容,并将结果输出到标准输出设备(通常是屏幕)或重定向到另一个文件中。

用法: cat [选项]… [文件]…

-n: 对输出的所有行进行编号。
-b: 对非空输出行进行编号,与-n类似,但空行不编号。
-s: 将连续的多个空行压缩为一个空行。
-v: 显示非打印字符,用 ^ 和 M-(表示 Meta)来分别标记控制字符和 Meta 字符。
-E: 在每行的行尾显示一个 $ 符号,以表示行的结束。
-T: 将制表符(Tab)显示为 ^I。
-A: 相当于 -vET 的组合,显示所有非打印字符。

具体示例如下。

# 显示系统中某文件内容
cat /proc/filesystem

# 连接两多个文件,并显示
cat 1.txt 2.txt

# 连接多个文件,输出到另一个文件中
cat 1.txt 2.txt > 3.txt

#带行号显示文件内容
cat -n [file]

cp

cp 命令用于复制文件和目录的命令行工具。

用法: cp [选项]… 源文件 目标文件

-a: 归档模式,递归复制目录并保留所有文件属性
-v: 详细模式,显示复制的文件和目录
-r: 递归复制目录及其内容
-d: 复制符号链接本身,而不是链接指向的文件

具体示例如下。

#将本目录下所有文件复制到tmp下
cp -av * /tmp/

#复制指定类型文件到指定目录
cp -rv *.img /sdk/img/

#复制软链接
cp -d /sbin/init /bin/init

dpkg

dpkg 命令是Debian及其衍生发行版如Ubuntu中用于管理软件包的工具。它可以用于安装、卸载、查询和管理软件包。

用法: dpkg [选项] [命令] [软件包]

-i: 安装指定的 .deb 软件包。
-r: 移除指定的软件包,但保留其配置文件。
-P: 完全移除指定的软件包,包括其配置文件。
-l: 列出当前系统中已安装的所有软件包。
-s: 显示指定软件包的详细信息。
-L: 列出指定软件包安装的所有文件。
# 安装文件
sudo dpkg -i package.deb

# 移除软件包
sudo dpkg -r package

# 完全移除软件包
sudo dpkg -P package

file

file 命令用于辨识文件类型和一些编码格式。通过查看文件的头部信息来获取文件类型。

用法: file [-options] 文件或目录

-b: 只显示文件类型,不显示文件名
-i: 输出MIME类型字符串。

具体示例如下。

# 查询文件类型
file /etc/profile

# 输出MIME类型字符串
file -i /bin/sh

find

find命令是搜索工具,用于在文件系统中搜索文件和目录.

用法: find [路径] [选项] [表达式]

-name: 按文件名查找文件。
-type: 按文件类型查找文件。
-size: 按文件大小查找文件。
-mtime: 按文件修改时间查找文件

具体示例如下。


# 查询指定路径下符合要求的文件
find /usr -name *.c # 查询usr目录和子目录下的.c后缀文件
find . -name *.txt  # 查询当前目录和子目录下的.txt后缀文件

# 查询指定路径下符合要求的目录
find / -type d -name test # 查询根目录下名为test的目录

# 查询指定路径下符合要求的文件大小
find / -size +100M # 查询根目录下大于100M的文件

# 查询指定路径下符合要求的文件修改时间
find / -mtime -7 # 查询根目录下最近7天内修改过的文件

less

less命令是一个用于查看文件内容的分页工具,它允许用户逐页查看文件内容,并支持搜索、滚动、翻页等操作。

用法:less [-options] file

-N: 显示行号。
-S: 不换行显示长行。
-g: 高亮显示搜索结果。
-i: 忽略搜索时的大小写。
-p "pattern": 搜索指定的模式。
-?: 显示帮助信息

具体示例如下。

# 使用less读取文件,支持分页
less README.md

# 显示行号
less -N README.md

# 搜索指定的模式
less -p "pattern" README.md

grep

文本搜索工具,它使用正则表达式搜索文本,并把匹配的行打印出来.

用法:grep [options] pattern [file…]

-c: 计算匹配行的数量。
-I: 不区分大小写。
-n: 显示匹配行及行号。
-s: 不显示不存在的文件或无匹配文本的错误信息。
-v: 显示不包含匹配文本的所有行。
-q: 静默匹配,结果不显示在命令行上

具体示例如下。

# 匹配名称为"shell", 带行号
grep -n shell README.md 
cat README.md | grep -n shell

从文件头查看指定行数,打印显示

用法:head [options] [file…]

-n: 显示指定行数。
-q: 静默模式,不显示文件名。
-v: 显示非匹配行。
-c: 显示指定字符数。

具体示例如下。

# 打印文件的前20行
head -n 20 example.txt

ln

ln 主要功能是用于在文件系统中为文件或目录创建链接。链接是一种特殊类型的文件,它指向另一个文件或目录,从而允许用户通过链接访问目标文件或目录.

用法:ln [选项]… 源文件或目录 目标文件或目录

-s: 创建软链接(符号链接)。
-f: 强制创建链接,如果目标文件或目录已存在,则覆盖它。
-d: 允许超级用户创建目录的硬链接。
-v: 显示详细的操作信息。

具体示例如下。

# 创建软链接
ln -sf [srcfile/srcdir] [dstfile/dstdir]

# 创建硬链接,覆盖原文件或者链接
ln -f [srcfile] [dstfile]

ls

ls命令功能为显示当前目录下的文件和目录.

用法:ls [选项] [文件或目录]

-a: 显示所有文件,包括隐藏文件。
-l: 以长格式显示文件信息,包括文件权限、硬链接数、属主、属组、大小、修改时间等。
-h: 以人类可读的格式显示文件大小,如1K、1M、1G等。
-t: 按修改时间排序文件。
-r: 按逆序排序文件。
-d: 仅显示目录,不显示文件。
-F: 在文件或目录后添加文件类型标识符,如目录末尾加"/",可执行文件末尾加"*"等。

具体示例如下。

# 显示当前目录下的详细信息
ls -alF

# 显示某个文件的详细信息
ls -alF | grep [file]

# 类型: 目录(d), 文件(-), 链接(l), 字符设备(c), 块设备(b)
# 文件的权限
# 文件的硬链接数目: 10
# 文件属主: freedom
# 文件属组: freedom
# 文件大小: 文件则以字节为单位表示大小, 目录只表示目录本身占用的大小,与内部内容容量关系不大。
# 上次修改时间: Mar 4 16:45
# 文件名或目录名: dl/
drwxr-xr-x   10 freedom freedom   4096 Mar  4 16:45 dl/

# ls可以配合过滤器
# 问号(?)代表任意单个字符
# 问号(*)代表任意零个或者多个字符
ls -l boo*

# 系统支持的库目录
ls /usr/lib

mkdir

创建文件目录.

用法:mkdir [选项] [目录]

-p: 递归创建目录,即使父目录不存在。
-v: 显示创建的目录。
-m <目录权限>: 创建时指定目录的权限。

具体示例如下。

# 在当前目录下创建指定目录
mkdir test/

# 创建目录时指定权限
mkdir -m 755 dir/

# 递归创建指令目录(不存在则会自动创建所有目录, 创建目录树)
mkdir -p test/1/

more

在Linux中,more命令是一个基于VI编辑器的文本过滤器,主要以全屏幕的方式按页显示文本文件的内容。

用法:more [选项] [文件]

-n: 指定每屏显示的行数
+n: 从第n行开始显示文件内容

具体示例如下。

# 显示读取文件
more [file]

# 从第20行开始,每个页面10个显示文件内容
more +20 -10 [file]

mv

Linux中的mv命令用于移动或重命名文件或目录。

用法:mv [选项] 源文件或目录 目标文件或目录

-f:强制移动或重命名,不提示确认信息,即使目标文件或目录已存在也会直接覆盖。
-i:交互模式,在覆盖目标文件或目录之前会提示用户确认。
-v:详细模式,显示移动或重命名的操作过程。
-u:只在源文件比目标文件新或者目标文件不存在时才进行移动。

具体示例如下。

# 显示移动的内容v,强制覆盖f
mv -vf src/ mnt/

ps

用于列出系统中当前运行的进程,通过管道配合grep实现匹配

用法:ps [选项] [进程号]

-a:显示所有进程,包括没有控制终端的进程。
-u:显示进程的用户名。
-x:显示没有控制终端的进程。
-l:显示进程的完整命令行。
-e: 显示所有进程,包括没有控制终端的进程。
-f:显示完整格式的进程信息。
-p <进程号>: 显示指定进程号的进程信息。

具体示例如下。

# 列出所有带qemu的选项
ps -ef | grep qemu

# 列出所有带qemu的项,但不包括自己
# 参数展开
ps -ef | grep [q]emu
ps -ef | grep qemu | grep -v grep

pwd

输出当前工作的目录

用法:pwd [选项]

-L: 显示符号链接的实际路径。
-P: 显示符号链接的物理路径。

具体示例如下。

# 输出当前目录
pwd

# 输出当前目录的物理路径
pwd -P

readelf

readelf是一个在Linux及类Unix系统下用于查看ELF文件信息的命令行工具,其中文件需要为绝对地址文件或者当前目录下文件。

用法:readelf [选项] [文件]

-h或--file-header:显示ELF文件的头部信息,包括文件类型、机器类型、版本、入口点地址、程序头表和节头表的位置和大小等。
-l或--program-headers:显示ELF文件的程序头部信息,包括段类型、段偏移、段虚拟地址等。程序头部是用来加载和运行可执行文件的重要数据结构。
-S或--section-headers:显示ELF文件的节区表信息,包括节区的名称、类型、起始虚拟地址、大小等。通过查看节区信息,可以了解可执行文件或共享库中各个节区的作用和内容。
-s或--symbols:显示ELF文件的符号表信息,包括符号名称、符号地址、符号类型等。符号表对于程序的调试和动态链接非常重要。
-d或--dynamic:显示ELF文件的动态节区信息,包括动态符号表、动态链接器的路径、动态库的依赖关系等。
-r:显示重定位表信息,包括重定位节、符号、类型等。
-a或--all:显示所有可用的ELF文件信息,包括文件头、节区表、符号表、重定位表、动态节区等。

具体示例如下。

# 显示可执行文件的头部信息
readelf -h lsz

# 显示可可自行文件的符号表信息
readelf -s ls

sed

sed(Stream EDitor)是一个强大的文本处理工具,广泛用于在Linux和Unix系统中对文本文件进行查找、替换、删除、插入等操作.

用法:sed [选项] [命令] [文件]

s/pattern/replacement/flags:替换命令,pattern 是要查找的模式,replacement 是替换后的文本,flags 是标志(如 g 表示全局替换)
d:删除行
p:打印行
a\text:在匹配行后追加text
i\text:在匹配行前插入text
c\text:用text替换匹配行

具体示例如下。

# 将文件 example.txt 中的 "foo" 替换为 "bar"
sed "s/foo/bar/" example.txt
 
# 全局替换(替换每一行中的所有匹配项)
sed "s/foo/bar/g" example.txt

# 删除文件 example.txt 中的第2行
sed '2d' example.txt
 
# 删除包含 "foo" 的行
sed '/foo/d' example.txt

# 在包含 "foo" 的行后追加 "bar"
sed '/foo/a\bar' example.txt
 
# 在包含 "foo" 的行前插入 "bar"
sed '/foo/i\bar' example.txt

# 将包含 "foo" 的行替换为 "bar"
sed '/foo/c\bar' example.txt

sort

sort是用于对文本文件中的行进行排序的命令行工具。

格式为:sort [选项]… [文件]…

-n: 按照数值大小进行排序,而不是按照字典顺序。
-r: 逆序排序,即降序排序(默认是升序)。
-t CHAR:指定字段分隔符(默认为空白字符,如空格和制表符)。
-k FIELD[,FIELD]:指定用于排序的字段(从1开始计数)。可以指定单个字段或多个字段的范围。
-o FILE:将排序结果输出到指定的文件,而不是标准输出。
-u: 去除重复的行,使输出中的每一行都是唯一的。
-b: 忽略每行前面的空白字符。
-f: 将小写字母视为大写字母进行排序(忽略大小写)。
-M: 将月份名(如 Jan, Feb, Mar 等)按照其在年中的顺序进行排序。

具体示例如下。

# 对文件内容进行升序排序
sort filename

# 按照数值大小对文件内容进行排序
sort -n filename

# 去除重复行并对文件内容进行排序
sort -u filename

strings

strings是一个常用的命令行工具,用于从二进制文件中查找并输出可打印的字符串.

用法:strings [选项] 文件

-a:扫描整个文件,而不仅仅是目标文件的数据段。
-f:在输出的每一行前加上文件名。
-n <长度>:指定字符串的最小长度,默认值为 4。
-t <格式>:在输出的每一行前加上字符串的偏移量,格式可以是 d(十进制)、o(八进制)、x(十六进制)。
-e <编码>:指定字符编码,常见的有 s(单字节)、S(双字节)、l(四字节)、b(双字节,大端序)、B(四字节,大端序)。

具体示例如下。

# 查询stdc++中的glibc api
strings libstdc++.so.6 | grep GLIBC

# 查询stdc++中的glibc++ api
strings libstdc++.so.6 | grep CXXABI

# 查询test.txt中的字符串
strings -f test.txt

tail

tail用于显示文件末尾的指定行数。

格式: tail [选项] [文件]

-n <行数>:显示文件末尾的指定行数,例如 -n 10 表示显示文件末尾的 10 行。
-f:持续监控文件的更新,当文件有新内容追加时,会自动显示新内容。
-c <字节数>:显示文件末尾的指定字节数。
-q:不显示文件名。
-v:显示文件名。

具体示例如下。

# 显示文件末尾的20行
tail -n 20 example.txt

# 表示持续更新
tail -f -n 10 example.txt

tar

Linux下的tar是一种常用的文件压缩和解压工具,它能够将多个文件和目录打包成一个单独的tar文件,并通过gzip、bzip2等算法进行压缩或解压。tar本身并不具有压缩功能,而是通过管道将文件传递给gzip或bzip2等压缩程序进行压缩或解压。

用法:tar [选项] [文件]

-x:从归档文件中提取文件(解压)
-c: 创建归档文件(打包)
-f: 指定归档文件的名称
-v: 显示详细的操作过程
-t: 列出规档文件中的内容
-j: 使用bzip2压缩算法进行压缩或者解压

具体示例如下。

#解压文件到当前目录
tar -xvf rootfs.tar.bz2

#解压文件到指定目录
tar -xvf rootfs.tat.bz2 -C /tmp/

#压缩当前目录下所有文件,打包成
tar -vcf rootfs.tar.bz2 *

#压缩指定目录下文件
tar -vcf rootfs.tar.bz2 /tmp/

time

计算命令的执行时间

用法: time [命令]

-o <输出文件>: 将输出重定向到指定文件中
-a <追加文件>: 将输出追加到指定文件中
-f <格式>: 指定输出格式

具体示例如下。

# 获取find查找的执行时间
time find . -name *.txt

touch

touch命令用于修改文件或目录的时间属性,包括访问时间和修改时间。如果文件不存在,touch命令会创建新的空文件。

用法: touch [选项] 文件

-a: 只修改访问时间
-m: 只修改修改时间
-t: 只修改时间戳
-r: 递归修改指定目录及其子目录下的所有文件的时间戳

具体示例如下。

#更新文件example.txt的时间戳
touch -t 202307190100.00 example.txt

rm

rm 是 Linux 命令行的一个基本命令,用于删除文件或目录。

注意:rm文件会直接将文件删除,如果删除系统文件很可能导致无法启动,因此尽量不要root权限执行

用法: rm [选项] 文件或目录

-f: 强制删除,不提示确认信息
-i: 交互式删除,提示确认信息
-r: 递归删除目录及其子目录
-v: 显示删除的文件或目录

具体示例如下。

# 删除指定文件(递归删除)
rm -rf /home/program/download/tmp/*

rmdir

rmdir命令用于删除空目录。它的功能是从一个目录中删除一个或多个空的子目录。要使用rmdir命令,用户需要具有对父目录的写权限.

用法: rmdir [选项] 目录

-p: 递归删除目录,即使目录不为空
-v: 显示删除的目录

具体示例如下。

# 删除指定目录(需要目录为空)
rmdir test

# 递归删除目录
rmdir -p test

uniq

uniq命令用于去除文件中相邻的重复行。它会将文件中的重复行合并为一行,并输出结果。

用法: uniq [选项] [文件]

-c: 在每一行前面显示该行重复出现的次数。
-d: 只显示重复的行。
-u: 只显示不重复的行。
-i: 忽略大小写。
"-s NUM": 跳过每行前NUM个字符再进行比较。
"-w NUM": 只比较每行的前NUM个字符。

具体示例如下。

# 去除文件中的重复行
uniq example.txt

# 显示文件中重复行的次数
uniq -c example.txt

# 只显示文件中的重复行
uniq -d example.txt

# 只显示文件中的不重复行
uniq -u example.txt

unzip

unzip命令将列出、测试或从zip用法存档中提取文件。

用法: unzip [选项] [文件]

-l: 列出zip文件的内容
-t: 测试zip文件的完整性
-x: 从zip文件中提取文件
-o: 指定输出目录

具体示例如下。

# 解压zip文件
unzip *.zip

vim

vim是Linux系统常用的文件管理工具。

用法: vim [选项] [文件]

-b: 以二进制模式打开文件
-R: 以只读模式打开文件

具体示例如下。

#以二进制模式打开文件
vim -b <file>

i   进入编辑模式
dd  删除整行
D/d$ 删除光标到行尾的数据
p   复制行到光标处
.   重复上一个命令
u   取消上个命令
x   删除单个字符
yy  复制光标所在的行
g   移动到行首
1$  移动到当前行尾
Shift+g 移动到文件尾部
gg  移动到文件首部    
:set number/:set nu 显示行号
nG或者ngg   跳转到指定行
:wq/:q! 保存退出/直接退出
/   输入查找文件, 此时n是下一个

#光标移动
数字+光标
h 光标左移
l 光标右移 
k 光标上移 
j 光标下移 

0 零 光标移到行首
$ 光标移到行尾
H 光标移到屏幕上显示的第一行 
L 光标移到屏幕上显示的最后一行 
M 光标移到屏幕的中间一行
nG 光标移到第 n 行
w或 W 将光标右移至下一个单词的词首
e 或 E 移动到单词尾部
b 或B 移动到单纯首部
Ctrl+G 显示当前文件状态
:n 移动到指定行
:$ 移动到最后行

zip

zip 是一个用于文件压缩的命令行工具,它可以将多个文件和目录打包成一个单独的 .zip 文件

用法: zip [选项] 压缩文件名 源文件或目录

-r: 递归地压缩目录及其子目录。
-q: 安静模式,不显示压缩过程中的详细信息。
-9: 最高压缩比,压缩速度较慢但压缩文件更小。
-j: 只存储文件,不存储目录结构。
-e: 加密压缩文件。
"-P password": 指定加密压缩文件的密码

具体示例如下。

# 压缩单个文件
zip archive.zip file.txt

# 压缩多个文件
zip archive.zip file1.txt file2.txt file3.txt

# 压缩目录及其子目录
zip -r archive.zip directory/

# 指定加密压缩文件的密码
zip -e -P password archive.zip file.txt

system_config

alias

alias 是一个用于创建命令别名的命令行工具。它允许用户为复杂或频繁使用的命令定义简短的别名,从而提高命令行操作的效率

用法:alias [别名]=[命令]

-p: 显示所有已定义的别名的定义。

具体示例如下。

#定义ll的别名
alias ll='ls -alF'
alias cdk='cd /home/progarm/support/kernal'

at

at 命令是一个用于在指定时间执行命令的工具。它允许用户在未来的某个时间点安排任务执行,而不需要用户在那个时间点手动执行命令。

用法:at [选项] [时间]

-f 文件名: 从指定的文件中读取要执行的命令。
-m: 在任务执行完毕后,给用户发送邮件通知。
-l: 列出当前用户的所有待执行任务。
-r 任务ID:删除指定的任务

具体示例如下。

# 从文件中读取命令并在指定时间执行
at -f commands.txt 14:30

# 列出当前用户的所有待执行任务
at -l

# 删除指定的任务
at -r 任务ID

bg

bg 命令是一个用于将作业放到后台运行的命令行工具。当你在终端中运行一个命令时,该命令默认会在前台运行,这意味着你需要等待该命令执行完毕才能继续在终端中输入其他命令。

用法:bg [作业ID]

具体示例如下。

# 将指定作业放到后台运行
jobs
bg %1

cd

用于将shell会话切换到另一个目录,支持绝对路径和相对路径。

用法: cd [directory]

-L : 允许符号链接(默认行为)
-P : 解析并跟随物理路径,不跟随符号链接

具体示例如下。

#切换到etc目录
cd /etc/

#切换到上一层目录
cd ../

#返回上一次目录
cd -

#进入个人主目录(在/home/[name]下)
cd

chgrp

chgrp 命令用于更改文件或目录的所属组。它允许用户将文件或目录的所属组更改为指定的组。

用法:chgrp [选项] 组名 文件或目录

-R: 递归地更改目录及其子目录下所有文件的所属组
-h: 只更改文件的所属组,而不更改目录的所属组

具体示例如下。

# 更改文件的所属组
chgrp newgroup file.txt

# 递归更改目录及其子目录下所有文件的所属组
chgrp -R newgroup directory/

chmod

chmod 更改程序的访问权限,包含写,读和执行三种权限,这个十分重要,很多时候编译或者访问目录失败都是权限问题,这里先要理解文件权限的说明,通过ls -l可查看目录下所有数据(包含文件和目录)的权限。

用法:chmod [选项] [模式] [文件]

-R: 递归地更改目录及其子目录下所有文件的权限
-c: 显示更改前和更改后的权限(仅权限更改后显示)
-v: 显示更改的详细信息

详细说明如下。

#权限说明
#  | d表示目录,-表示文件 | 所有者权限 | 所属组权限 | 其它用户权限 |
drwxrwxrwx 1 freedom freedom  4096 Nov  6 08:41 .git/
-rwxrwxrwx 1 freedom freedom 12381 Nov  6 14:43 0.embed_linux_environment_build.md*

# chown修改软件的所有权
chown root:root /usr/bin/sudo

# chmod修改软件的执行权
chmod u+s /usr/bin/sudo

# 修改文件分配可执行权限
chmod +x file.sh

# 修改文件权限
chmod 777 file.sh

这里第一列d表示目录,-表示文件

后续分成三个组,分别是对象的属主,对象的属组和系统其它用户,每个占位3bit, 对应r-w-x。

对于每个组中,r表示可读, w表示可写,x表示可执行, 下面列出常用的指令

sudo chmod 666 [file] 
sudo chmod 777 [file] 
sudo chmod 4755 [file] #定义用户和权限

chown

chown 修改软件的所有权。

用法:chown [选项] [用户名]:[组名] 文件或目录

-R: 递归地更改目录及其子目录下所有文件的所属组
-c: 显示更改前和更改后的权限(仅权限更改后显示)
-v: 显示更改的详细信息

具体示例如下。

# chown修改软件的所有权
chown root:root /usr/bin/sudo

# 更改权限
sudo chown freedom:freedom file.sh

chroot

chroot 是一个在 Linux 及类 Unix 系统中非常有用的命令,它的主要功能是改变当前进程及其子进程的根目录。

用法:chroot [选项] [目录] [命令]

-u: 指定用户

具体示例如下。

#不指定加载的qemu
LC_ALL=C LANGUAGE=C LANG=C sudo chroot nfs /bin/sh

#加载qemu
LC_ALL=C LANGUAGE=C LANG=C sudo chroot nfs /usr/bin/qemu-arm-static /bin/sh

clear

clear命令是用于清除当前终端界面内容的命令。

用法:clear

具体示例如下。

# 清除当前终端界面内容
clear

cron

cron是Linux系统中用于配置定时执行任务的工具,它会按照用户设定的时间规则周期性地执行指定的命令或脚本。

用法:cron [选项] [命令]

-e: 编辑cron任务
-l: 列出当前用户的cron任务
-r: 删除当前用户的cron任务

具体示例如下。

# 启动cron服务
sudo systemctl start cron

# 重启cron服务
sudo systemctl restart cron

# 停止cron服务
sudo systemctl stop cron

# 查看cron服务状态
sudo systemctl status cron

详细说明如下。

# 安装cron
sudo apt-get install cron

/etc/cron.hourly 定义每小时执行脚本目录
/etc/cron.daily 定义每天执行脚本目录
/etc/cron.weekly 定义每周执行脚本目录
/etc/cron.monthly 定义每月执行脚本目录

#/etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root     # 如果出现错误,或者有数据输出,数据作为邮件发给这个帐号
HOME=/          # 使用者运行的路径,这里是根目录

# run-parts
# minute hour day month week user_name command
01 * * * * root run-parts /etc/cron.hourly  # 每小时执行目录/etc/cron.hourly/内的脚本
02 4 * * * root run-parts /etc/cron.daily   # 每天执行目录/etc/cron.daily/内的脚本
22 4 * * 0 root run-parts /etc/cron.weekly  # 每星期执行目录/etc/cron.weekly/内的脚本
42 4 1 * * root run-parts /etc/cron.monthly # 每月去执行目录/etc/cron.monthly/内的脚本

cut

cut 分割字符串,获取指定位的值

用法:cut [选项] [文件]

-d: 指定分隔符
-f: 指定要提取的字段

具体示例如下。

# 以" "分割,获取第二个值
echo "A B C" | cut -d" " -f2

# 以"-"分割,获取第一个值
echo "A-B-C" | cut -d"-" -f1

date

管理和显示时间。

用法:date [选项] [格式]

-s: 设置时间
-r: 设置相对时间
-u: 显示UTC时间
-d: 显示指定日期

具体示例如下。

# 显示系统日期
date

# 显示UTC时间
date -u

# 显示指定日期
date -d "2022-12-25"

# 设置绝对时间
date -s "2022-12-25 10:30:00"

# 向前推移3天
date -s "-3 days"

# 向后推移6小时
date -s "+6 hours"

depmod

depmod是Linux系统中的一个命令,用于分析可载入模块的相依性。这些模块通常是动态加载到内核中的,用于扩展和添加新的功能,depmod命令最终会在/lib/modules/[kernel]/目录下生成modules.dep, 保存模块的依赖关系,使用modprobe [module-name]时则进行访问加载。

用法:depmod [选项] [模块名]

-a: 分析指定的模块
-A: 分析所有模块
-e: 显示错误信息
-n: 显示不进行任何操作
-v: 显示详细信息
-V: 显示版本信息

具体示例如下。

# 生成modules依赖关系
depmod

# 列出modules依赖关系
depmod -l

devmem2

devmem2或devmem主要用于读写寄存器值,依靠/dev/mem设备,访问内核数据。

用法:devmem2 [选项] [地址] [类型] [数据]

-b: 以字节为单位读写
-h: 以半字为单位读写
-w: 以字为单位读写

具体示例如下。

Usage:  devmem2 { address } [ type [ data ] ]
        address : memory address to act upon
        type    : access operation type : [b]yte, [h]alfword, [w]ord
        data    : data to be written

# 从0x00200000地址读取32字节数据
devmem2 0x00200000 -b 32

# 向0x00200000写入数据0x12345678
devmem2 0x00200000 32 0x12345678

dmesg

显示过去的系统执行日志,用于分析驱动加载情况。

dmesg用法:dmesg [选项]

-c: 清除日志
-k: 仅显示内核日志
-r: 显示原始的日志信息

具体示例如下。

# 显示所有日志
dmesg

# 显示和USB有关的日志
dmesg | grep usb

# 显示原始的日志信息
dmesg -r

dtc

将dts编译成dtb或者反汇编dtb生成dtc文件。

用法:dtc [选项] [输入文件] -o [输出文件]

-I <input_format>:指定输入文件的格式,常见的格式有 dts(设备树源文件)和 dtb(设备树二进制文件)。
-O <output_format>:指定输出文件的格式,同样可以是 dts 或 dtb。
-o <output_file>:指定输出文件的名称。
-W <warning_type>:控制警告信息的显示,例如 -Wno-unit_address_vs_reg 可以忽略地址与寄存器不匹配的警告。
-@:检查设备树文件中的引用是否正确。

具体示例如下。

# 将dts编译成dtb
dtc [file].dts -I dts -O dtb -o [file].dtb

# 反编译dtb到dts
dtc [file].dtb -I dtb -O dts -o [file].dts

echo

Linux中,echo命令用于在终端上显示一段文字或变量的值。

echo用法:echo [选项] 字符串

-n: 不输出换行符
-e: 输出转义字符

具体示例如下。

#特殊字符(-e输出转译字符)
#\b 退格键
#\f 换行单光标仍停留在原位置
#\n 换行光标移动到行首
#\r 光标移动到行首,但不换行
#\t 插入tab键
#\\ 打印\
#\033或\e 设置终端输血,字体颜色,背景颜色等
echo -e "123\r2"            #输出: 223
echo -e "\e[31mOK\e[0m"     #输出: 红色的OK, [31m为颜色说明
echo -e "\033[3;10HOK"      #输出: 在界面的第3行,20列输出指定值, [(row)-(col)H
echo -e "\e\\test" 

#打印环境变量信息
echo "$PATH"

#单引号屏蔽转义字符,另外\也可以屏蔽转译字符
echo '####'       #输出####
echo '$PATH'      #输出$PATH
echo \$PATH       #输出$PATH

#使用$(command)组合符合,支持命令嵌套
echo $(hostname)
echo $(echo 我是1级嵌套 $(echo 我是2级潜艇))

#输出值到当前的窗口
echo "hello word" > $(tty)

env

打印系统环境变量,等同于printenv

用法: env [选项] [变量名]

-i: 忽略当前环境变量
-u: 删除指定的环境变量

具体示例如下。

# 输出环境变量
env

# 输出带特定配置的环境变量
env | grep PATH

exit

exit命令主要用于从命令行界面CLI或脚本中退出当前会话或进程。

用法: exit [n]

n: 退出码,可选参数,指定退出时的状态码。通常情况下,0表示成功退出,非零值表示错误退出。

具体示例如下。

# 成功退出
exit 0

export

export 是一个在 Linux 和 Unix 系统中广泛使用的命令,它主要用于设置和导出环境变量,使得这些变量在当前 shell 会话及其子进程中都能被访问和继承。

用法:export [-fn] [name[=value] …]

-f: 该选项表示操作对象是shell函数。
-n: 从每个指定的名称NAME中移除export属性
-p: 打印出当前shell会话中的所有环境变量。

具体示例如下。

# 设置全局变量,内容为"Hello, World!"
export VAR="Hello, World!"

finger

查询用户的个人信息,包含用户名,执行shell,执行窗口等

用法: finger [选项] [用户]

-l: 显示用户的登录信息
-m: 显示用户的邮件地址
-s: 显示用户的所有信息

具体示例如下。

# 查询用户信息
finger [user]

free

用于显示系统内存使用情况的命令行工具。

用法: free [选项]

-b: 为单位显示内存大小
-k: 以KB为单位显示内存大小
-m: 以MB为单位显示内存大小
-g: 以GB为单位显示内存大小
-h: 以人类可读的格式显示内存大小
-s: 间隔秒数持续显示
-c: -c <次数>,与-s配合使用

具体示例如下。

# 查询内存占用情况
free -m

history

history 命令是一个用于查看和管理命令历史记录的命令行工具。

用法: history [选项]

-c: 清除当前 shell 会话的命令历史记录。
"-d offset": 删除指定偏移量的命令历史记录。
-a: 将当前 shell 会话的命令历史记录追加到历史文件中。
-r: 读取历史文件并将其内容合并到当前 shell 会话的命令历史记录中。
-w: 将当前 shell 会话的命令历史记录写入历史文件中。

具体示例如下。

# 查看命令历史记录
history

# 清除当前 shell 会话的命令历史记录
history -c

# 删除指定偏移量的命令历史记录
history -d 5

# 将当前 shell 会话的命令历史记录追加到历史文件中
history -a

# 读取历史文件并将其内容合并到当前 shell 会话的命令历史记录中
history -r

# 将当前 shell 会话的命令历史记录写入历史文件中
history -w

hostname

hostname 命令用于显示或设置系统的主机名。

用法: hostname [选项] [主机名]

-i: 显示主机的IP地址。
-f: 显示主机的完全限定域名(FQDN)。
-d: 显示主机的域名。
-s: 显示主机的短主机名。

具体示例如下。

# 显示当前主机名
hostname 

# 显示主机的IP地址
hostname -i

# 显示主机的完全限定域名(FQDN)
hostname -f

htop

htop 是一个命令行工具,用于实时显示 Linux 系统的进程信息。

用法: htop [选项]

-d:设置更新时间,单位秒
-t: 以树形结构显示进程信息
-M: 去除鼠标显示
-C: 使用黑白色输出菜单

具体示例如下。

# 以多列显示进程信息
htop -M

# 以树形结构显示进程信息
htop -t

hwclock

通过硬件读写时钟信息。

用法: hwclock [选项] [文件]

-s: 将系统时钟设置为硬件时钟。
-w: 将硬件时钟设置为系统时钟。
-r: 读取硬件时钟。
-f: 指定硬件时钟文件。
-u: 使用UTC时间。

具体示例如下。

# 设置时间,并写入硬件rtc中
date -s "2023-05-20 14:20:00" && hwclock -w -f /dev/rtc0

# 读取时间
hwclock -f /dev/rtc0

# 从rtc读取时钟,并作为系统时钟
hwclock --hctosys -u
hwclock -s -u

# 将系统时钟写入rtc
hwclock -w -u
hwclock --systohc -u

insmod

insmod用于直接安装模块到Linux内核中。

用法: insmod [选项] [模块文件]

-f: 强制安装模块,即使模块已经加载。
-v: 显示详细的安装信息。

具体示例如下。

# 加载module模块到系统中
insmod *.ko

iostat

显示设备的I/O相关的工作信息。

用法: iostat [选项] [设备]

-c: 显示CPU的统计信息。
-d: 显示磁盘的统计信息。
-n: 显示网络的统计信息。

具体示例如下。

# 显示当前的cpu状态和硬盘读写状态。
iostat

kill

用于强制关闭指定id的进程。

用法: kill [选项] [id]

-9: 强制终止进程,类似于kill -9 [id]
-15: 终止进程,类似于kill -15 [id]
-18: 暂停进程,类似于kill -18 [id]
-19: 继续进程,类似于kill -19 [id]

具体示例如下。

# 强制关闭指定id的进程
kill -9 [id]

# 强制关闭拥有指定名称的项目
sudo kill -9 $(pidof python3)

# 匹配名称进行关闭进程
kill -9 `ps -ef| grep ./udp_server | awk '{print $2}'`

killall

killall用于关闭指定名称的进程。

用法: kiallall [选项] [进程名称]

-9: 强制终止进程,类似于kill -9
-e: 只匹配完全相同的进程名称
-i: 在终止进程之前提示用户确认
-l: 列出所有已知的信号名称
-q: 不显示任何输出
-r: 使用正则表达式匹配进程名称
-s: 指定要发送的信号,默认为 TERM
-u: 只终止指定用户的进程
-v: 显示详细的输出

具体示例如下。

# 终止所有名为 python3 的进程
killall python3

# 在终止进程之前提示用户确认
killall -i python3

# 只终止指定用户的进程
killall -u username python3

lscpu

lscpu命令用于显示有关CPU的信息,包括CPU架构、核心数、线程数、缓存大小等。

用法: lscpu [选项]

-e:显示扩展的CPU信息
-p: 以可解析的格式显示 CPU 信息

具体示例如下。

# 显示有关 CPU 架构信息的命令行工具
lscpu

lsmod

lsmod命令会显示当前已加载的内核模块的详细信息。

用法: lsmod [选项]

-a: 显示所有已加载的模块,包括未使用的模块。
-n: 显示模块的名称,而不是路径。
-o: 显示模块的所有者。
-s: 显示模块的大小。
-u: 显示模块的使用次数。

具体示例如下。

# 显示当前加载的mod信息
lsmod

lsusb

lsusb是一个用于显示连接到计算机的 USB 设备信息的命令行工具。它通常在 Linux 系统中使用,可以帮助用户快速查看当前连接的 USB 设备的详细信息,包括设备的厂商 ID、产品 ID、设备类别等

用法:lsusb [选项]

-v:显示详细的设备信息,包括设备描述符、配置描述符、接口描述符等。
-t:以树状结构显示设备信息,便于查看设备的层次关系。
-s <总线号>:<设备号>:指定要显示的特定设备。
-d <厂商ID>:<产品ID>:指定要显示的特定厂商和产品的设备。

具体示例如下。

# 显示所有连接的 USB 设备
lsusb

# 显示详细的 USB 设备信息
lsusb -v

# 指定总线设备号,显示USB详细信息
lsusb -v -s 001:001

man

man命令是一个帮助指令,用于访问Linux系统的手册页,可用于查找shell命令以及其它GNU实用工具。

用法:man [options] file

-d 打印调试信息,用于开发和调试
-f 等同于 whatis 命令,显示给定关键字的简短描述信息
-k 根据关键字搜索所有手册页的简短描述,返回匹配的结果

具体示例如下。

# 查询ls的帮助手册
man ls

mknod

用于创建新的节点或目录的 Linux 命令,其语法类似于 mkdir。该命令可以在指定的目录中创建新的节点或目录,并可以选择性地为新节点指定类型和主、次设备号。

#创建指定节点
mknod /dev/test c 5 1

modinfo

显示Linux内核模块的详细信息的命令行工具。

#显示内核模块的信息
modinfo *.ko

modprobe

用于自动处理可载入模块的命令。它可以载入指定的个别模块,或是载入一组依赖的模块.

#会自动加载相关联的module
modprobe [kernal_module]

ntpq

ntpq 是一个用于查询和控制 NTP(Network Time Protocol)服务器的命令行工具。NTP 是一种用于同步计算机时钟的协议,它允许计算机通过网络与其他 NTP 服务器进行时间同步。

格式: ntpq [选项] [命令]

-p: 显示 NTP 服务器的对等列表,包括服务器的 IP 地址、延迟、偏移量等信息。
-n: 以数字格式显示 IP 地址,而不是解析为主机名。

具体示例如下。

# 以数字格式显示IP地址
ntpq -pn

pidof

pidof主要用于获取运行进程的pid

#获取init进程的pid,会列出所有的id
pidof init

pkill

Linux pkill是一个用于杀死进程的命令。它结合了ps命令和kill命令的功能,可以方便地杀死一类进程或某个用户的所有进程。

用法:pkill [-option] pattern

#关闭qemu的进程
pkill -9 qemu

poweroff

设备关机。

#设备关机
poweroff

printf

在命令行打印数据。

格式字符串 功能描述
%d或%i 十进制整数
%o 八进制整数
%x 十六进制整数
%u 无符号十进制整数
%f 浮点数
%s 字符串
#输出12
printf "%d\n" 12

#右对齐,格式化补空格,%-5d左对齐
printf "|%5d|\n" 12
printf "|%-5d|\n" 12

#打印小树,小数点后保存3位
printf "%.3f\n" 12.1234

#右对齐/左对齐,占用8位
printf "|%8.3f|\n" 12.1234
printf "|%-8.3f|\n" 12.1234

#打印\t
printf "%s\t\t%s\n" "hello" "world" #printf "%s\t\t%s\n" "hello" "world"

pstree

查看工作进程的树关系。

# 查询进程树的关系
pstree

read

读取用户的输入。

命令选项 功能描述
-p 显示提示信息
-t 设置读取超时时间
-n 设置读取n个字节后结束,默认读取到\n结束
-r 支持读取\,默认\会转变为转义字符
-s 静默输入,不显示输入内容
#读取用户输入,存储于value中
read -p "请输入数字:" value
echo $value

reboot

重启设备

sudo reboot

service

service主要用于管理系统服务的开启和关闭。

服务的开启是将服务复制到/etc/systemd/system目录下的xx.wants/下,反之则关闭服务。

#开启ssh服务
sudo service ssh start

#关闭ssh服务
sudo service ssh stop

shutdown

shutdown主要用于关闭应用

shutdown [OPTIONS...] [TIME] [WALL...]

-P 同时关闭电源
-c 取消关机计划

TIME:指定关机延时时间,单位s

#当前时间1s后关机
shutdown 1

source

source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录,使用source执行的脚本,不开启子进程。

格式: source [pattern]

# 不开启子进程的方式执行脚本
source file/ch01-03/test.sh
# 不开启子进程的方式执行脚本
. file/ch01-03/test.sh

# 开启子进程执行脚本
./file/ch01-03/test.sh
bash file/ch01-03/test.sh

sudo

sudo主要用于使用管理员权限执行命令,或者切换到root用户。

# 以root权限执行命令
sudo apt-get update

# 切换到root用户
sudo su

# 修改sudo的配置,可以在环境下支持sudo命令
visudo

systemctl

systemctl是用于管理系统服务的命令,是debian自带的管理方法。可通过命令”sudo apt install systemd”安装。服务在使能前,需要放置在”/etc/systemd/system”,才能被成功使能或者关闭。

#使能某项服务
systemctl enable [].service

#关闭某项服务
systemctl disable [].service

#查询某项服务的详细状态
systemctl status syslog

#查询某项服务的工作状态
systemctl is-active syslog

#开机和关闭服务
systemctl start/stop syslog

test

test和[]功能一致,用于判断语句输出是否满足条件,满足输出真,可通过”echo $?”查看输出,输出0表示满足要求。大多数情况下[[]]和[]/test是通用的,只有两种情况,一种是内部使用&&或   逻辑语句,另一个是使用正则匹配。
#比较值并查看
test a == a
echo $?

#判断当前用户是否为root, 输出Y/N
[ $USER == root ] && echo Y || echo N

#逻辑与,-a相当于&&
[ a1 == a -a b == b ] && echo Y || echo N

#逻辑或,-o相当于||
[ a1 == a -o b == b ] && echo Y || echo N

#1. 使用&&,||符合,需要使用[[]], 而不是[]
[[ a == a && b == b ]] && echo Y || echo N

#2.[[]]中支持正则匹配,[]不支持
name="12asffaa"
[[ $name =~ [0-9] ]] && echo Y || echo N
[[ $name =~ [A-Z] ]] && echo Y || echo N

#3.分组匹配
[[ a == a && ( b == b || c == d ) ]] && echo Y || echo N

top

top是一个Linux命令行工具,用于实时监视系统状态和进程活动.

#查询当前cpu的使用率,当前进程
top

tr

tr用于合并字符串中的相同值,只保留一个

#合并多余的a
echo "aaa bbb" | tr -s "a"

#合并空格
echo "a   b   c" | tr -s " "

tty

tty用于查看当前访问的窗口对象

#显示当前的窗口对象
tty

type

Linux中的type命令用于显示指定命令的类型,判断给出的指令是内部指令还是外部指令.

格式: type [选项] [命令行]

# 获取ls所在的目录
type ls

# 显示所有匹配的路径
ls -a ls

ulimit

限制shell启动进程所占用资源的命令

格式: ulimit [option] [size]

-a : 显示当前所有资源限制
-s : 设置线程分配的栈大小
-S : 使用“软”资源限制
-c : 所创建的核心转储文件(core files)的最大大小。

具体示例如下。

# 显示当前所有资源限制
ulimit -a

# 设置线程分配的栈大小
ulimit -s [stack_size]

unalias

unalias 是一个用于删除命令别名的命令。

用法:unalias [选项] [别名]

-a: 删除所有别名

具体实例如下。

# 删除单个别名
unalias myalias

# 删除所有别名
unalias -a

uname

显示系统的当前资源信息。

#查询详细内核版本信息
uname -a

#显示机器的处理器架构
uname -m

#查询内核版本信息
uname -r

unset

取消变量的定义。

#取消变量定义
val=1
echo $val
unset val
echo $val

uptime

uptime是一个用于显示系统已经运行了多长时间的命令。它还会显示当前登录的用户数和系统的平均负载。

# 显示系统已经运行了多长时间的命令
uptime

wc

统计数据的行数,可以配置读取文件,读取信息来进行统计。

#读取文件的行数
cat file.txt | wc -l

whereis

whereis是一个用于查找可执行文件、源代码文件和帮助文件在文件系统中的位置的Linux命令。它只能用于程序名的搜索,并搜索二进制文件、man说明文件和源代码文件。

#查询命令和相关手册文件所在地址
whereis chmod

#只查询二进制文件
whereis -b libc.so

which

which 是一个用于查找并显示指定命令的绝对路径的命令。它在环境变量 $PATH 中搜索指定的命令,并返回找到的第一个匹配项的完整路径。

用法:which [选项] 命令名

# 查询显示命令的位置
which ls

# 显示所有匹配的路径
which -a iptables 

who

查询那些账号登录了当前设备

#查询登录的用户
who

#查询登录用户数目
who | wc -l

#查询登录用户的用户名
who | awk '{print $1}'

who | cut -d' ' -f1

whoami

whoami 是一个用于显示当前登录用户的用户名的命令。

# 显示当前登录用户的用户名
whoami

xrandr

设置界面的分辨率

#方法
xrandr --output <显示器标识符> --mode <新分辨率>

#显示当前支持的界面和分辨率
xrandr

#设置分辨率
xrandr --output XWAYLAND0 --mode "1360x768"

disk_manage

dd

命令用于读取、转换并输出数据,参数说明如下。

这里有些特殊的设备支持dd读取。

  1. /dev/zero特殊输入文件,提供无限的空字符(0)
  2. /dev/null只写文件, 丢弃接收到的数据
  3. /dev/random: 带堵塞的获取随机数文件,硬件生成随机数不足时堵塞读取操作
  4. /dev/urandom: 不会堵塞,随机数不足时,它会返回伪随机数
# 读取boot0_offline_secure_sun50iw9p1.bin值,写入到emmc中(块大小512,跳过256KB地址)
dd if=boot0_offline_secure_sun50iw9p1.bin of=/dev/block/mmcblk0 bs=512 seek=512 conv=notrunc

# 对于SD卡起始的1M容量清零
dd if=/dev/zero of=/dev/sdb bs=1024 count=1024

#跳过1kb,将u-boot写入到SDCard中
dd if=u-boot-imx6ull-14x14-ddr512-emmc.imx of=/dev/sdb bs=1024 seek=1 conv=fsync

#dd从指定外设读取数据,并输出显示
sudo dd if=/dev/random bs=1 count=4 | hexdump -C
sudo dd if=/dev/urandom bs=1 count=4 | hexdump -C

df

在Linux中,df命令用于检查文件系统的磁盘空间占用情况。它可以显示硬盘被占用了多少空间,以及还剩下多少空间等信息。

# 显示已经挂载的磁盘分区
df -h

# 显示所有磁盘相关信息
df -a

du

用于检查文件系统的磁盘空间占用情况。

用法: du [选项] <目录>

-a:递归显示指定目录下所有文件和子目录的磁盘占用情况。
-b:以字节为单位显示磁盘占用情况。
-c:显示总磁盘占用情况。
-h:以人类可读的格式显示磁盘占用情况。

具体示例如下。

# 查询目录下数据的存储占用情况
du -a

fdisk

管理磁盘分区的命令行工具,主要用于创建、删除、修改和查看磁盘分区。

用法: fdisk [选项] <磁盘设备>

-l:列出系统中所有磁盘的分区表信息
-s:显示指定分区的大小
-u:指定显示分区大小的单位(例如, sectors、 cylinders、 heads 等
-b:指定扇区大小(通常为512字节)

具体示例如下。

# 列出所有磁盘的分区表信息(部分磁盘需要权限才能读取,需要sudo权限)
fdisk -l

# 交互式的分区命令
fdisk <disk>

mount

mount命令用于挂载文件系统,它可以将一个设备的文件系统挂载在指定目录。

用法: mount [选项] <设备> <挂载点>

-t <文件系统类型>: 指定要挂载的文件系统类型,例如 ext4、vfat 等
-o <选项>: 挂载时的选项
  - ro:以只读模式挂载文件系统。
  - rw:以读写模式挂载文件系统。
  - remount:重新挂载文件系统。
  - loop: 将普通文件虚拟成块设备进行挂载,用于挂载磁盘镜像文件
  - async: 以异步方式进行 I/O 操作,可能提高性能,但存在数据丢失风险
  - sync: 以同步方式进行 I/O 操作,可能降低性能,但可以保证数据 accuracy
  - noauto: 不自动挂载文件系统,需要手动挂载
  - user:允许普通用户挂载文件系统
  - offset=<偏移量>: 指定挂载的起始扇区偏移量,通常用于挂载镜像文件时指定起始位置
-l: 列出当前已挂载的文件系统
-v:显示详细的挂载过程信息。
-f: 模拟挂载操作,并不实际挂载文件系统,用于测试

具体示例如下。

# 以vfat的格式,将U盘/dev/mmcblk1p1挂载到/mnt/disk/目录
mkdir /mnt/disk
mount -t vfat /dev/mmcblk1p1 /mnt/disk/

# 将u盘/dev/sdb挂载目录
mount -t vfat /dev/sdb /mnt/disk/

# 查看当前已经挂载的目录
mount | grep /mnt/disk

# 挂载mbr格式的img文件
sudo mount -o loop *.img mnt/

# 挂载mbr格式, 起始sector指定的img文件
# start=1024, 则实际偏移为1024*512=524288
# start=2048, 则实际偏移为2048*512=1048576
sudo mount -o loop,offset=1048576 *.img mnt/

# nfs mount
sudo mount -t nfs -o nolock,nfsvers=3 127.0.0.1:/home/freedom/Desktop/remote_manage/sdk/build/nfs_root/arm /mnt/

# 解锁只读权限
sudo mount -n -o remount,rw /mnt/disk

umount

卸载已挂载的文件目录命令,格式: umount [选项] [块设备/文件目录], 在卸载时保证没有任何进程使用该目录,否则会卸载失败。

# 移除指定块设备,被占用则失败
sudo umount /dev/sdb

# 移除指定目录上挂载的块设备,被占用则失败
sudo umount /media/run/

# 移除指定目录上挂载的块设备,被占用会等待占用解除后移除
sudo umount -l /media/run/

net_manage

host

基于dns查询域名和ip的对应关系。

#查询百度的ip地址
host www.baidu.com

ifconfig

ifconfig是Linux中用于显示或配置网络设备(网络接口卡)的命令, 配置和显示Linux内核中网络接口的网络参数,配置网卡的IP地址等网络配置。

用法:ifconfig [选项] [网络设备]

-a:显示所有网络接口的信息,包括未激活的接口。
-s:以简短格式显示网络接口的信息。
-v:显示详细的网络接口信息。
-h:显示帮助信息。

具体示例如下。

# 安装支持ifconfig
sudo apt-get install net-tools

# 显示当前所有的网络设备
ifconfig -a

# 启用或禁用网络接口
ifconfig eth0 up/down

# 配置MAC地址
ifconfig eth0 hw ether 00:11:22:aa:bb::cc

# phy强制模式,设置100Mbps, 全双工,自动协商
ethtool -s eth0 speed 100 duplex full autoneg on

#常见配置网络命令, 启动网络 
ifconfig eth0 192.168.2.99 netmask 255.255.255.0
route add default gw 192.168.2.1
ifconfig eth0 up

ifconfig eth1 192.168.2.100 netmask 255.255.255.0
ifconfig eth1 up

netstat

netstat是一个用于显示网络连接、路由表、接口统计等网络相关信息的命令行工具。

#列出所有活动的网络连接
netstat -a

#列出活动的tcp/udp连接
netstat -at/-au

#查看当前监听得端口
netstat -tunlp 

nslookup

查询internel名称服务器

# 查询百度的ip地址
nslookup www.baidu.com

ping

查询网络主机连接状态

# ping检测和百度的连接
ping www.baidu.com

# ping指定ip的主机
ping 192.168.2.34

# 指定源IP地址,ping指定主机(用于双phy系统架构)
ping -I 192.168.2.100 192.168.2.34

route

设置路由表操作。

#设置默认网关
route add default gw 192.168.2.1

telnet

使用telnet协议登录远程服务器。

telnet [-4] [-6] [-8] [-E] [-L] [-a] [-d] [-e char] [-l user]
        [-n tracefile] [ -b addr ] [-r] [host-name [port]]

traceroute

traceroute 是一个网络诊断工具,用于跟踪数据包从源主机到目标主机所经过的路径。它通过发送一系列的ICMP回显请求(ping)或UDP数据包到目标主机,并记录每个路由器的IP地址和响应时间,从而帮助用户了解网络连接的情况。

用法: traceroute [选项] 目标主机

-I: 使用ICMP回显请求(ping)进行跟踪。
-U: 使用UDP数据包进行跟踪。
-T: 使用TCP SYN数据包进行跟踪。
-p: 指定目标端口号(默认为33434)。
-m: 设置最大跳数(默认30)。
-n: 不解析主机名,直接显示IP地址。

具体示例如下。

# 使用ICMP回显请求跟踪到目标主机的路径
traceroute -I www.baidu.com

# 使用UDP数据包跟踪到目标主机的路径
traceroute -U www.baidu.com

# 使用TCP SYN数据包跟踪到目标主机的路径
traceroute -T www.baidu.com

# 指定目标端口号
traceroute -p 80 www.baidu.com

# 设置最大跳数
traceroute -m 20 www.baidu.com

scp

用于通过ssh远程传输文件的命令

#向指定ip的特定目录传输文件
scp -r [file] [用户名]@[ipAddress]:[directory]

ss

查看服务器当前监听的端口

#查询当前设备的监听端口
ss -nutlp

ssh

远程连接访问ssh服务器,需要先匹配服务器端的sshd_config和请求端的ssh_config

#远程连接
ssh [user]@[ipaddress]

wget

wget是一个用于从网络上下载文件的命令行工具。它支持HTTP、HTTPS 和 FTP 协议,并且可以在后台运行,非常适合在脚本中使用。

用法: wget [选项] [URL]

-O: 指定输出文件名。
-c: 断点续传。
-b: 后台下载。
-q: 安静模式,不显示下载进度。
-P: 指定下载目录。
-i: 从文件中读取 URL 列表。
-r: 递归下载。
-np: 不递归到父目录。
-l: 指定递归深度。
-A: 指定要下载的文件类型。
-R: 指定要排除的文件类型

具体示例如下。

# 下载单个文件
wget https://example.com/file.txt

# 指定输出文件名
wget -O newfile.txt https://example.com/file.txt

# 断点续传
wget -c https://example.com/bigfile.zip

# 后台下载
wget -b https://example.com/bigfile.zip

# 从文件中读取 URL 列表
wget -i url_list.txt

# 递归下载
wget -r -np -l 1 -A .html,.jpg https://example.com/

vim_command

命令名称 功能说明 备注
i 进入编辑模式  
:q! 直接退出 :x等同
:wq 保存退出  
:set number 显示行号  
光标动作 光标移动 数字+光标
h 光标左移
l 光标右移
k 光标上移
j 光标下移
0 光标移到行首
$ 光标移到行尾
H 光标移到屏幕上显示的第一行
L 光标移到屏幕上显示的最后一行
M 光标移到屏幕的中间一行
nG 光标移到第 n 行
w或 W 将光标右移至下一个单词的词首
e 或 E 移动到单词尾部
b 或B 移动到单纯首部
Ctrl+G 显示当前文件状态
:n 移动到指定行
:$ 移动到最后行
dd 删除整行  
D/d$ 删除光标到行尾的数据  
x/X 删除单个字符  
yy 复制光标所在的行  
p 复制行到光标处  
u/U 取消上一个命令  
命令名称 功能说明 备注
/ 在光标处向后搜索内容 n下一处 N上一处
? 在光标处向前搜索内容 n下一处 N上一处
:s 将前面替换为后面 :s/text1/text2
:m,ns 将m:n行之间前面替换为后面 :2,10s/text1/text2

next_chapter

返回目录

直接开始下一章节:Linux平台软件安装使用方法