Linux 常用命令
什么是Linux
提起Linux我们一般说的是两类系统:Linus编写的开源操作系统;广义的操作系统。
Linux有两个版本 内核版本和发行版本
- 内核版本
- https://www.kernel.org/
- 版本号命名规则:主版本号,次版本号,末位版本号,次版本号是奇数为开发板,偶数为稳定版
- 发行版本
- Redhat Fedora centos Ubuntu 这些,它们添加了一些开源的软件,像图形桌面,方便普通人使用
如果想要体验Linux系统可以通过虚拟机或阿里腾讯云等云主机服务商 它们一般有新用户免费体验1个月。一个月后自己熟练Linux后在装个双系统就可以了
为什么要学Linux
前端工程化,会有云构建云发布的场景,这些一般是和线上环境相同会使用到Linux相关知识。
UI自动化测试,会有多用例并行执行的需求,测试工程师需要具有这方面的能力,否则还不如进外包。
Linux 交互:shell
** 什么是shell**
- 系统自带的shell
BIOS 系统初始化
UNIX 的哲学: 一条命令只做一件事
为了组合命令和多次执行,使用脚本来保存需要执行的命令
赋予该文件执行权限
标准的shell
- Sha-Bang
万能的帮助命令- man帮助
- help帮助
- info帮助
使用网络资源
系统操作
服务管理
Shell
文本操作
tar
:打包的目的是为了方便归档、管理, 压缩的目的是为了减少磁盘空间的消耗。
tar [-option] 打包名 + 需要打包的文件
:tar -cvf dabao.tar ./ a b c
解包: tar -xvf dabao.tar -C dabaodir
-c : 建立一个包
-v: 打包过程中显示被打包的文件
-f: 需要打包的内容为文件
- x :解包
压缩和解压
压缩
tar -zcvf yasuo.tar.gz file1 file2 file3
解压缩 命令:tar -zxvf yasuo.tar -C yasuodir
文件权限
chmod u+rx filename 可执行权限
执行命令
bash ./filename.sh
./fielname.sh 需要由可执行权限
source ./filename.sh
.filename.sh
bash ./ 会 产生一个子进程来执行shell 脚本
内建命令 不需要创建子进程
内建命令对当前shell 生效
管道和重定向
管道和管道符
子进程和信号一样,也是进程通信的方式之一
匿名管道(管道符)是Shell 编程经常用到的通信工具
管道符 “|” 将前一个命令执行的结果传送给后面的命令
ps |cat
!/bin/bash
声明为bash 脚本
cd ls
cd /var ls
cd /var/ ;ls
cd /var/ ;ls ;pwd; du -sh; du -sh *
cd /var/ ;ls ;pwd; du -sh; du -sh *
echo 123 |ps
echo 223 | cat |cmd
重定向
一个进程默认会打开标准输入,标准输出,错误输出三个文件描述符
输入重定向 <
read var < /path/to file
输出重定向 > , >>, 2>, &> >> 追加 2 > 输出错误 & >
echo 123 >/path/to/file
输入和输出重定向组合使用
cat /path/to/a/file << EOF
I am $USER
EOF
变量
变量的定义,变量的赋值,变量的引用,变量的作用范围,系统环境变量,环境变量配置文件
赋值运算符
= 赋值运算符,用于算数赋值和字符串赋值
使用unset 取消为变量的赋值
= 除了作为赋值运算符还可以作为测试操作符
算数运算符
基本的运算符
-
- */ ** %
变量的命名规则 - 字母, 数字,下划线
不以数字开头
为变量赋值的过程,称为变量替换
变量名=变量值 a = 123
使用 let 变量赋值 let a= 10 +20
将命令赋值给变量 l = ls
将命令结果赋值给变量, 使用 $() 或者 `` , letc = $ (ls -l /etc)
变量值有空格等特殊字符可以包含在 " " 或 '' 中
变量引用 ${变量名} 称作对变量的引用 echo ${变量名} 查看变量名 ${变量
名} 在部分情况下可以省略为 $变量名
变量作用范围 只能作用于当前终端
bash xx.sh ---> 产生一个子终端 ,在子终端中不能复用当前终端的变量
source xx.sh
export demo_var1
unset demo_var1
系统 环境变量
环境变量:每个shell 打开都可以获得到的变量
- */ ** %
- set 和env 命令
- $ ?$$$ 0
- $ PATH
- $ PS1
- 位置变量
- $1 $2 ...$n
使用expr 进行运算
expr 4 + 5
数字常量的使用方法
let "变量名 = 变量值"
变量值使用0 开头为八进制
变量值使用 0X 开头为十六进制
双圆括号
双圆括号是let 命令的简化
((a=10))
((a++))
echo $((10+20))
特殊字符大全
引号
' 完全引用
“ 不完全引用
` 执行命令
括号
() (()) $()
单独使用圆括号会产生一个子shell
数组初始化
[] [[]]
单独使用方括号是测试(test)或数组元素功能
两个括号表示测试表达式
<>
{}
输出范围 echo {0..9}
运算和逻辑符号
-
-
- / % 算数运算符
-
< = 比较运算符
&& || ! 逻辑运算符 &&: and ,
转义符号
\ 转义某字符
\n 普通字符转义之后有不同的功能
' 特殊字符转义时候,当作普通字符来使用
其他符号
注释符
b=4+5 这种正常的赋值会把等号后面的4+5 看作字符串
cp -v /etc/passwd{,.bak}
; 命令分割符
case 语句的分割符要转义 ;;
: 空指令
. 和source 命令相同
~ 家目录
, 分割目录
- 通配符
? 条件测试或通配符
$ 取值符号
| 管道符
& 后台运行
_ 空格
测试与判断
退出与退出状态
exit
exit 10 返回 10 给shell,返回值非0 位不正常退出
$? 判断当前Shell 前一个Shell 进程是否正常退出
测试命令test
test命令用于检查文件或比较值
test可以做一下测试:
文件测试
整数比较测试
字符串测试
test 语句可以简化为[] 符号
[] 符号还有扩展写法[[]] 支持 && 、||、 <、>
if
ifdown eth0;ifup eth0
!/bin/bash
exit demo
ppwd
exit 127 自定义错误返回值
echo $?
$? 判断当前Shell 前一个进程是否正常退出
[[5 > 4 ]]
-gt, -lt, -eq, -ge,-le,
0 真值 非0 假值
if-else-else
if- then 语句的基本用法
if [测试条件成立] 或命令返回值是否为0
then 执行相应命令
fi 结束
[$UID =0]
[$USER = root]
if [$UID =0]
then echo "root user"
fi
if[ 测试条件成立 ]
then 执行相应命令
else 测试条件不成立,执行相应命令
fi 结束
if-then-else 语句可以在条件不成立时也运行相应的命令
if [测试条件成立]
then 执行相应命令
elif [测试条件成立]
then 执行相应命令
else 测试条件不成立,执行相应命令
fi 结束
if 嵌套
批量安装
if [测试条件成立]
then 执行相应命令
if[测试条件成立]
then 执行相应命令
fi
if 结束
case
case "$变量" in
"情况1" )
命令...;;
"情况2" )
命令...;;
esac
!/bin/bash
demo case
case "$1" in
"start"|"START" )
echo $0 start ....
;;
"stop")
cmd2
循环
使用for 循环遍历命令的执行结果
使用for 循环遍历变量和文件的内容
C风格的for命令
while 循环
死循环
until 循环
break 和continue 语句
使用循环对命令行参数的处理
C语言风格的 for
awk
;;
"restart"|"reload")
;;
);;
cmd4
esac
for 循环的语法
for 参数 in 列表
do 执行的命令
done 封闭一个循环
使用反引号或 $()方式执行命令,命令的结果当作列表进行处理
使用 for 循环遍历变量和文本
列表中包含多个变量,变量用空格分割
对文本处理,要使用 文本查看命令取出文本内容
默认逐行处理,如果文本出现空格会当作多行处理
for i in {1..9};do echo hello;done
for filename in 'ls .mp3';do ,mv $(basename $filename .mp3).mp4;done 批
量改名
for ((变量初始化; 循环判断条件;变量变化))
do
循环执行的命令
done
for ((i=1;i<=10; i++))
do
echo $1
done
while 循环
循环的使用
break continue
while test 测试是否成立
do
命令
done
a = 1
while [$a -lt 10]
do
((a++))
echo $a
done
while :
do
echo always
done
until 如果条件为假 就执行语句
循环和循环也可以嵌套
循环中可以嵌套判断,反过来也可以嵌套
循环可以使用break 和continue语句在循环中退出
for sc_name in /etc/profile.d/.sh
do
if [-x $sc_name]
then
. $sc_name
fi
done
for num in {1..9}
do
if [$num -eq 5]
then
break
fi
echo $num
done 1 2 3 4
使用循环处理命令行参数
命令行参数可以使用 $1, $2, ...${10}...$n 进行读取
$0 代表脚本名称
$ 和 $@ 代表所有位置参数
$ 代表位置参数的数量
自定义函数
自定义函数
for num in {1..9}
do
if [$num -eq 5]
then
continue
fi
echo $num
done 1 2 3 4 6 7 8 9
for pos in $ *
do
if ["$pos" = "help"];then
echo $pos $pos
fi
done
while [$ -ge 1 ]
do
if["$1" = "help"];then
echo $1 $1
fi
shift 参数左移
done
函数用于"包含"重复使用的命令集合
自定义函数
function fname(){
命令
}
函数的执行
fname
function cdls(){
cd /var
ls
}
cdls 使用函数
函数作用范围的变量
local 变量名
函数的参数
$1 $2 $3 $n
unset cdls 取消函数
cdls(){
系统自建了函数库,可以在脚本中引用
/etc/init.d/functions
自建函数库
使用source 函数脚本文件“导入”函数
脚本控制
脚本优先级控制
可以使用nice 和renice调整优先级
避免出现“不可控的”死循环
死循环导致CPU占用过高
死循环导致死机
捕获信号
捕获信号脚本的编写
kill 默认会发送15 号信号给应用程序
CTRL +C 发送2号信号给应用程序
9 号信号不可阻塞
cd $1
ls
}
cdls /tmp
checkpid 1 2 3
checkpid(){
local i
通过读取/proc 下的目录判断进程是否存活
for i in $*;do
[ -d"/proc/$i" ] && return 0
done
return 1
}
引用函数
source 14.sh
fock 炸弹
uluimit -a 查看使用限制
func (){func | func&}
.(){.|.&};.
正则表达式与文本搜索
元字符
扩展元字符
文件查找 find
文本内容过滤(查找) grep
信号捕获
trap "echo sig 15 " 15
echo $$
while :
do
:
done
发送信号 kill -15 10742
文件查找命令
文件查找 find
find 路径 查找条件 [补充条件]
行编辑器介绍
字符串 Do one thing at a time, and do well
匹配字符串 an
查找 .
grep "." anacoda-ks.cfg
.匹配除换行符外的任意单个字符 - 匹配任意一个跟在它前面的字符
[] 匹配方括号中字符类中的任意一个
^ 匹配开头
$ 匹配结尾
\ 转义后面的特殊字符
扩展元字符
- 匹配前面的正则表达式至少出现一次
? 匹配前面的正则表达式出现零次或一次
| 匹配它前面或后面的正则表达式
find /etc/ -name passwd
find /etc/ -regex .wd
find /etc - regex .etc.wd$
find /etc/ -type d -regex .wd
find /etc/ -ctime 8
LANG=C stat filea
批量删除
touch /tmp/{1..9}.txt
ls /tmp/.txt
find *txt
find *txt -exec rm -v {} ;
grep pass /root/anaconda-ks.cfg | cut -d " " -f 1 匹配到 pass 以 空格分隔,选
取第一部分
cut -d ":" -f7 /etc/passwd|sort |uniq -c
sed 一般用于对文本内容做替换
sed '/user1/s/user1/u1/' /etc/passwd
AWK 一般用于对文本内容进行统计,按需要的格式进行输出
cut 命令: cut -d :-f 1/etc/passwd
awk 命令: awk -F :'/wd$/{print $1}' /etc/passwd
sed 替换命令
sed 的模式控件
替换命令 s
sed 的模式空间
sed 的基本工作方式是:
sed 加强版
全局替换
标志位
寻址
分组
sed脚本文件
-
将文件以行为单位读取到内存(模式空间)
-
使用sed的每个脚本对该行进行操作
-
处理完成后输出该行
sed 's/old/new' filename
sed -e 's/old/new' -e 's/old/new/' filename ...
sed -i 's/old/new/' 's/old/new/' filename ...
带正则表达式的替换命令s: -
sed 's/正则表达式/new/' filename
-
sed -r 's/扩展正则表达式/new/' filename
echo a a a > afile
sed 's/a/aa/' afile 替换一次是由sed 控制值的
sed 's!/!abc' afile 把 / 替换为abc
sed -e 's/a/aa/' -e 's/aa/bb' afile
sed -e 's/a/aa/';'s/aa/bb' afile bfile
sed -e 's/a/aa/'; 's/aa/bb' afile 变更后的内容写入文件
sed -e 's/a/aa/'; 's/aa/bb' afile >bfile 把替换后的内容输出到另一个文件中
head -5 /etc/passwd |sed 's/...//'
head -5 /etc/passwd |sed 's/sbin//' 默认只会替换第一次出现到的
grep root /etc/passwd | sed 's/^root//'
sed
sed -r 's/ab+/!/' bfile
sed -r 's/(aa)|(bb)/!/' bfile 分组
sed -r 's/(a.b)/\1 :\1/' cfile /回调
s/old/new/标志位
全局替换
s/old/new/g
g为全局替换,用于替换所有出现的次数
/ 如果和正则匹配的内容冲突可以使用其他符号: s@old@new@g
数字,第几次出现才进行替换
g 每次出现都进行替换
p 打印模式空间的内容
sed -n 'script' filename 阻止默认输出
w file 将模式空间的内容写入到文件
head -5 /etc/passwd | sed 's/root/!!!!/p'
head -5 /etc/passwd | sed -n 's/root/!!!!/p'
head -5 /etc/passwd | sed 's/root/!!!!/w' /tmp/a.txt 把替换成功的行写入tmp下面
的a.txt 文件中
寻址
默认对每行进行操作,增加寻址后对匹配的行进行操作
sed 多行处理
为什么要有多行模式
配置文件一般以单行出现
也有使用XML或JSON格式的配置文件,以多行出现
多行面模式处理命令 N D P
/正则表达式 /s/old/new/g
行号可以是具体的行,也可以是最后一行 $ 符号
可以使用两个寻址符号,也可以使用混合行号和正则寻址
分组
寻址可以匹配多条命令
/regular/{s/old/new/;s/old/new}
脚本文件
可以将选项保存为文件,使用-f 加载脚本文件
sed -f sedscript filename
sed 其他指令
删除
追加,插入,更改
打印
下一行
读文件和写文件
退出命令
删除
[寻址]d
删除模式空间内容,改变脚本的控制流,读取新的输入行
先进行命令的替换再根据 需要删除
追加 a, 插入 i, 更改 c,
sed '/ab/i hello' bfile 在b文件的ab上一行插入hello
sed '/ab/a hello' bfile 在b文件的ab下一行插入hello
sed '/ab/c hello' bfile 在b 文件的ab 这一行改写为hello
sed '/ab/r afile' bfile 在b 文件ab 这一行改写为 afile 文件中的内容
读文件 和写文件
读文件 r 写文件 w
下一行 n
打印行号命令 =
打印 p
sed '/ab/p' bfile
sed -n '/ab/p' bfile退出命令
退出命令 q
哪个效率更高?
sed 10q filename
sed -n 1,10p filename
sed 的工作原理是逐行读入逐行处理, 10q 只读10行后退出,1,10p,读完10行后还需要继续读
N 将下一行加入到模式控件
D 删除模式控件中的第一个字符到第一个换行符
P 打印模式控件中的第一个字符到第一个换行符
文件操作模式与行操作模式
自定义函数
什么是保持空间(中间变量)
保持空间也是多行的一种操作方式
将内容暂存在保持空间,便于做多行处理
文本文件 模式空间 保持空间 ?
AWK 和sed 的区别
AWK更像是脚本语言
AWK用于"比较规范"的文本处理,用于统计数量并输出指定字段
使用sed 将不规范的文本,处理为"比较规范"的文本
AWK脚本的流程控制
输入数据前例程 BEGIN{}
sed 'N' a.txt
sed 'N;s/hel\nlo/!!!/' a.txt
sed 'N;s/shell.lo/!!!/' a.txt 用. 替换\n
function 函数名(参数名){
awk 语句
return awk 变量
}
h 和H 将模式空间内容存放到保持空间 h 覆盖模式 G 追加模式
g 和G 将保持空间内容取出到模式空间
x 交换模式空间和保持空间内容
输入主循环 {}
所有文件读取完成例程END{}
AWK 字段
每行称作AWK的记录
使用空格、制表符隔开的单词称作字段
可以自己指定分割的字段
字段的引用
AWK中使用 $1, $2,...¥n, 表示每一个字段
awk '{print $1,$2,$3}' filename
awk 可以使用 -F 选项改变字段分割符
awk - F '','{print $1,$2,$3}' filename
分隔符可以使用正则表达式
awk 的表达式
赋值操作符
= 是最常用的赋值操作符
var1 = "name"
var2 = "hello" "world"
var3 = $1
其他赋值操作符
++ -- += -=*= /= %= ^=
算数运算符
-
- */ % ^
系统变量
FS 和OFS 字段分隔符, OFS 表示 输出的字段分割符
RS 记录分隔符
NR 和FNR行数 NR 当文件变化时不会重排
NF 字段数量, 最后一个字段可以用 $NF 取出
关系操作符
< > <= >= == != ~ !~
布尔操作符
< > <= >= == != ~ !~
awk '/^menu/{print $0}' /boot/grup2/grou.cfg
awk "'" '/^menu/{print $0}' /boot/grup2/grup.cfg 以单引号作为分隔符
awk "'" '/^menu/{print x++, $2}' /boot/grup2/grup.cfg 以单引号作为分隔符
head -5 /etc/passwd
head -5 /etc/passwd |awk -F ":" '{print $1}'
head -5 /etc/passwd |awk 'BEGIN{FS=":"}{print $1}' 输出第一个字段
head -5 /etc/passwd |awk 'BEGIN{FS=":"}{print $1,$2}' 输出第二个
字段
AWK 判断和循环
条件
条件语句使用if 开头,根据表达式的结果判断执行那条语句
head -5 /etc/passwd |awk 'BEGIN{FS=":";OFS="-"}{print $1,$2}'
输出第二个字段
记录分隔符
head -5 /etc/passwd |awk 'BEGIN{RS=":"}{print $0}'
head -5 /etc/passwd |awk '{print NR}' 显示行号
head -5 /etc/passwd |awk '{print NR,$0}' 显示行号
head -5 /etc/passwd |awk 'BEGIN{FS=":"}{print NF}'
head -5 /etc/passwd |awk 'BEGIN{FS=":"}{print $NF}' 显示shell 的
内容
if (表达式)
awk 语句1
[else
awk 语句2
]
如果有多个语句需要执行可以使用{} 将多个语句括起来
awk '{if ($2>=80) print $1}' kpi.txt
awk '{if ($2>=80) {print $1;print $2}' kpi.txt if 后如果跟两个语句时需要
加大括号
循环
while 循环
while (表达式)
awk 语句1
do 循环
do{
awk 语句1
}while(表达式)
for 循环
for(初始值; 循环判断条件;累加)
awk 语句1
影响控制的其他语句 - break
- continue
awk 数组
数组定义
avg.awk ---把awk 的内容加入到文件中
awk -f avg.awk kpi.txt --- 使用awk文件
数组的遍历
删除数组
命令行参数数组
head -1 kpi.txt |awk '{for(c=2;c <=NF;c++) print c}'
head -1 kpi.txt |awk '{for(c=2;c <=NF;c++) print $c}'
head -1 kpi.txt |awk '{for(c=2;c <=NF;c++) sum = sum +$c;print sum}'
head -1 kpi.txt |awk '{for(c=2;c <=NF;c++) sum = sum +$c;print sum/(NF1)}'
扩充到多行
awk '{sum = 0;for(c=2;c <=NF;c++) sum = sum +$c;print sum/(NF-1)}'
kpi.txt
数组的定义
数组:一组有某种关联的数据(变量),通过下标以此访问
数组名[下标] = 值
下标可以使用数字也可以使用字符串
数组的遍历
for (变量 in 数组名)
使用 数组名[变量] 的方式以此对每个数组的元素进行操作
删除数组
delete 数组[下标]
awk '{sum =0;for(column=2;column<=NF;column++)
sum+=$column;average[$1]=sum/(NF-1)}END{for (user in average)print
average[user]}' kpi.txt
awk '{sum =0;for(column=2;column<=NF;column++)
sum+=$column;average[$1]=sum/(NF-1)}END{for (user in average) sum2
+=average[user];print sum2/NR}' kpi.txt
命令行参数数组
ARGC
ARGV
AWK
BEGIN{
for (x= 0; x<ARGC; x++)
print ARGV[x]
print ARGC
}
awk -f arg.awk 11 22 33
awk数组功能的使用
vim result.awk
{
sum = 0
for (column = 2;column <= NF; column ++)
sum += $column
average[$1] = sum / (NF - 1)
if (average[$1]>= 80)
letter = "S"
else if (average[$1]>=70)
letter = "A"
else if (average[$1]>=70)
letter = "A"
else if (average[$1] >= 60)
letter = "B"
else
letter = "C"
print $1,average[$1],letter
letter_all[letter]++ 使用关联数组 统计
}
END{
for (user in average)
sum_all += average[user]
avg_all = sum_all / NR
print "average all:",avg_all
for (user in average)
if(average[user]> avg_all)
above++
else
below++
print "above",above
print "below",below
print "S", letter_all["S"]
print "S", letter_all["S"]
print "A", letter_all["A"]
print "B", letter_all["B"]
print "C", letter_all["C"]
算数操作符
系统变量
关系操作符
布尔操作符
AWK 函数
算数函数
字符串函数
gsub()
sub()
substr()
自定义函数
}
awk 'function a() {return 0} BEGIN {print a()}'
awk 'function double(str) {return str str}
BEGIN {print double("hello awk")}'
sin() cos()
int()
rand() srand()
awk 'BEGIN{pi = 3.14;print int(pi)}'
awk 'BEGIN{rand();print rand()}' 伪随机数
awk 'BEGIN{srand();print srand()}'
man
/gsub
function 函数名(参数){
awk 语句
return awk 变量
}
计划任务
计划任务:让计算机在指定的时间内运行程序
计划任务分为:一次性计划任务和周期性计划任务
一次性计划任务: at
一次性计划任务 at
周期性计划任务
cron
配置方式
crontab -e
查看现有的计划任务
crontab -l
配置格式:
分钟 小时 日期 月份 星期 执行的命令
注意命令的路径问题
awk 'function a(){
return 0
} BEGIN {
print a()
}'
传入一个字符串让它输出两次
awk 'function double(str){
return str str
} BEGIN{print double("hello awk")}'
at xxxx
需要运行的脚本
非内部命令需要加上命令的完整命令
CTRL+ D 提交任务
atq ?
计划任务加锁 flock
如果计算机不能按照预期时间运行
anacontab 延时计划任务
flock 锁文件
crontab -e
- */ % ^
-
-
-
-
- /usr/bin/date >> /tmp/date.txt
which date 查看date 命令的位置
查看加护任务的log
- /usr/bin/date >> /tmp/date.txt
-
-
-
cd /var/log tail -f cron * * * * 1,5 # 每周一和周五 * * * * 1-5 # 每周一到周五 * * 7 7 1,5 # 每周一和周五 七月七日 15 18 7 7 1,5 # 每周一和周五 七月七日 18点15分
周期性任务保存在 var/spool/cron
延时计划任务位于
vim /etc/cron.d/0hourly 每小时运行
vim /etc/anacrontab 每天,每周运行
cat /etc/cron.daily/logrotate 日志拆分,应对重起导致任务无法运行
flock -xn "/tmp/f.lock" -c "/root/a.sh" 运行只能运行一次
flock -xn "/tmp/f.lock" -c "/root/a.sh"
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异