Linux指令集


写在前面

Linux是一种开源的操作系统,在linux系统中,一切皆文件,因此命令行是与系统交互的主要方式。本文档将介绍一些常用的Linux指令,帮助你更好地理解和使用Linux系统。

目录操作

cd

cd <目录路径>

常见指令如下:

cd /    // 切换到根目录
cd .. // 切换到上一级目录
cd ~ // 切换到当前用户的主目录
cd - // 切换到上一次所在的目录

同时,cd命令也支持相对路径和绝对路径。例如:

cd /home/user/Documents   // 绝对路径
cd ../Downloads // 相对路径

ls

ls 用来查看当前目录下的文件文件夹

ls <目录路径>

常见指令如下:

ls         // 列出当前目录下的文件和文件夹
ls -1 //每行一个列出当前目录下的文件和文件夹
ls -a // 列出当前目录下的所有文件和文件夹,包括隐藏文件

mkdir

mkdir 用来创建新的目录。

mkdir <目录名称>

rmdir

rmdir 用来删除目录。

rmdir <目录名称>

pwd

pwd 用来显示当前所在的目录绝对路径

pwd

PS:所有的目录指令都要注意当前所处的目录位置。

文件操作

touch

touch 用来创建新的文件。

touch <文件名称>

rm

rm 用来删除文件。

rm <文件名称>

常见指令如下:

rm -i <文件名称>   // 删除文件前进行确认
rm -f <文件名称> // 强制删除文件,不进行确认
rm -r <目录名称> // 递归删除目录及其内容

cp

cp 用来复制文件或目录。

cp <源文件或目录> <目标目录>

常见指令如下:

cp <源文件> <目标目录>   // 复制文件到目标目录
cp -r <源目录> <目标目录> // 递归复制目录及其内容到目标目录

mv

mv 用来移动或重命名文件或目录。

mv <源文件或目录> <目标目录或新名称>

常见指令如下:

mv <源文件> <目标目录>   // 移动文件到目标目录
mv <源目录> <目标目录> // 移动目录到目标目录
mv <源文件或目录> <新名称> // 重命名文件或目录

diff

diff 用来比较两个文件或目录的内容差异。

diff <文件或目录1> <文件或目录2>

vim

vim 是一个强大的文本编辑器,用于编辑文件。

vim <文件名称>  // 打开文件进行编辑
I // 进入插入模式,可以编辑文件内容
edit // 编辑文件内容
Esc // 退出插入模式,回到命令模式
Shift + ; // 进入命令模式,可以执行保存、退出等命令
wq // 保存并退出
./<文件名称> // 文件运行

cat

cat 用来查看文件内容。

cat <文件名称>

文件查找

find

find 用于查找某个名字的文件。

find <路径> -name "<文件名>"

tree

tree 用来以树状结构显示目录结构。

常见指令如下:

tree       //显示当前目录的树状结构
tree <目录> //显示指定目录的树状结构
tree -d //只显示目录,不显示文件
tree -a //显示所有文件和目录,包括隐藏文件
tree -L <层级> //限制显示的目录层级

文件编辑

之前了解到vim可以用来编辑文件,接下来介绍文本编辑常用的三驾马车:grepsedawk

grep

grep 用于在文本中搜索匹配的字符串。

grep "要查找的字符串" <文件名>

常用指令如下:

grep -i "要查找的字符串" <文件名>   // 忽略大小写进行搜索,输出形式为 匹配行的内容
grep -r "要查找的字符串" <目录> // 目录递归搜索,输出形式为 文件路径:匹配行的内容
grep -n "要查找的字符串" <文件名> // 输出形式为 行号:匹配行的内容

sed

sed 是一个流编辑器,用于对文本进行替换、删除、插入等操作。

sed [选项] '命令' <文件名>

选项主要有:

-i    // 直接修改文件内容,否则不改变文件,只在终端输出
-n // 只输出被修改的行,否则输出整个文件

常用命令如下,注意一般情况下使用单引号 ' 来包裹命令。

