Linux

hojun · 2025-1-22 · 次阅读


零.一般命令:

0.echo

输出到终端

可选参数:

-n 不换行输出

-e 启用转义,像是\n(换行)

1.cd

cd ~ 命令返回/home

cd - 命令可以在当前目录和上一个目录之前来回切换

2.ls

zl@LAPTOP-ZL ~/rust_learn> ls -l
total 2412
drwxrwxrwx 1 zl zl 4096 Sep 9 22:43 branches/
drwxrwxrwx 1 zl zl 4096 Sep 18 14:44 defining_enum/
drwxrwxrwx 1 zl zl 4096 Sep 9 22:01 functions/
drwxrwxrwx 1 zl zl 4096 Sep 6 12:50 guessing_game/
drwxrwxrwx 1 zl zl 4096 Sep 6 12:13 hello_cargo/
drwxrwxrwx 1 zl zl 4096 Sep 9 23:06 loops/
-rwxrwxrwx 1 zl zl 2469128 Sep 6 11:54 main*
-rw-r--r-- 1 root root 45 Sep 6 11:54 main.rs
drwxrwxrwx 1 zl zl 4096 Sep 18 15:51 match_control_flow/
drwxrwxrwx 1 zl zl 4096 Sep 11 20:07 ownership/
drwxrwxrwx 1 zl zl 4096 Sep 17 23:55 rectangles/
drwxrwxrwx 1 zl zl 4096 Sep 12 13:31 references_and_borrowing/
drwxrwxrwx 1 zl zl 4096 Sep 17 23:20 structure/
drwxrwxrwx 1 zl zl 4096 Sep 12 14:42 the_slice_type/
drwxrwxrwx 1 zl zl 4096 Sep 9 09:05 variables/
  1. 首字母 d 表示是一个 directory(目录)
  2. 前三个字母组,表示 owner of the file 的权限(拥有者)
  3. 中间三个字母组,表示 group of the file 的权限(所在的组)
  4. 最后三个字母组,表示 anyone else 的权限(其他人)
  • 后边的第一个 zl 表示 owner(显示的就是名字),第二个 zl 表示 group(那个用户所在的组)。

  • 三个字母的意思:

    read (读,可以用cat,less,more等命令来查看其内容)

    write(写,对于目录,就是可以创建,删除和重命名,但是你必须同时也有那个文件的权限。对于文件,可以使用文本编辑器(vim,nano等)来修改它,也可以删除它(实际上是修改目录信息))

    execute(执行,对于目录来说,就是否可以打开它)。

    注意:即使对目录有读权限,如果没有执行权限,也无法进入目录,并且会收到 Permission denied 的错误。

举个例子:

-rwxr-xr-- 表示:

  • 这是一个普通文件。
  • 文件所有者具有读、写、执行权限。
  • 文件所属组具有读、执行权限,但没有写权限。
  • 其他用户仅具有读权限。

3.rmdir

删除文件夹,只用为空时才可以

4.cat/tac

打开文件/逆序打开文件

格式有:

cat filename, cat < filename

此时可能会出现

cat < main.rs > test.rs
将main.rs中的内容覆盖到test.rs中

其中>是重定向了该命令

它会将前面命令的输出写入到指向的文件(会清空原有内容,是覆盖操作)

如果文件不存在,这会创建一个新的文件

如果不想覆盖,使用>>来追加重定向,此时内容只会追加到指向文件的末尾

tac可选参数

-b 指定分隔符,默认换行符

-r 将分隔符解释为正则表达式

-s 指定分割符的字符串,覆盖默认的换行符

//不指定文件时,tac会从键盘获取,输入后按ctrl + D,即可逆序显示

5.rm

删除

6.mv

移动&重命名,注意实际上这是个覆盖操作

7.touch

主要功能是修改文件的时间戳,若指定的文件不存在,它会创建空文件

同时创建多个,空格分隔

可选参数:

-a 仅修改访问时间

-m 仅修改修改时间

-c 不存在时也不创建

-d 修改当前时间戳,格式xxxx-xx-xx xx:xx:xx

-t 修改文件时间,格式xxxxxxxxxxxxxx

例如: 202412312359 代表 2024 年 12 月 31 日 23 时 59 分

一.工具,或是脚本用命令:

1.赋值与输出

赋值:foo=bar 可以使用指令输出赋值,比如: foo=$(pwd)

//pwd显示当前工作目录

输出:echo $foo 或者 echo "$foo" ,以及tee

//tee要用|,因为它后面跟的的要输出到的文件

例如:

echo "Hello world" | tee test.rs
比起单纯用>,它可以提权后使用,用于写入一些需要更高权限的文件

//但是不能echo '$foo',因为单引号内的全部都会被视为字面值。

2.source

执行文件内的指令,同时也将里面的函数添加到shell中

例如:

# mcd.sh
mcd () {
mkdir -p "$1"
cd "$1"
}
source mcd.sh
mcd test

3.bash中的特定变量

!! 显示完整的上一条指令

