Skip to content

一. 常用 Linux 命令

1.1 关机重启命令

开机谁都会,接上电源按开机键就行了。关机的操作倒是五花八门。linux 的关机重启命令有以下几个。

Usage: shutdown [OPTIONS...] [TIME] [WALL...]

  • -H 挂起
  • -h times 过 times 时间后执行 shutdown 命令
  • -c 取消关机
  • -r 重启
# 关机命令
shutdown now
init 0
poweroff
systemctl poweroff

# 重启命令
reboot
systemctl reboot
shutdown -r
init 6

1.2 Linux 快捷键

以下命令在终端中生效,可以增加敲命令的效率

快捷键 说明
ctrl + a 光标移动到行首
ctrl + e 光标移动到行尾
ctrl + b 光标向左移动一个符号的位置,同左方向键
ctrl + f 光标向右移动一个符号的位置,同右方向键
ctrl + u 剪切当前光标所在行的内容
ctrl + k 剪切当前光标所在行,右边的内容
ctrl + y 粘贴如上快捷键剪切的内容
ctrl + l 清屏,同 clear 命令
ctrl + d 退出当前 shell,
ctrl + z 让当前正在运行的命令,转到后台挂起
esc + f 把光标移动到单词的结尾
esc + b 把光标移动到单词的开头
esc + . 在当前光标处插入,上条命令的最后一个参数。(上条命令没有参数则插入命令)

1.3 Linux 基础命令补充

一些使用不多,但很有用的命令及参数。

1.3.1 ls

Usage: ls [OPTION]... [FILE]...

  • -t 按修改时间排序,newest first!
  • -S 按文件大小排序,largest first!
  • -r 反转,倒置,排序条件
  • -s 在第一列输出文件及文件夹所占的实际空间大小
  • -A 不显示 . 和 .. ,当前目录和上级目录
  • -x 按行打印,默认按列打印
  • -X 按文件类型排序,可以用该选项达到优先
  • -1 list one file per line

1.3.2 cp

cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...

  • -a 等同于 ==-dpR==,一般用于备份
  • -l 复制文件时,不复制真实文件,而是创建硬链接指向文件,节省空间
  • -p 复制时保持源文件的元数据信息

1.3.3 cat

# 显示行号
cat -n file

1.3.4 vim

vim 全称 vi improved。

1.3.4.1 编辑模式命令

进入编辑模式命令有很多,最常用的是 i ,在光标当前所在处后面插入。还有一些其他命令可以在其他位置插入。如下表所示

命令 说明
i 正常插入
I 在当前光标所在行的行首插入
a 正常插入
A 在当前光标所在行的行尾插入
o 在当前光标所在行下方,插入一行,把光标定位在该行,进入编辑模式
O 在当前光标所在行上方,插入一行,把光标定位在该行,进入编辑模式
cw ce 光标处在单词中时,删除当前光标所在处开始(包括光标处字母),到单词结束的部分,进入编辑模式
cb 光标处在单词中时,删除当前光标所在处开始(不包括光标处字母),到单词开始的部分,进入编辑模式
ci" 光标需在引号内,删除当前双引号内的所有内容,只留下双引号在,进入编辑模式
ciw 光标处在单词中时,删除当前单词,进入编辑模式
cl s 光标处在单词中时,删除光标所在处的字母,并原地不动地进入编辑模式
cc S 删除光标所在处的行,进入编辑模式
C 删除当前光标所在处开始(包括光标处字母),到行尾的部分,进入编辑模式

1.3.4.2

1.3.5 日志查看命令

日志文件一般都不小,少则几百兆,多则可达几十G。用 cat 命令查看,狂按 ctrl + c 都停不下来!vi / vim 要把日志加载进内存,800M 大小的日志文件就把当前窗口卡得要死。

1.3.5.1 less

按页显示文件内容

less 快捷键