sed '2a 要插入的文本' <文件名>   // 在第2行后插入文本(Append)
sed '2i 要插入的文本' <文件名> // 在第2行前插入文本(Insert)
sed '2c 要替换的文本' <文件名> // 替换第2行的文本(Change)
sed '2d' <文件名> // 删除第2行(Delete)
sed -n '2p' <文件名> // 只输出第2行(Print)
sed -n '2,4p' <文件名> // 输出第2行到第4行的内容
sed 's/要替换的字符串/替换后的字符串/g' <文件名> // 替换文件中所有匹配的字符串(Substitute)

awk

awk 用于对文本进行模式匹配和处理,常用于文本分析和数据处理。常见的使用模板如下:

awk '匹配模式{执行动作}' <文件名>

匹配模式决定处理哪些行。可以是正则表达式、行号限制等。如果不写,默认处理每一行;执行动作决定找到指定的行之后干什么,如果不写,默认打印出找到的行。

awk 最强大的地方在于,每读入一行文本,它就会自动按照空格Tab键把这行文本成若干块。同时还为我们提供了极其方便的内置变量,见下表:

变量名 详细解释与用途
$0 代表当前这一整行的内容。
$1, $2 代表被切割后的第 1 列、第 2 列…以此类推。
NF Number of Fields:当前行一共有多少列$NF 通常用来表示最后一列。
NR Number of Records:当前的行号。处理到第 5 行,NR 就是 5。
FS Field Separator:字段分隔符。默认是空格/Tab,可以用 -F 选项修改。

光看这些可能有点抽象,我们来看一个例子:

grep -n "hello" <文件名> | awk -F ":" '{print "第"$1"行的内容是: "$2}'

tail

tail 用于查看文件的最后几行内容。通常用于输出文件最后几行内容到终端。

tail -n <行数> <文件名>     // 输出文件最后n行内容
tail -n +<行数> <文件名> // 从第n行开始输出文件内容

文件阅读

ctags

ctags 用于生成代码标签,帮助开发者快速定位代码中的函数、变量等定义。

为了跨目录使用,首先打开~/.vimrc文件,添加以下内容:

set tags = tags
set autochdir

假设hello.c文件中有void test_ctags()函数,我们在 second 目录下新建ctags_test.c文件,输入以下内容:

#include <stdio.h>
int main() {
test_ctags();
return 0;
}

当前目录下使用以下命令生成tags文件:

ctags -R * // 递归生成当前目录及子目录下所有文件的标签

得到的目录架构为:

.
├── hello.c
├── second
│ └── test_sctags.c
└── tags

接下来在second目录下进入 ctags_test.c 文件编辑,在test_ctags()函数名上按下 Ctrl + ] 键,vim会自动跳转到 test_ctags() 函数的定义处。再按下 Ctrl + t 键(可能也是 Ctrl + O),可以返回到之前的位置。

C语言编译

gcc

gcc 是GNU编译器套件,用于编译C语言程序。

gcc -E <源文件.c> -o <预处理文件.i>  // 预处理阶段
gcc -S <源文件.c> -o <汇编文件.s> // 编译阶段
gcc -c <源文件.c> -o <目标文件.o> // 汇编阶段
gcc <目标文件.o> -o <可执行文件> // 链接阶段

gcc <源文件.c> -o <输出文件> // 直接编译并链接生成可执行文件
./<输出文件> // 运行编译后的程序

快捷键操作

Ctrl + C   // 终止当前正在运行的命令
Ctrl + Z // 暂停当前正在运行的命令
Ctrl + D // 结束输入,通常用于退出终端或结束文件输入
Ctrl + A // 将光标移动到行首
Ctrl + E // 将光标移动到行尾
Ctrl + U // 删除光标前的内容
Ctrl + K // 删除光标后的内容
Ctrl + L // 清屏
Up Arrow // 显示之前输入的命令
Down Arrow // 显示之后输入的命令
Tab // 自动补全命令或文件名

make & makefile

make 是一个自动化构建工具,用于管理和自动化编译过程。makefile 是一个文本文件,定义了构建规则和依赖关系。

target: dependencies
command

target 分为两类:文件目标伪目标。文件目标是指生成的文件,伪目标是指不生成文件的目标,通常用于执行特定的命令。例如:clean

.PHONY: clean  // 声明clean为伪目标

my_app: main.o utils.o
gcc main.o utils.o -o my_app

main.o: main.c
gcc -c main.c

utils.o: utils.c
gcc -c utils.c

clean:
rm -f *.o my_app