$1 ~ $9 第一个和之后的变量

$_ 上一条命令的最后一个变量,使用快捷键Esc+.自动输入这玩意

(注意:每条命令自身前面有$,说明其也是一个变量)

$? 前一条指令的退出状态码

//成功执行为0,1是一般错误(包括参数错误等),2是语法错误,127是不存在该命令

$$ 当前脚本的PID

$0 当前脚本名称

$@ 所有参数

它会传递该脚本或函数的所有参数列表,用于遍历和操作。它和$*的意义类似,但是当使用“ ”时,$*会当作整体字符串,但是$@是单独的。

$*的整体字符串的分割符是$IFS (内部字段分隔符,默认为空格) )

4.字符匹配

? 只匹配任意一个字符

* 通配符

5.diff

展示两个文件的不同

diff file1 file2
例如:diff <(ls foo/) <(ls bar/)

6.使用环境变量来解析脚本

写在脚本首行

#!/usr/bin/env python
//这是在环境变量中找python解释器

7.find/fd

find . -name src -type d
//.表示在当前文件夹搜索,src是文件名称,d是类型,即文件夹
如果不是文件夹,可以直接接操作(-exec),例如:
find . -name '*.tmp' -exec rm {} \;

8.grep/ripgrep/rg

grep foobar mcd.sh //在mcd.sh中搜索
grep -R foobar . //.同find里的,-R表示递归搜索,使用rg则是默认递归
rg -w recursion . //.同上,-w表示搜索特定单词
//-i表示忽略大小写

grep的可选参数:

-v 反检索,只显示不匹配的行

-c 只显示匹配的行数,但是不输出内容

-l/L 打印匹配/不匹配模板的文件清单

-s 不显示错误信息

-A/B/C 查找某些字符的内容,并下/上/下和上延伸指定行数。

例如:

grep 'test' file.txt:在 file.txt 中查找包含 test 的行。
grep -i 'test' file.txt:在 file.txt 中不区分大小写查找包含 test 的行。
grep -r 'test'.:在当前目录及其子目录中查找包含 test 的行。

9.fzf

需要自己安装

模糊搜索

cat example.sh | fzf

绑定ctrl + R后才能在历史搜索中找到它

10.more/less

more分页显示大文本文件的内容,逐页阅读。

less 分页显示文本文件内容,可前后移动、搜索和编辑,处理大文件性能好。

more的可选参数:

-num 一次显示的行数

-d 显示提示信息(如果操作错误)

-l 遇见特殊字符^L时不会再暂停

-f 计算行数时用实际上的行数

-p 显示前先清屏

-c 显示后清除其他旧资料

-s 多空行只显示一行

-u 不显示行号

+/pattern 显示前搜寻该字串,从它之后开始显示

+number 从第num行开始显示

less的可选参数:

-N 显示行号

-S 禁止水平滚动(会截断长行)

-F 内容少于一屏就直接退出

-X 不适用终端配置,用于脚本

-i 忽略大小写搜索

-m 显示剩余行数

-r 显示特殊字符

-z -4 设置每屏最小行数

-b num 设置缓冲区大小

-e 显示后自动退出

-g 只标记最后搜索的关键词

-o filename 将内容输出到文件

-Q 不使用警告音

-s 含义同more

-x num 规定Tab键为num个空格

(大多数应该是通用的)

例如:

more -s testfile:逐页显示 testfile 的内容,连续空白行合并。
more +20 testfile:从第 20 行开始显示 testfile 的内容。
less example.txt:查看文件内容。
less +20 example.txt:从第 20 行开始显示文件内容。
less -N example.txt:显示文件内容并显示行号。

11.head/tail

head显示文件开头部分

tail显示文件末尾部分,一般用于看日志

head可选参数:

-n 指定行数

-c 指定字节数

例如:

head file.txt:默认显示文件的前 10 行。
head -n 5 file.txt:显示文件的前 5 行。

tail另外的可选参数:

-f 循环读取,追踪更新

-q/v 不显示/显示详细处理信息

–pid=pid 与-f合用,和该进程一起挂掉

-s 与-f合用,每次循环读取间隔s秒

12.sleep

让脚本或程序暂停执行一段时间,起到延时的作用

可选单位:

  • s:秒

  • m:分钟

  • h:小时

  • d:天

    默认是秒

二.命令符:

1.>和>>

见cat命令

2.|(pipe)

管道符

将左侧的程序的输出当作右侧的程序的输入

例如:

ls -l | tail -n2   //tail -n +<N> 表示输出从第N行开始的内容

常常配合grep使用

例如:

curl --head --silent baidu.com | grep Server
//curl用于传输数据。head就是只获取头文件,silent是静默运行,不显示
进度或错误,只输出结果。grep是筛选命令,只输出包含Server的行

以及

pstree -ap | grep fish
//pstree显示进程树a表示每个进程的显示完整命令行,而不只是名称
p表示显示PID(进程标识符)

注意:

对于需要更高权限才能操作的文件,|之后的命令需要提权

比如