快捷键 功能说明
导航操作
空格 / f 向下翻一页
b 向上翻一页
d 向下翻半页
u 向上翻半页
j / ↓ 向下移动一行
k / ↑ 向上移动一行
g 跳到文件第一行
G 跳到文件最后一行
10g 跳到第10行
50% 跳到文件50%位置
搜索功能
/pattern 向前搜索(正则表达式支持)
?pattern 向后搜索
n 跳转到下一个匹配项
N 跳转到上一个匹配项
&pattern 仅显示匹配行(过滤模式)
文件操作
:e filename 打开新文件
:n 查看下一个文件(多文件打开时)
:p 查看上一个文件
R 重新加载当前文件
显示控制
-N 切换行号显示
-S 切换长行截断(不换行)
F 实时跟踪模式(类似 tail -f,按 Ctrl+C 退出)
v 用系统编辑器(如vim)打开当前文件
其他
h 显示帮助文档
q 退出less
= 显示文件信息(行数/字节数/当前位置)
m+字母 设置标记(如 ma 标记当前位置为a)
'+字母 跳转到标记位置(如 'a 跳转到标记a处)

1.3.5.1 more

more 按页显示文件内容,到达最后一行就退出,相比 less 功能更简单,兼容性更好。

在 arch 打开一个 ==单行== 800M 日志文件不卡顿!

Usage: more [options] <file>...

参数 说明
-d 显示提示信息(按空格继续等)
-f 强制显示非文本文件(如二进制)
-p 不清屏,覆盖当前页面显示
-s 合并多行空行为一行
+n 从第n行开始显示
+/str 从匹配字符串的位置开始显示

交互命令

快捷键 功能
空格 向下翻一页
Enter 向下翻一行
b 向上翻一页(部分系统不支持)
= 显示当前行号
/pattern 搜索字符串(不支持正则)
:f 显示文件名和行号
q 退出
h 显示帮助

1.3.5.3 head

head 顾名思义,头,查看文件头部的命令。

Usage: head [OPTION]... [FILE]...

  • -n nums 从头开始显示 nums 行
  • -c nums 从头开始打印 nums 个字节,后面可以接单位
    • b 512-byte 表示 磁盘块(block),传统大小为 512字节,(源自早期磁盘 sector 大小,现代工具仍保留兼容性)
    • k kilobytes (1024 bytes) 千字节
    • m megabytes (1024×1024 bytes) 兆字节
    • g gigabyte (1024x1024) 吉字节

参数 -n 后面的数字很有讲究,下面演示

1
2
3
4
head -n5 txt    #打印前 5 行内容
head -n 5 txt   #打印前 5 行内容

head -n -5 txt  #从头开始打印,直到最后 5 行不打印

1.3.5.4 tail

同 head 命令类似,打印文件尾部。

Usage: tail [OPTION]... [FILE]... - -n nums 打印尾部 nums 行的信息 - -f 持续查看文件的新增内容 - -c nums 从尾部开始打印 nums 个字节,后面可以接单位。b=512字节,k=1024字节,m=1024个k字节,g=1024个m字节

参数 -n 和 head 类似

1
2
3
4
tail -n 5 txt   #打印最后 5 行内容
tail -n +5 txt  #从第 5 行开始打印(不包括第 5 行)

tail -c 1b txt  #打印 512 个字节的内容

1.3.6 wc

统计命令,可以统计字符、行、字节个数

Usage: wc [OPTION]... [FILE]... wc [OPTION]... --files0-from=F - -c 统计字节 - -m 统计字符 - -w 统计单词个数 - -l 统计行 - -L 统计文件内,单词最大的字符个数,汉字算俩字符

Linux 三剑客

.1 正则表达式

    - .     匹配除了行结束符的所有字符
    - ^     匹配以某字符串为行开头的行
    - $     匹配以某字符串为行结尾的行
    - []    匹配括号在任意字符,[a-z]a到z的,[aert]4个字符中的任意一个,[^aert]非这4字符中的
    - |     或,“A|B”匹配A或者B
    - ?     出现0~1次,“colou?r”可以匹配Colour和Color
    - *     出现0~无穷次
    - +     出现1~无穷次
    - ()    分组
    - 

.2 AWK

awk 是一个强大的文本分析工具,文档

.2.1 awk 工作流程