这里我们来看一个有意思的例子,注意这个例子设计很多知识盲区,建议深入理解一下。如果我们要操作的目录如下:

.
├── code
│ ├── Makefile
│ ├── fibo.c
│ └── main.c
├── include
│ └── fibo.h
└── Makefile

现在,在根目录和code目录下的 Makefile 中输入内容,从而实现编译 code 目录下的 main.cfibo.c 文件,并且在根目录链接生成可执行文件 fibo ,在 code 目录下生成 *.o 文件。最后在根目录的 Makefile 中添加 clean 功能,删除 code 目录下的 *.o 文件。很多第一次上手的同学都会在 Makefile 中写入 cd mv 等指令来实现目录切换和文件移动,其实大可不必,只要指明操作的路径即可。且看答案如何操作:

./Makefile         //注意这就是个注释

.PHONY: clean //clean声明为<伪目标>,即执行的动作,注意 ":" 别漏

fibo: code/main.o code/fibo.o
gcc code/main.o code/fibo.o -o fibo

code/main.o code/fibo.o:
make -C code // 直接调用code目录下的Makefile进行编译

clean:
rm -rf code/*.o (或者 make -C code clean 到 code 目录下的 Makefile 中编辑)
./code/Makefile    //注意这也是个注释

all: main.o fibo.o

main.o: main.c
gcc -I../include -c main.c -o main.o // 注意这里的-I参数指定了头文件的路径

fibo.o: fibo.c
gcc -I../include -c fibo.c -o fibo.o

最后,我们说明一下 cd 为何无效,因为每个命令都在一个新的 shell 中执行, 所以无论你怎么 cd ,在下一条命令执行前都会返回到当前目录,等于没用。

Bash 脚本

bash 脚本是一种用来自动化执行一系列命令的脚本文件。它以.sh为扩展名,包含了Linux命令和控制结构.

一个简单的 bash 脚本包括三部分:

#!/bin/bash  // 指定脚本的解释器
# 这是一个注释
echo "Hello, World!" // 输出文本

如果在执行 bash 脚本时遇到权限问题,可以使用以下命令赋予执行权限:

chmod +x <脚本文件.sh>

如果不想解决权限问题,也可以直接使用以下命令运行脚本:

bash <脚本文件.sh>

然后可以通过以下命令运行脚本:

./<脚本文件.sh>

变量

在 bash 脚本中,可以使用变量来存储和操作数据。变量不需要声明,直接赋值即可。

#!/bin/bash
name="Alice" // 定义变量,注意等号两边不能有空格
echo "Hello, $name!" // 使用变量

参数

bash 脚本可以接受命令行参数,这些参数在脚本中通过特殊变量访问。

#!/bin/bash
echo "第一个参数: $1" // 第一个参数
echo "第二个参数: $2" // 第二个参数

执行./<脚本文件.sh> arg1 arg2会输出:

第一个参数: arg1
第二个参数: arg2

两个特殊的参数:

**$#**:表示传递给脚本的参数个数。
**$@**:表示传递给脚本的所有参数,作为一个字符串。

条件语句

if condition
then
# 条件为真时执行的命令
elif another_condition
then
# 另一个条件为真时执行的命令
else
# 条件都不满足时执行的命令
fi

这里的 condition 的形式为 [ expression ],其中 expression 可以是关系表达式、字符串比较等。并且 [e 以及 ]n 之间必须有空格。

如果把中括号换成中括号 [[ expression ]],则可以使用更多的条件表达式,例如:[[ $a -gt 10 && $b -lt 20 ]]

循环语句

while condition
do
# 条件为真时执行的命令
done

这里特别注意一下 condition 的形式为 [ expression ],其中 expression 可以是关系表达式、字符串比较等。并且 [e 以及 ]n 之间必须有空格。

函数

function function_name() {
# 函数体
return int_value // 可选,返回一个整数值
}

Attention:函数调用时需要用$?来获取函数的返回值。

Bash 脚本语法

关系运算符

-eq ==  // 等于
-ne != // 不等于
-gt > // 大于
-ge >= // 大于等于
-lt < // 小于
-le <= // 小于等于

关于变量

  1. 变量只有在 "中才能展开,' 会阻止展开。例: sed -i "s/$2/$3/g" "$1" 正确,sed -i 's/$2/$3/g' "$1" 错误。
  2. 文件名最好用双引号括起来,以防止文件名中包含空格或特殊字符导致的问题。例同上。
  3. 算数运算常用以下指令:
let a=a+1
(( a++ ))
(( a = a + 1 ))
b=$(( a + 1 ))

我们不难看出双小括号常常用于算数表达式中,且在双小括号中变量不需要加 $ 符号。

关于字符串

这里主要介绍一下关于字符串的 测试操作符 :

-z "$str"  // 判断字符串是否为空,返回true如果字符串长度为0
-n "$str" // 判断字符串是否非空,返回true如果字符串长度不为0
"$str1" == "$str2" // 判断两个字符串是否相等,返回true如果相等
"$str1" != "$str2" // 判断两个字符串是否不相等,返回true如果不相等
"$str1" > "$str2" // 判断字符串1是否大于字符串2,返回true如果字符串1大于字符串2,按照字典顺序比较
"$str1" < "$str2" // 判断字符串1是否小于字符串2,返回true如果字符串1小于字符串2,按照字典顺序比较

免交互文档

免交互文档 是指在执行命令时不需要用户进行交互输入的文档,多用于将一大段文本原封不动地传递给一段命令。常用的语法如下:

cat << EOF > <文件名>   // 将EOF之间的内容写入文件
// 这里是要写入文件的内容
EOF

这里的EOF仅仅是自定义分隔符,你当然可以把他换成 APPLE, BANANA, BUAA 等等,只要保证分隔符前后一致即可。我们注意到,上述命令中的 EOF 并没有被 '" 包裹,这意味着在 EOF 之间的变量和命令会被shell进行解析,反之则原样输出。

小贴士:

脚本文件要善用重定向

重定向

重定向是指将命令的输入或输出重定向到文件或其他命令。Linux中有三种标准流:标准输入(stdin)、标准输出(stdout)和标准错误(stderr)。重定向可以用来将这些流重定向到文件或其他命令。

输出重定向

command > file.txt   // 将命令的输出重定向到文件,覆盖原有内容
command >> file.txt // 将命令的输出重定向到文件,追加到原有内容
command 2> error.txt // 将命令的错误输出重定向到文件,覆盖原有内容
command 2>> error.txt // 将命令的错误输出重定向到文件,追加到原有内容

输入重定向

command < input.txt   // 将文件的内容作为命令的输入

举个例子:

cat < input.txt   // 将input.txt的内容输出到终端
grep "要查找的字符串" < input.txt // 在input.txt中搜索匹配的字符串

管道

管道(|)用于将一个命令的输出作为另一个命令的输入。

command1 | command2   // 将command1的输出作为command2的输入

几个明显的例子:

cat file.txt | grep "要查找的字符串"   // 在file.txt中搜索匹配的字符串
cat a.txt | cat >> b.txt // 将a.txt的内容追加到b.txt中

权限操作

chmodLinux 系统中用来改变文件或目录访问权限的指令。权限分为三类:UserGroupOther,每类权限又分为读(r)写(w)执行(x)三种。

添加权限时使用 +,删除权限时使用 -,设置权限时使用 =

chmod u+x <文件名>   // 给用户添加执行权限
chmod g-w <文件名> // 给用户组删除写权限
chmod o=r <文件名> // 给其他用户设置只读权限

同时,chmod 还支持数字表示法,其中每个权限对应一个数字:读(r)=4,写(w)=2,执行(x)=1。通过将这些数字相加,可以表示不同的权限组合。例如:

chmod 755 <文件名>   // 设置权限为 rwxr-xr-x
chmod 644 <文件名> // 设置权限为 rw-r--r--
chmod 700 <文件名> // 设置权限为 rwx------

Lyrics Shring

一叶轻船
一双月对半
一帘清梦悠悠醉意阑珊
移舟靠岸
案前唯剩空盏
莫怨良辰短
曲终了韵意未完

最后

本篇博客写于笔者操作系统课程学习期间,内容可能存在不完善之处,如果浪费了您宝贵的时间,笔者深表歉意。后续会继续更新完善,欢迎大家提出宝贵意见和建议。

Thanks for reading!


文章作者: Cordial-Kid
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Cordial-Kid !
  目录