sudo echo 3 > brightness //这样不行
echo 3 | sudo tee brightness //要这样
//tee命令会将输入写入文件并打印到标准输出。
另外还有一种写法:
sudo sh -c "echo 3 > brightness"
//这可以使得双引号内的所有命令都获得权限
//sh 是命令行的解释器,-c 是将后面的字符串当作命令来执行(Linux下的脚本文件,就是.sh)

三.快捷键:

1.ctrl + l(clean)

等同于命令clean,相当于windows下的cls,清屏

2.ctrl + R(history)

等同于命令history,显示历史指令

history n  //展示最后n条结果,通常会和grep配合

四.Vim(先留空)

五.Nano

比较重要的:

  1. 移动光标,如果要使用方向键,要按着ctrl
  2. 大多数快捷键,下面都有显示,自己看
  3. nano -Y 启用语法高亮和自带缩进

六.学长的奇怪要求(?)

学长的奇妙问题:

问题一:目录符号都有哪些?用途是啥?

. 当前目录

.. 父目录

~ 主目录

/ 路径分隔符

*和?也算(AI是这么说的)

问题二:什么是绝对目录?什么是相对目录?

从根目录开始就是绝对目录

从当前文件夹开始就是相对

问题三:管道符?重定向命令?他们是啥?有何作用?

上面有

问题四:如何查看当前所在目录?如何切换目录?如何查看目录下都有什么内容?

pwd,cd,ls

问题五:如何创建文件?如何移动文件?如何重命名文件?如何删除文件?如何查看文件内容?如何运行可执行文件?

使用管道符(?)/touch,mv,mv,rm,cat/less/more/head/tail/tac,./前缀(实际上就是给个路径?脚本可以用source)

问题六:如何创建文件夹?如何删除空文件夹?如何删除非空文件夹?

mkdir,rmdir,rm -r/R -f(windows下才是rd /s)

问题七:tac命令?echo命令?sleep命令?

见上

学长的奇妙作业:

  • 在根目录创建一个flag文件
  • 向刚刚创建的flag文件写入flag{test_flag}
  • flag文件追加写入flag{test_flag2}
  • 最后再向flag文件覆盖写入flag{really_flag}
  • 查看当前工作目录
  • 移动当前工作目录至根目录
  • 查看根目录下都有什么文件夹和文件
  • 移动flag文件至根目录下的home文件夹并重命名为fllllll4g
  • 查看fllllll4g文件内容
  • 查看fllllll4g文件以base64编码后的结果
  • 删除fllllll4g文件

base64

base64编码,可以直接用base64命令(确实有这玩意儿)

//使用-d参数改为解码

所以可以。。。。。。

echo "这里替换为Base64编码字符串" | base64 -d > decoded_fllllll4g

七.其他东西

1.od

用于以八进制、十进制、十六进制等不同格式显示文件的内容,常用于查看二进制文件,也能查看文本文件。通过不同选项可以指定输出格式和显示范围。

可选参数:

-t 指定格式,c是字符格式,x是十六进制,d是十进制

注意要写为类似于-tc的格式

2.hexdump

专门用于以十六进制格式显示文件内容,同时会显示对应的 ASCII 字符,对于分析二进制文件、查看文件的十六进制编码很有帮助。

可选参数:

-C 以标准16进制和ASCll码对照格式输出

实际效果类似于od -tc

3.grep

是的,这东西真的可以,瞎搜就行

例如:

grep -n 'server' config.txt

4.awk

一种强大的文本处理工具,可以按行读取文件,对每行内容进行处理和分析。它支持对字段进行分割、提取、计算等操作,常用于数据处理和报表生成。

格式:

awk '模式 {动作}' 文件名

示例:假设 data.txt 文件内容是用空格分隔的表格数据,要输出每行的第一个字段,可以使用以下命令:

awk '{print $1}' data.txt 
//全部输出就直接{print},另外,$0表示整行

可以用条件过滤行:

awk '$3 > 80 {print}' score.txt
//只输出第三列大于80的

可以求列和:

awk '{sum += $2} END {print sum}' sales.txt

//END 是一个特殊的模式,表示在处理完所有行后执行相应的动作,这里用于输出总和。

5.sed

一个文本处理工具

格式

sed '命令' 文件名

替换文本

sed 's/apple/banana/g' text.txt
//s表示替换操作,g表示全局替换

删除指定行

sed '5,10d' log.txt
//d表示删除操作,`5,10`表示行号范围

插入文本

sed '3a New line' info.txt
//a表示在指定行后面追加

然而如果只是像输出其内容,命令留空

或者

sed 'p' example.txt
为了避免输出重复,用-n
sed -n 'p' example.txt
这样可以进一步,显示指定行
sed -n '5p' example.txt
多行
sed -n '3,5p' example.txt

还可以匹配内容,类型于grep

sed -n '/error/p' log.txt 
//显示所有包含error的行
//这里 /error/ 就是一个模式,sed 会查找文件中所有匹配该模式的行,并使用 p 命令将其打印出来

一个好奇的人