目录
一、Linux 命令大全
1、文件和目录操作
(1)ls 列出目录内容
(2)pwd 查看当前目录
(3)cd 切换目录
(4)mkdir 创建目录
(5)cp 复制文件或目录
(6)mv 移动或重命名文件
(7)rm 删除文件或目录
(8)touch 创建空文件或更新时间戳
(9) find 查找文件
2、文件内容操作
(1)cat 查看文件内容
(2)less/more 分页查看文件
(3)head/tail 查看文件开头/结尾
(4)grep 文本搜索
(5)sed 流编辑器
(6)awk 文本处理
3、系统信息
(1)ps 查看进程
(2)top 系统监控
(3)free 内存使用
(4)df 磁盘空间使用
(5)du 目录大小
4、网络相关
(1)ping 网络连通性测试
(2)ifconfig/ip 网络接口配置
(3)netstat - 网络统计
(4)ssh 远程登录
(5)scp 安全复制
5、权限管理
(1)chmod 修改权限
(2)chown 修改所有者
6、压缩和解压
(1)tar 打包和解包
(2)zip/unzip ZIP压缩
二、shell 脚本语言
1、shell 的变量
(1)常用系统变量
(2)自定义变量
(3)特殊变量
2、运算符
(1)算术运算符
(2)关系运算符
(3)字符运算符
(4)逻辑运算符
(5)文件测试运算符
3、流程控制
(1)if 判断
(2)case 多条件判断
(3)for 循环
(4)while 循环
(5)until 循环
(6)循环控制
4、函数
(1)系统函数
(2)自定义函数
5、shell 内置工具
(1)read
(2)cut
(3)sed
(4)awk
(5)sort
一、Linux 命令大全
1、文件和目录操作
(1)ls 列出目录内容
# 按修改时间顺序排序
[root@host181 test1]# ls -lrt
total 4
-rw-r--r-- 1 root root 0 Jun 22 19:37 2.log
-rw-r--r-- 1 root root 0 Jun 22 20:54 3.log
-rw-r--r-- 1 root root 0 Jun 24 23:31 4.log
-rw-r--r-- 1 root root 43 Jun 24 23:33 1.log# 列出隐藏目录
[root@host181 test1]# ls -la
total 4
drwxr-xr-x 2 root root 58 Jun 24 23:31 .
drwxr-xr-x 7 root root 71 Jun 22 19:30 ..
-rw-r--r-- 1 root root 43 Jun 24 23:33 1.log
-rw-r--r-- 1 root root 0 Jun 22 19:37 2.log
-rw-r--r-- 1 root root 0 Jun 22 20:54 3.log
-rw-r--r-- 1 root root 0 Jun 24 23:31 4.log
[root@host181 test1]#
(2)pwd 查看当前目录
[root@host181 test1]# pwd
/root/testdir/test1
(3)cd 切换目录
# 切换到家目录下
cd ~# 回到到上次所在目录下
cd - # 回到到上级目录
cd ..# 切换到绝对路径
cd /xxx/xxx# 切换到相对路径
cd xxx
(4)mkdir 创建目录
# 创建多级目录
[root@host181 test1]# mkdir -pv logs/serve/lib
mkdir: created directory ‘logs’
mkdir: created directory ‘logs/serve’
mkdir: created directory ‘logs/serve/lib’# 创建单个目录
mkdir dir1
(5)cp 复制文件或目录
# 复制文件
cp file1 file2 # 递归复制目录
cp -r dir1 dir2
(6)mv 移动或重命名文件
# 重命名文件
mv oldname newname# 移动文件
mv file1 /target/dir/
(7)rm 删除文件或目录
# 删除文件
rm file.txt# 递归删除目录
rm -r directory# 强制删除不提示
rm -f *.log
(8)touch 创建空文件或更新时间戳
# 创建新文件
touch newfile.txt# 设置特定时间戳
[root@host181 test1]# touch -t 202401010000 file.txt
[root@host181 test1]# ll file.txt
-rw-r--r-- 1 root root 0 Jan 1 2024 file.txt
[root@host181 test1]#
(9) find 查找文件
# / 目录下查找 2.log 文件
[root@host181 test1]# find / -name "2.log"
/root/testdir/test1/2.log
[root@host181 test1]#
2、文件内容操作
(1)cat 查看文件内容
# 显示文件内容
cat file.txt
(2)less/more 分页查看文件
# 可上下翻页
less largefile.log# 只能向下翻页
more largefile.log
(3)head/tail 查看文件开头/结尾
# 显示前10行
head -n 10 file.txt # 显示后20行
tail -n20 file.txt# 实时跟踪日志
tail -f test.log
(4)grep 文本搜索
# 搜索包含error的行
grep "error" logfile # 忽略大小写
grep -i "warning" file # 忽略大小写
(5)sed 流编辑器
# 替换文本
sed -i 's/old/new/g' file # 原地编辑并备份,会生成一个 file.bak 的备份文件
sed -i.bak 's/foo/bar/' file
(6)awk 文本处理
# 打印第一列
awk '{print $1}' file# 打印以:为分隔的第一列
awk -F: '{print $1}' file
3、系统信息
(1)ps 查看进程
# 查看所有进程
ps -ef# 查看当前账户进程
ps -ux# 查找指定xxx进程
ps -ef|grep xxx
(2)top 系统监控
[root@host181 test1]# top
top - 00:09:14 up 49 min, 1 user, load average: 0.00, 0.01, 0.02
Tasks: 161 total, 2 running, 159 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1863000 total, 935332 free, 514628 used, 413040 buff/cache
KiB Swap: 2098172 total, 2098172 free, 0 used. 1146600 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 125708 4164 2616 S 0.0 0.2 0:00.72 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H 5 root 20 0 0 0 0 S 0.0 0.0 0:00.04 kworker/u256:0 6 root 20 0 0 0 0 S 0.0 0.0 0:00.05 ksoftirqd/0 7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0 8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh 9 root 20 0 0 0 0 S 0.0 0.0 0:00.12 rcu_sched 10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain 11 root rt 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/0 13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs 14 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns 15 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khungtaskd 16 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 writeback 17 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kintegrityd 18 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 bioset
(3)free 内存使用
[root@host181 test1]# free -htotal used free shared buff/cache available
Mem: 1.8G 502M 913M 22M 403M 1.1G
Swap: 2.0G 0B 2.0G
[root@host181 test1]#
(4)df 磁盘空间使用
[root@host181 test1]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 895M 0 895M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 11M 900M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/sda3 48G 6.6G 42G 14% /
/dev/sda1 297M 163M 134M 55% /boot
tmpfs 182M 12K 182M 1% /run/user/42
tmpfs 182M 0 182M 0% /run/user/0
[root@host181 test1]#
(5)du 目录大小
[root@host181 test1]# du -sh *
4.0K 1.log
0 2.log
0 3.log
0 4.log
0 dir1
0 dir2
0 file.txt
0 logs
[root@host181 test1]# du -sh /root/testdir/
4.0K /root/testdir/
[root@host181 test1]#
4、网络相关
(1)ping 网络连通性测试
[root@host181 test1]# ping -c 4 www.baidu.com
PING www.baidu.com (36.152.44.93) 56(84) bytes of data.
64 bytes from 36.152.44.93 (36.152.44.93): icmp_seq=1 ttl=52 time=35.7 ms
64 bytes from 36.152.44.93 (36.152.44.93): icmp_seq=2 ttl=52 time=35.8 ms
64 bytes from 36.152.44.93 (36.152.44.93): icmp_seq=3 ttl=52 time=37.6 ms
64 bytes from 36.152.44.93 (36.152.44.93): icmp_seq=4 ttl=52 time=35.5 ms--- www.baidu.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 35.571/36.209/37.658/0.865 ms
[root@host181 test1]#
(2)ifconfig/ip 网络接口配置
[root@host181 test1]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.1.181 netmask 255.255.255.0 broadcast 192.168.1.255inet6 fe80::ee63:14dd:db70:74b2 prefixlen 64 scopeid 0x20<link>ether 00:0c:29:ff:08:8a txqueuelen 1000 (Ethernet)RX packets 17351 bytes 1455172 (1.3 MiB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 1140 bytes 201247 (196.5 KiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0inet6 ::1 prefixlen 128 scopeid 0x10<host>loop txqueuelen 1000 (Local Loopback)RX packets 2 bytes 102 (102.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 2 bytes 102 (102.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255ether 52:54:00:42:ec:8d txqueuelen 1000 (Ethernet)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0[root@host181 test1]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:ff:08:8a brd ff:ff:ff:ff:ff:ffinet 192.168.1.181/24 brd 192.168.1.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet6 fe80::ee63:14dd:db70:74b2/64 scope link noprefixroute valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000link/ether 52:54:00:42:ec:8d brd ff:ff:ff:ff:ff:ffinet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000link/ether 52:54:00:42:ec:8d brd ff:ff:ff:ff:ff:ff
[root@host181 test1]#
(3)netstat - 网络统计
# 监听端口和进程
netstat -tulnp # 路由表
netstat -r # 查看ipv4路由表
route -4n# 查看ipv6路由表
route -6n
(4)ssh 远程登录
ssh -p 22 user@host
(5)scp 安全复制
# 上传
scp file user@host:/path # 下载
scp user@host:file .
5、权限管理
(1)chmod 修改权限
# 设置权限
chmod 755 script.sh # 添加执行权限
chmod +x file
(2)chown 修改所有者
# 修改所有者和组
chown user:group file
6、压缩和解压
(1)tar 打包和解包
# 创建tar.gz压缩包
tar -czvf archive.tar.gz dir/ # 解压tar.gz包
tar -xzvf archive.tar.gz
(2)zip/unzip ZIP压缩
# 创建zip
zip -r archive.zip dir/ # 解压zip
unzip archive.zip
二、shell 脚本语言
1、shell 的变量
(1)常用系统变量
变量名 | 说明 |
$PWD | 当前工作目录 |
$HOME | 当前用户的家目录 |
$SHELL | 当前使用的 Shell |
$USER | 当前登录的用户名 |
$HOSTNAME | 当前主机名 |
[root@host181 testdir]# echo $PWD
/root/testdir
[root@host181 testdir]# echo $HOME
/root
[root@host181 testdir]# echo $SHELL
/bin/bash
[root@host181 testdir]# echo $USER
root
[root@host181 testdir]# echo $HOSTNAME
host181
(2)自定义变量
在bash中,变量默认类型都是字符串类型
定义变量:变量=值
撤销变量:unset 变量
(3)特殊变量
变量 | 说明 |
---|---|
$0 | 当前脚本的文件名 |
$1 , $2 , ..., $9 | 脚本的第 1~9 个参数 |
${10} , ${11} , ... | 第 10 个及以后的参数(需要用 ${ } 语法) |
$# | 传递给脚本的参数个数 |
$? | 上一个命令的退出状态(0=成功,非0=失败) |
$RANDOM | 随机数 |
2、运算符
(1)算术运算符
用于数值计算
运算符 | 说明 | 示例 |
---|---|---|
+ | 加法 | echo $((5 + 3)) → 8 |
- | 减法 | echo $((10 - 2)) → 8 |
* | 乘法 | echo $((2 * 4)) → 8 |
/ | 除法(取整) | echo $((10 / 3)) → 3 |
% | 取模(余数) | echo $((10 % 3)) → 1 |
** | 幂运算(Bash 支持) | echo $((2 ** 3)) → 8 |
++ | 自增 | x=5; ((x++)); echo $x → 6 |
-- | 自减 | x=5; ((x--)); echo $x → 4 |
(2)关系运算符
用于数值比较
运算符 | 说明 | 示例 |
---|---|---|
-eq | 等于(Equal) | [ 5 -eq 5 ] → true |
-ne | 不等于(Not Equal) | [ 5 -ne 3 ] → true |
-gt | 大于(Greater Than) | [ 5 -gt 3 ] → true |
-lt | 小于(Less Than) | [ 5 -lt 10 ] → true |
-ge | 大于等于(Greater or Equal) | [ 5 -ge 5 ] → true |
-le | 小于等于(Less or Equal) | [ 5 -le 5 ] → true |
(3)字符运算符
用于字符串比较
运算符 | 说明 | 示例 |
---|---|---|
= | 字符串相等 | [ "abc" = "abc" ] → true |
!= | 字符串不相等 | [ "abc" != "def" ] → true |
-z | 字符串为空 | [ -z "" ] → true |
-n | 字符串非空 | [ -n "abc" ] → true |
str1 > str2 | 按字典序大于 | [[ "b" > "a" ]] → true |
str1 < str2 | 按字典序小于 | [[ "a" < "b" ]] → true |
(4)逻辑运算符
运算符 | 说明 | 示例 |
---|---|---|
&& | 逻辑与(AND) |
|
|| | 逻辑或(OR) | [ 5 -lt 3 ] || [ 2 -lt 4 ] |
! | 逻辑非(NOT) |
|
(5)文件测试运算符
运算符 | 说明 | 示例 |
---|---|---|
-e | 文件/目录是否存在 | [ -e file.txt ] → true |
-d | 是目录 | [ -d /tmp ] → true |
-r | 可读 | [ -r file.txt ] → true |
-w | 可写 | [ -w file.txt ] → true |
-x | 可执行 | [ -x /bin/bash ] → true |
-s | 文件非空 | [ -s file.txt ] → true |
3、流程控制
(1)if 判断
if [ 条件1 ]; then# 条件1成立时执行
elif [ 条件2 ]; then# 条件2成立时执行
else# 所有条件都不成立时执行
fi
示例:
#!/bin/bash
read -p "请输入一个数字: " numif [ "$num" -gt 10 ]; thenecho "数字大于 10"
elif [ "$num" -eq 10 ]; thenecho "数字等于 10"
elseecho "数字小于 10"
fi
(2)case 多条件判断
适用于匹配多个固定值的情况。
case 变量 in"值1")# 如果变量的值等于值1,则执行程序1 ;;"值2")# 如果变量的值等于值2,则执行程序2 ;;*)# 默认情况(类似 else);;
esac
示例:
#!/bin/bash
read -p "请输入 yes/no: " choicecase "$choice" in[Yy][Ee][Ss]|"y"|"Y")echo "你输入了 yes";;[Nn][Oo]|"n"|"N")echo "你输入了 no";;*)echo "输入无效";;
esac
(3)for 循环
遍历列表或范围。
for 变量 in 列表; do# 循环体
done
示例:
#!/bin/bash
# 遍历列表
for fruit in "apple" "banana" "orange"; doecho "水果: $fruit"
done# 遍历数字范围(1~5)
for i in {1..5}; doecho "数字: $i"
done# 遍历命令输出
for file in $(ls); doecho "文件: $file"
done
(4)while 循环
当条件成立时循环
while [ 条件 ]; do# 循环体
done
示例:
#!/bin/bash
count=1
while [ "$count" -le 5 ]; doecho "计数: $count"((count++))
done
(5)until 循环
直到条件成立时停止
until [ 条件 ]; do# 循环体
done
示例:
#!/bin/bash
count=1
until [ "$count" -gt 5 ]; doecho "计数: $count"((count++))
done
(6)循环控制
命令 | 说明 |
---|---|
break | 跳出当前循环 |
continue | 跳过本次循环,进入下一次 |
exit | 退出脚本(可带状态码) |
4、函数
(1)系统函数
basename 提取文件名
[root@host181 test1]# ls -lrt
total 8
-rw-r--r-- 1 root root 0 Jan 1 2024 file.txt
-rw-r--r-- 1 root root 0 Jun 22 19:37 2.log
-rw-r--r-- 1 root root 0 Jun 22 20:54 3.log
-rw-r--r-- 1 root root 0 Jun 24 23:31 4.log
drwxr-xr-x 3 root root 19 Jun 24 23:52 logs
drwxr-xr-x 2 root root 6 Jun 24 23:53 dir1
drwxr-xr-x 2 root root 6 Jun 24 23:53 dir2
-rw-r--r-- 1 root root 558 Jun 25 02:07 1.log.bak
-rw-r--r-- 1 root root 555 Jun 25 02:08 1.log
[root@host181 test1]# pwd
/root/testdir/test1[root@host181 test1]# basename /home/user/test1/1.log
1.log# 去掉文件后缀
[root@host181 test1]# basename /home/user/test1/1.log .log
1
[root@host181 test1]#
dirname 提取文件所在绝对路径
[root@host181 test1]# dirname /home/user/test1/1.log
/home/user/test1
[root@host181 test1]#
(2)自定义函数
# 方式1(推荐,兼容性强)
函数名() {# 函数体
}# 方式2(Bash 扩展语法)
function 函数名 {# 函数体
}# 方式3 return 带上返回值(0~255)
函数名() {# 函数体return 0;
}
5、shell 内置工具
(1)read
# 从文件中读取数据
#!/bin/bash
while read line; doecho "行内容: $line"
done < filename.txt
# IFS 是 shell 中的一个特殊环境变量,它定义了字段分隔符
#!/bin/bash
# 处理冒号分隔的/etc/passwd文件
while IFS=':' read -r username _ uid gid desc home shell; doecho "用户: $username (UID: $uid, 主目录: $home)"
done < /etc/passwd
(2)cut
参数 | 说明 |
---|---|
-d | 指定字段分隔符(默认是制表符 \t ) |
-f | 选择字段(列) |
-c | 按字符位置剪切 |
-b | 按字节位置剪切 |
--complement | 反选(显示未被选中的部分) |
示例:以 “,” 号分隔,提取第1、2列字段
示例:按字符位置提取
(3)sed
参数 | 说明 |
---|---|
-n | 只输出处理过的行(默认会输出所有行) |
-i | 直接修改文件(慎用,建议先不加 -i 测试) |
-e | 指定多个命令 |
-r | 使用扩展正则表达式(`+? ()` 等不需要转义) |
-f | 从脚本文件读取 sed 命令 |
# 批量替换文件内容
# 替换每行第一个 "apple" 为 "orange"(不修改原文件)
sed -i 's/apple/orange/' file.txt# 替换所有 "apple"(全局替换)
sed -i 's/apple/orange/g' file.txt# 替换第2行开始的 "apple"
sed -i '2,$ s/apple/orange/' file.txt# 只替换包含 "banana" 的行中的 "apple"
sed -i '/banana/ s/apple/orange/' file.txt# 使用扩展正则表达式(`+` 匹配1次或多次)
sed -i -r 's/a+/AAA/' file.txt
# 删除日志文件中的空行
# 删除第3行
sed -i '3d' file.txt# 删除空行
sed -i '/^$/d' file.txt# 删除包含 "error" 的行
sed -i '/error/d' file.txt# 删除从第2行到第4行
sed -i '2,4d' file.txt
# 插入/追加文本
# 在每行前插入 "INSERT: "
sed -i 'i\INSERT: ' file.txt# 在第2行前插入 "INSERT: "
sed -i '2i\INSERT: ' file.txt# 在包含 "world" 的行后追加 "APPEND: Hello"
sed -i '/world/ a\APPEND: Hello' file.txt# 替换整行(将包含 "old" 的行替换为 "new line")
sed -i '/old/ c\new line' file.txt
(4)awk
# 提取文件的第一列(默认空格分隔)
awk '{print $1}' file.txt# 指定分隔符(如逗号)
awk -F ',' '{print $2}' data.csv# 打印最后一列
awk '{print $NF}' file.txt# 打印文件名和行号(调试用)
awk '{print FILENAME, NR, $0}' file.txt
(5)sort
# 按字母排序
sort file# 按数字大小排序
sort -n file# 去重排序
sort -u file# 反向排序
sort -r file