awk最开始会执行BEGIN里的代码,然后读取一行input stream,从第一条命令开始,依次对这行进行文本过滤,直到命令都执行完毕。再读取下一行input stream重复上面的工作。所有命令都对输入文本执行完毕后,再执行END代码块。

.2.2 使用 awk

awk 有两种执行方式,命令式,文件式

  • 命令式

    awk [options] file ...
    awk '{print}' marks.txt 
    

  • 文件式

    1
    2
    3
    4
    5
    awk [option] -f file ....
    awk -f command.awk marks.txt
    
    cat command.awk
    {print}
    

.2.3 内置变量

.2.4 AWK 内置变量说明

变量名 描述
ARGC 命令行提供的参数个数(包含 awk 本身)
ARGV 存放命令行参数的数组,索引范围 0ARGC-1
ARGIND 当前正在处理的文件在 ARGV 中的索引(从 1 开始)
CONVFMT 数值转换为字符串的格式,默认 %.6g
ENVIRON 环境变量的关联数组(如 ENVIRON["USER"]
FILENAME 当前输入文件的名称
FS 输入字段分隔符(默认空格/制表符)
FIELDWIDTHS 按固定宽度分割字段(覆盖 FS
NF 当前行的字段数量(列数)
NR 当前处理的总行号(跨文件累计)
FNR 当前文件的行号(每个文件重置为 0
OFMT 数值输出格式,默认 %.6g
OFS 输出字段分隔符(默认空格)
ORS 输出行分隔符(默认换行符 \n
RLENGTH match() 函数匹配的字符串长度
RS 输入行分隔符(默认换行符 \n
RSTART match() 函数匹配的字符串起始位置
SUBSEP 数组下标分隔符(默认 \034
BINMODE 非 POSIX 系统下指定二进制 I/O 模式(1/2/3"rw"/"wr"
ERRNO getline 重定向或 close 调用失败时的错误信息
IGNORECASE 设置为非零时,模式匹配忽略大小写
LINT 动态控制 lint 警告(设置后输出警告,"fatal" 时转为致命错误)
PROCINFO 进程信息的关联数组(如 UID、PID 等)
TEXTDOMAIN 程序的文本域(用于国际化字符串翻译)

.2.5 实战示例

# 示例:统计文件行数和字段数
BEGIN {
    print "Start processing..."
    FS = ","  # 设置输入字段分隔符为逗号
}
{
    printf "Line %d (%s): %d fields\n", NR, FILENAME, NF
}
END {
    print "Total lines processed:", NR
}


# 修改分隔符
awk BEGIN { FS = ":" } file.txt  # 冒号分隔字段

# 多文件处理:NR 跨文件累计,FNR 按文件重置

# 二进制模式
BEGIN { BINMODE = 3 }  # 所有文件使用二进制 I/O

2.6 运算符

awk拥有着和高级编程语言一样的运算符,“加减乘除模、逻辑运算和三元运算符”。awk基本运算语法和高级语言语法一样,值得注意的是,awk的赋值运算符不是如 a=a*b这般,而是 a*=b
字符串拼接:把要拼接的词用空格分开即可,不需要用+号连接。
匹配运算符为 “~”:用于搜索包含匹配模式字符串的域,例:“$0 ~ 9” 输出包括9的行。
指数运算有两个:

  • * :a* 2 相当于a[^2]次方
  • ^ :a^2 相当于a[^2]次方

.3 sed

.4 grep

使用 Linux 时遇到的一些问题

1. sudo + 命令提示 command not found

1.1 问题描述

ubuntu 24.10 系统,在执行命令 sudo mysql 时提示 Command not found

1.2 解决办法

  1. 在执行 sudo 命令前,添加 sudo -i
  2. sudo vim /etc/sudoers,找到这行 Defaults secure_path="/usr/sbin:/usr/bin:/sbin:/bin",在里面添加 mysql 的路径就行

1.3 原因

sudo 默认不会继承当前用户的 PATH,而是使用一个非常受限的「安全 PATH」,通常只包含:/usr/sbin:/usr/bin:/sbin:/bin