# 零。一般命令:
# 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/
- 首字母 d 表示是一个 directory(目录)
- 前三个字母组,表示 owner of the file 的权限(拥有者)
- 中间三个字母组,表示 group of the file 的权限(所在的组)
- 最后三个字母组,表示 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
比较重要的:
- 移动光标,如果要使用方向键,要按着
ctrl
- 大多数快捷键,下面都有显示,自己看
- 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 命令将其打印出来 |