目录
一、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 -h
total 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 1500
inet 192.168.1.181 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 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 0
TX packets 1140 bytes 201247 (196.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::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 0
TX packets 2 bytes 102 (102.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 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 0
TX 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 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::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 1000
link/ether 00:0c:29:ff:08:8a brd ff:ff:ff:ff:ff:ff
inet 192.168.1.181/24 brd 192.168.1.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 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 1000
link/ether 52:54:00:42:ec:8d brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
link/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 "请输入一个数字: " num
if [ "$num" -gt 10 ]; then
echo "数字大于 10"
elif [ "$num" -eq 10 ]; then
echo "数字等于 10"
else
echo "数字小于 10"
fi
(2)case 多条件判断
适用于匹配多个固定值的情况。
case 变量 in
"值1")
# 如果变量的值等于值1,则执行程序1
;;
"值2")
# 如果变量的值等于值2,则执行程序2
;;
*)
# 默认情况(类似 else)
;;
esac
示例:
#!/bin/bash
read -p "请输入 yes/no: " choice
case "$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"; do
echo "水果: $fruit"
done
# 遍历数字范围(1~5)
for i in {1..5}; do
echo "数字: $i"
done
# 遍历命令输出
for file in $(ls); do
echo "文件: $file"
done
(4)while 循环
当条件成立时循环
while [ 条件 ]; do
# 循环体
done
示例:
#!/bin/bash
count=1
while [ "$count" -le 5 ]; do
echo "计数: $count"
((count++))
done
(5)until 循环
直到条件成立时停止
until [ 条件 ]; do
# 循环体
done
示例:
#!/bin/bash
count=1
until [ "$count" -gt 5 ]; do
echo "计数: $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; do
echo "行内容: $line"
done < filename.txt
# IFS 是 shell 中的一个特殊环境变量,它定义了字段分隔符
#!/bin/bash
# 处理冒号分隔的/etc/passwd文件
while IFS=':' read -r username _ uid gid desc home shell; do
echo "用户: $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