操作系统(Operating System,简称OS)是管理计算机硬件与软件资源的计算机程序,同时也是计算机系统的内核与基石。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入设备与输出设备、操作网络与管理文件系统等基本事务。
进程管理:负责程序的加载、执行、调度与终止内存管理:分配和管理系统内存资源文件系统管理:提供文件存储、访问、保护机制设备管理:管理各类硬件设备的驱动与访问用户接口:提供命令行或图形化操作界面
Linux 诞生于1991年,由芬兰赫尔辛基大学的学生林纳斯·托瓦兹(Linus Torvalds)开发。当时林纳斯不满意Minix(一个教学用的类Unix操作系统),决定开发一个自由的操作系统内核。
发展历程:
开源免费:源代码公开,可自由使用、修改和分发稳定可靠:可连续运行数年而不需要重启安全高效:权限管理机制完善,病毒较少强大的网络功能:原生支持各种网络协议和服务丰富的软件生态:拥有大量的开源软件支持
Red Hat系列:RHEL、CentOS、FedoraDebian系列:Debian、Ubuntu、Linux MintSUSE系列:SUSE Linux Enterprise、openSUSEArch系列:Arch Linux、Manjaro
硬件要求:
软件准备:
文件 → 新建虚拟机 → 典型(推荐) → 下一步
安装程序光盘映像文件(iso) → 浏览选择CentOS-7-x86_64-DVD-2009.iso
客户机操作系统:Linux
版本:CentOS 7 64位
虚拟机名称:CentOS7-BigData
位置:D:\VMware\CentOS7-BigData
最大磁盘大小:100GB
选择:将虚拟磁盘存储为单个文件
内存:4096MB
处理器:2个
网络适配器:NAT模式
CD/DVD:使用ISO镜像文件
启动虚拟机,选择"Install CentOS 7"
语言选择:中文 → 简体中文(中国)
安装信息摘要配置:
日期和时间:
地区:亚洲
城市:上海
键盘布局:
添加:汉语
语言支持:
添加:中文(简体,中国)
安装源:
选择:本地介质
软件选择:
选择:基础设施服务器
附加选项:开发工具
安装位置:
选择:我要配置分区
分区方案:
/boot:1GB(标准分区)
swap:4GB(标准分区)
/:剩余空间(LVM)
网络和主机名:
主机名:bigdata-node01
网络配置:打开以太网连接
ip addr show
vi /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"# 网络类型:以太网
BOOTPROTO="static"# 获取IP方式:static静态IP、dhcp动态IP、none不指定
DEFROUTE="yes"# 是否设置为默认路由:yes是、no否
IPV4_FAILURE_FATAL="no"# IPv4失败时是否致命:no继续、yes停止
IPV6INIT="yes"# 是否启用IPv6:yes启用、no禁用
IPV6_AUTOCONF="yes"# IPv6是否自动配置:yes是、no否
IPV6_DEFROUTE="yes"# IPv6是否默认路由:yes是、no否
IPV6_FAILURE_FATAL="no"# IPv6失败时是否致命:no继续、yes停止
NAME="ens33"# 网络连接名称
UUID="xxxx-xxxx-xxxx-xxxx"# 唯一标识符
DEVICE="ens33"# 设备名称
ONBOOT="yes"# 开机是否启动:yes启动、no不启动
IPADDR="192.168.1.100"# IP地址
NETMASK="255.255.255.0"# 子网掩码
GATEWAY="192.168.1.1"# 默认网关
DNS1="8.8.8.8"# 主DNS服务器
DNS2="114.114.114.114"# 备用DNS服务器
systemctl restart network
ping www.baidu.com
hostname bigdata-node01
hostnamectl set-hostname bigdata-node01
echo"主机名" >> /etc/hostname
命令格式:ls [选项] [路径]
常用参数:
-a, --all:显示所有文件,包括隐藏文件(以.开头的文件)-l:使用长格式显示详细信息(权限、所有者、大小、时间等)-h, --human-readable:以人类可读的方式显示文件大小(K、M、G)-d, --directory:显示目录本身的信息,而不是目录内容-t:按修改时间排序,最新的在前-r, --reverse:反向排序-S:按文件大小排序,最大的在前-R, --recursive:递归显示子目录内容-i, --inode:显示文件的inode号-F, --classify:在文件名后添加标识符(/表示目录,*表示可执行文件)使用示例:
ls -la /home # 显示/home目录下所有文件的详细信息
ls -lh /var/log# 以人类可读方式显示日志文件大小
ls -lt /tmp # 按时间排序显示/tmp目录内容
ls -d /etc # 只显示/etc目录本身的信息
ls -R /data # 递归显示/data目录及其子目录内容
注意: 通过 命令 --help 可以常看命令的帮助文档。
命令格式:cd [目录路径]
常用参数:
~ 或省略:切换到当前用户的主目录-:切换到上一次所在的目录..:切换到上级目录.:当前目录/:根目录使用示例:
cd /home/user # 切换到指定目录
cd ~ # 切换到主目录
cd - # 切换到上一次所在的目录
cd .. # 切换到上级目录
cd ../.. # 切换到上两级目录
命令格式:pwd [选项]
常用参数:
-L, --logical:显示逻辑路径(默认)-P, --physical:显示物理路径(解析符号链接)使用示例:
pwd# 显示当前目录的完整路径
pwd -P # 显示物理路径,不显示符号链接
命令格式:mkdir [选项] 目录名
常用参数:
-p, --parents:递归创建目录,如果父目录不存在则一并创建-m, --mode:设置目录权限-v, --verbose:显示创建过程使用示例:
mkdir testdir # 创建单个目录
mkdir -p /data/logs/2024/01 # 递归创建多级目录
mkdir -m 755 /data/public # 创建目录并设置权限为755
mkdir -v newdir # 显示创建过程
命令格式:touch [选项] 文件
常用参数:
-a:只修改访问时间-m:只修改修改时间-c, --no-create:不创建新文件,只更新时间戳-d, --date=STRING:使用指定的时间而不是当前时间-t STAMP:使用指定的时间戳使用示例:
touch newfile.txt # 创建新文件或更新时间戳
touch -a file.txt # 只更新访问时间
touch -m file.txt # 只更新修改时间
touch -c file.txt # 不创建文件,只更新时间戳
touch -d "2024-01-01" file.txt # 设置为指定日期
命令格式:rm [选项] 文件或目录
常用参数:
-f, --force:强制删除,不提示确认-i:删除前逐一确认-r, -R, --recursive:递归删除目录及其内容-v, --verbose:显示删除过程-d, --dir:删除空目录使用示例:
rm file.txt # 删除单个文件(会提示确认)
rm -f file.txt # 强制删除文件,不提示
rm -rf /data/temp # 递归强制删除目录及其内容
rm -i *.log# 删除前逐一确认
rm -v oldfile # 显示删除过程
命令格式:cp [选项] 源文件 目标文件
常用参数:
-r, -R, --recursive:递归复制目录及其内容-i, --interactive:覆盖前提示确认-f, --force:强制复制,如果目标文件存在则强制覆盖-p:保持文件属性(权限、时间戳等)-v, --verbose:显示复制过程-a, --archive:归档复制,保持所有属性并递归复制-u, --update:只在源文件比目标文件新或目标文件不存在时才复制使用示例:
cp file.txt backup.txt # 复制文件
cp -r /data /backup # 递归复制目录
cp -i file.txt /tmp/ # 覆盖前提示确认
cp -p file.txt newfile # 保持文件属性复制
cp -v *.txt /backup # 显示复制过程
cp -u source.txt dest.txt # 只在新文件时复制
命令格式:mv [选项] 源文件 目标文件
常用参数:
-i, --interactive:覆盖前提示确认-f, --force:强制移动,不提示-v, --verbose:显示移动过程-n, --no-clobber:不覆盖已存在的文件-u, --update:只在新文件时移动使用示例:
mv old.txt new.txt # 重命名文件
mv file.txt /tmp/ # 移动文件到目录
mv -i source.txt dest.txt # 覆盖前确认
mv -v *.log /logs # 显示移动过程
mv dir1/ dir2/ # 移动目录
命令格式:echo [选项] [字符串或变量]
常用参数:
-n:不换行输出-e:启用转义字符解释-E:禁用转义字符解释(默认)常用转义字符:
\n:换行\t:制表符\\:反斜杠\$:美元符号使用示例:
echo"Hello World"# 基本输出
echo -n "请输入:"# 不换行输出
echo -e "Line 1\nLine 2"# 使用转义字符
echo"当前用户是:$USER"# 输出变量
echo"今天日期是:$(date)"# 输出命令结果
标准输出重定向:
>:覆盖写入文件>>:追加写入文件标准错误重定向:
2>:重定向错误输出2>&1:将错误输出重定向到标准输出使用示例:
echo"Hello" > file.txt # 写入文件(覆盖)
echo"World" >> file.txt # 追加到文件
ls -l /etc > output.txt 2> error.txt # 标准输出和错误分别重定向
ls -l /etc > output.txt 2>&1 # 输出和错误都重定向到同一文件
ls -l /etc &> output.txt # 简化的全部重定向方式
命令格式:cat [选项] 文件
常用参数:
-n, --number:显示行号-b, --number-nonblank:对非空行显示行号-s, --squeeze-blank:压缩连续的空行到一行-E, --show-ends:在每行结束处显示$-T, --show-tabs:将TAB字符显示为^I-v, --show-nonprinting:显示非打印字符使用示例:
cat file.txt # 显示文件内容
cat -n file.txt # 显示文件内容并显示行号
cat file1.txt file2.txt # 显示多个文件内容
cat -b file.txt # 对非空行显示行号
cat -E file.txt # 显示行尾符号
命令格式:more [选项] 文件
常用参数:
+n:从第n行开始显示-n:定义屏幕大小为n行-d:显示帮助信息-c:不滚屏,显示新内容时清屏使用交互:
Space:向下翻页Enter:向下翻行b:向上翻页/字符串:搜索字符串q:退出使用示例:
more longfile.txt # 分页显示长文件
more +100 file.txt # 从第100行开始显示
ls -la | more # 将命令输出分页显示
命令格式:less [选项] 文件
常用参数:
-N:显示行号-i:搜索时忽略大小写-m:显示百分比-S:不换行显示长行使用交互:
Space:向下翻页b:向上翻页j/k:向下/向上移动一行/字符串:向下搜索?字符串:向上搜索n:重复上次搜索q:退出使用示例:
less largefile.txt # 分页显示大文件
less -N file.txt # 显示行号
ps aux | less # 分页显示进程信息
命令格式:head [选项] 文件
常用参数:
-n NUM:显示前NUM行(默认10行)-c NUM:显示前NUM个字节-q:不显示文件名(当显示多个文件时)使用示例:
head file.txt # 显示前10行
head -n 20 file.txt # 显示前20行
head -n -5 file.txt # 显示除最后5行外的所有内容
head -c 100 file.txt # 显示前100个字节
命令格式:tail [选项] 文件
常用参数:
-n NUM:显示后NUM行(默认10行)-c NUM:显示后NUM个字节-f, --follow:动态跟踪文件内容变化-F:类似-f,但在文件不可读时继续尝试--pid=PID:与-f一起使用,当指定进程结束时停止跟踪使用示例:
tail file.txt # 显示后10行
tail -n 50 file.txt # 显示后50行
tail -f log.txt # 动态跟踪日志文件
tail -n +20 file.txt # 从第20行开始显示
命令格式:grep [选项] 模式 文件
常用参数:
-i, --ignore-case:忽略大小写-v, --invert-match:反向匹配,显示不匹配的行-n, --line-number:显示匹配行的行号-c, --count:只显示匹配的行数-l, --files-with-matches:只显示包含匹配的文件名-r, --recursive:递归搜索目录-w, --word-regexp:匹配整个单词-A NUM:显示匹配行后NUM行-B NUM:显示匹配行前NUM行-C NUM:显示匹配行前后各NUM行--color=auto:高亮显示匹配内容使用示例:
grep "error" log.txt # 搜索包含error的行
grep -i "error" log.txt # 忽略大小写搜索
grep -n "error" log.txt # 显示行号
grep -v "error" log.txt # 显示不包含error的行
grep -r "error" /var/log# 递归搜索目录
grep -A 3 -B 3 "error" log.txt # 显示匹配行前后3行
vi/vim 基本模式:
基本操作:
vi filename # 打开或创建文件
vim filename # 使用vim编辑器(增强版)
模式切换:
i:在当前位置前插入a:在当前位置后插入o:在当前行下方新建一行O:在当前行上方新建一行Esc:返回普通模式导航命令(命令模式):
h/j/k/l:左/下/上/右移动w/b:下一个/上一个单词^/$:行首/行尾gg/G:文件开头/文件末尾nG:跳到第n行编辑命令(命令模式):
x:删除当前字符dd:删除当前行yy:复制当前行p:粘贴到当前行下方P:粘贴到当前行上方u:撤销Ctrl+r:重做搜索替换(命令模式):
/关键词:向下搜索?关键词:向上搜索n:下一个匹配N:上一个匹配替换操作(末行模式)
:s/old/new/g:替换当前行:%s/old/new/g:替换整个文件保存退出(命令模式):
:w:保存:q:退出:wq 或 ZZ:保存并退出:q!:强制退出不保存:e!:放弃修改重新加载补充(命令模式):
:set nu :显示行号:set nonu :不显示行号:n : n 表示数字,跳转到第几行:nd: n 表示数字,d表示删除,n可以是个范围(1,5 | 2,9 | 1,$ ....)使用示例:
# 编辑文件
vi /etc/hosts
# 在普通模式下:
i # 进入插入模式
192.168.1.100 server01 # 输入内容
Esc # 返回普通模式
:wq # 保存并退出
文件类型识别: 在Linux中,每个文件和目录都有特定的类型,通过ls -l命令可以查看文件类型:
ls -l /etc/passwd
-rw-r--r--. 1 root root 2659 Jan 1 12:00 /etc/passwd
文件类型标识符(第一个字符):
-:普通文件(regular file)d:目录(directory)l:符号链接(symbolic link)c:字符设备文件(character device)b:块设备文件(block device)p:命名管道(named pipe)s:套接字文件(socket)文件类型查看命令:
# 查看文件类型
file /etc/passwd # ASCII text
file /bin/ls # ELF 64-bit LSB executable
# 查看文件详细信息
stat /etc/passwd # 显示文件的详细状态信息
ls -la /dev/ # 查看设备文件
特殊文件类型详解:
1. 普通文件(-):
# 文本文件
-rw-r--r-- 1 root root 100 Jan 1 10:00 config.txt
# 二进制可执行文件
-rwxr-xr-x 1 root root 5000 Jan 1 10:00 program
# 数据文件
-rw-r--r-- 1 root root 200 Jan 1 10:00 data.dat
2. 目录文件(d):
drwxr-xr-x 2 root root 4096 Jan 1 10:00 documents/
# 目录权限含义:
# r:可以列出目录内容(ls)
# w:可以在目录中创建、删除文件
# x:可以进入目录(cd)
3. 符号链接(l):
lrwxrwxrwx 1 root root 9 Jan 1 10:00 link -> target.txt
# 创建符号链接
ln -s target.txt link # 创建软链接
readlink link # 查看链接指向的目标
4. 设备文件:
# 字符设备(c)- 串行设备,如终端
crw--w---- 1 root tty 4, 0 Jan 1 10:00 /dev/tty0
# 块设备(b)- 随机访问设备,如硬盘
brw-rw---- 1 root disk 8, 0 Jan 1 10:00 /dev/sda
# 设备文件格式:主设备号,次设备号
# 主设备号:设备类型
# 次设备号:具体设备实例
5. 命名管道(p):
prw------- 1 root root 0 Jan 1 10:00 mypipe
# 创建命名管道
mkfifo mypipe # 创建命名管道
ls -l mypipe # 查看管道文件
6. 套接字文件(s):
srwxrwxrwx 1 root root 0 Jan 1 10:00 socket
# 套接字用于进程间网络通信
# 通常由应用程序自动创建
权限表示方法:
u+x:给用户添加执行权限g-w:移除组的写权限o=r:设置其他人的权限为只读a+r:给所有人添加读权限权限对文件和目录的不同含义:
常用参数:
-R, --recursive:递归修改目录及其内容的权限-v, --verbose:显示修改过程-c, --changes:只在权限改变时显示信息使用示例:
chmod 755 script.sh # 用户:rwx,组:r-x,其他:r-x
chmod u+x file.txt # 给用户添加执行权限
chmod g-w file.txt # 移除组的写权限
chmod 644 *.txt # 所有txt文件设为rw-r--r--
chmod -R 755 /data # 递归修改/data目录权限
特殊权限位:
# SUID (Set User ID) - 4000
chmod u+s program # 设置SUID权限
# 当用户执行该程序时,以程序所有者的身份运行
# SGID (Set Group ID) - 2000
chmod g+s directory # 设置SGID权限
# 在目录中创建的新文件将继承目录的组
# Sticky Bit - 1000
chmod +t /tmp # 设置粘滞位
# 只有文件所有者才能删除目录中的文件(如/tmp目录)
# 数字表示法
chmod 4755 program # 设置SUID (4) + 755
chmod 2755 directory # 设置SGID (2) + 755
chmod 1755 /tmp # 设置Sticky Bit (1) + 755
命令格式:chown [选项] [所有者][:[组]] 文件
常用参数:
-R, --recursive:递归修改目录及其内容的所有者-v, --verbose:显示修改过程-c, --changes:只在所有者改变时显示信息--from=当前所有者:当前组:只在当前所有者匹配时才修改使用示例:
chown user file.txt # 修改文件所有者为user
chown user:group file.txt # 同时修改所有者和所属组
chown :group file.txt # 只修改所属组
chown -R user:group /data # 递归修改目录所有者
chown -v user file.txt # 显示修改过程
文件权限查看与解析:
# 详细查看文件权限
ls -l filename # 查看文件权限
ls -ld directory/ # 查看目录权限
ls -la /tmp # 查看所有文件包括隐藏文件
# 权限数字计算
rwx = 4+2+1 = 7
rw- = 4+2+0 = 6
r-x = 4+0+1 = 5
r-- = 4+0+0 = 4
# 所以:
# rwxr-xr-x = 755
# rw-r--r-- = 644
# rwx------ = 700
权限验证命令:
# 检查文件权限
test -r file.txt && echo"可读" || echo"不可读"
test -w file.txt && echo"可写" || echo"不可写"
test -x script.sh && echo"可执行" || echo"不可执行"
# 使用[ ]进行权限检查
[ -r file.txt ] && echo"文件可读"
[ -w file.txt ] && echo"文件可写"
[ -x script.sh ] && echo"脚本可执行"
[ -d directory ] && echo"是目录"
[ -f file.txt ] && echo"是普通文件"
[ -L linkname ] && echo"是符号链接"
命令格式:chgrp [选项] 组 文件
常用参数:
-R, --recursive:递归修改目录及其内容的所属组-v, --verbose:显示修改过程-c, --changes:只在所属组改变时显示信息使用示例:
chgrp admin file.txt # 修改文件所属组为admin
chgrp -R admin /data # 递归修改目录所属组
chgrp -v admin file.txt # 显示修改过程
命令格式:useradd [选项] 用户名
常用参数:
-d, --home HOME_DIR:指定用户主目录-m, --create-home:创建用户主目录-s, --shell SHELL:指定用户登录shell-g, --gid GROUP:指定主要组-G, --groups GROUPS:指定附加组-u, --uid UID:指定用户ID-c, --comment COMMENT:添加用户描述-e, --expiredate EXPIRE_DATE:设置账户过期日期-f, --inactive INACTIVE:设置密码过期后账户禁用天数使用示例:
useradd testuser # 创建新用户
useradd -m -d /home/test testuser # 创建用户并指定主目录
useradd -s /bin/bash testuser # 指定登录shell
useradd -g users -G admin,db testuser # 指定主要组和附加组
useradd -u 1001 testuser # 指定用户ID
useradd -c "Test User" testuser # 添加用户描述
命令格式:passwd [选项] [用户名]
常用参数:
-d, --delete:删除用户密码-l, --lock:锁定用户账户-u, --unlock:解锁用户账户-e, --expire:强制用户下次登录时修改密码-n, --minimum DAYS:设置密码最小使用天数-x, --maximum DAYS:设置密码最大使用天数-w, --warning DAYS:设置密码过期警告天数使用示例:
passwd testuser # 设置用户密码
passwd -l testuser # 锁定用户账户
passwd -u testuser # 解锁用户账户
passwd -e testuser # 强制下次登录修改密码
passwd -d testuser # 删除用户密码
命令格式:userdel [选项] 用户名
常用参数:
-r, --remove:删除用户主目录和邮件目录-f, --force:强制删除用户,即使用户仍在登录使用示例:
userdel testuser # 只删除用户,保留主目录
userdel -r testuser # 删除用户及其主目录
userdel -f testuser # 强制删除用户
命令格式:usermod [选项] 用户名
常用参数:
-d, --home HOME_DIR:修改用户主目录-m, --move-home:移动用户主目录到新位置-s, --shell SHELL:修改用户登录shell-g, --gid GROUP:修改主要组-G, --groups GROUPS:修改附加组-u, --uid UID:修改用户ID-c, --comment COMMENT:修改用户描述-L, --lock:锁定用户账户-U, --unlock:解锁用户账户使用示例:
usermod -d /new/home testuser # 修改用户主目录
usermod -s /bin/zsh testuser # 修改登录shell
usermod -g newgroup testuser # 修改主要组
usermod -G group1,group2 testuser # 修改附加组
usermod -L testuser # 锁定用户账户
usermod -U testuser # 解锁用户账户
命令格式:groupadd [选项] 组名
常用参数:
-g, --gid GID:指定组ID-r, --system:创建系统组-f, --force:如果组已存在,强制成功退出使用示例:
groupadd admin # 创建新组
groupadd -g 1001 admin # 指定组ID
groupadd -r system # 创建系统组
命令格式:groupdel 组名
使用示例:
groupdel admin # 删除组
命令格式:groupmod [选项] 组名
常用参数:
-g, --gid GID:修改组ID-n, --new-name NEW_NAME:修改组名使用示例:
groupmod -g 1002 admin # 修改组ID
groupmod -n newadmin admin # 修改组名
命令格式:gzip [选项] 文件
常用参数:
-d, --decompress:解压缩-c, --stdout:将输出写入标准输出,保留原文件-v, --verbose:显示压缩过程-1 到 -9:压缩级别,1最快压缩比最低,9最慢压缩比最高-r, --recursive:递归处理目录使用示例:
gzip file.txt # 压缩文件,原文件会被删除
gzip -d file.txt.gz # 解压缩文件
gzip -c file.txt > file.txt.gz # 压缩并保留原文件
gzip -v file.txt # 显示压缩过程
命令格式:zip [选项] 压缩包名 文件或目录
常用参数:
-r, --recurse-paths:递归处理目录-v, --verbose:显示详细过程-q, --quiet:安静模式,不显示过程-9:最高压缩比-0:不压缩,只存储-x:排除指定文件-m:压缩后删除原文件使用示例:
zip archive.zip file1 file2 # 压缩文件
zip -r archive.zip /data # 递归压缩目录
zip -r archive.zip /data -x "*.log"# 排除日志文件
zip -9 archive.zip file.txt # 最高压缩比
命令格式:unzip [选项] 压缩包名
常用参数:
-l:列出压缩包内容-v:显示详细信息-d 目录:解压到指定目录-o:覆盖已存在的文件-n:不覆盖已存在的文件-q:安静模式使用示例:
unzip archive.zip # 解压缩zip文件
unzip -l archive.zip # 查看zip文件内容
unzip archive.zip -d /tmp # 解压到指定目录
unzip -o archive.zip # 覆盖已存在文件
命令格式:tar [选项] 包名 指定文件
常用参数:
-c, --create:创建新的归档文件-x, --extract:解包归档文件-t, --list:列出归档文件内容-v, --verbose:显示详细过程-f, --file:指定归档文件名-z, --gzip:通过gzip压缩/解压缩-j, --bzip2:通过bzip2压缩/解压缩-J, --xz:通过xz压缩/解压缩-C, --directory:解压到指定目录--exclude=PATTERN:排除匹配的文件使用示例:
tar -cvf archive.tar file1 file2 # 创建tar包
tar -xvf archive.tar # 解包tar文件
tar -tvf archive.tar # 查看tar包内容
tar -czvf archive.tar.gz /data # 创建gzip压缩的tar包
tar -xzvf archive.tar.gz # 解压gzip压缩的tar包
tar -xvf archive.tar -C /tmp # 解压到指定目录
命令格式:crontab [选项] [文件]
常用参数:
-e:编辑当前用户的crontab文件-l:列出当前用户的crontab内容-r:删除当前用户的crontab文件-u 用户:指定要操作的用户(需要root权限)-i:删除前提示确认时间格式:
* * * * * command
│ │ │ │ │
│ │ │ │ └─── 星期 (0-7, 0和7都表示星期日)
│ │ │ └───── 月份 (1-12)
│ │ └─────── 日期 (1-31)
│ └───────── 小时 (0-23)
└─────────── 分钟 (0-59)
特殊符号:
*:任意值,:列举值(如1,3,5)-:范围值(如1-5)/:步进值(如*/5表示每5个单位)使用示例:
# 编辑定时任务
crontab -e
# 每小时的第5分钟执行
5 * * * * /script.sh
# 每天的2:30执行
30 2 * * * /script.sh
# 每周一的8:00执行
0 8 * * 1 /script.sh
# 每月1号的0:00执行
0 0 1 * * /script.sh
# 每5分钟执行一次
*/5 * * * * /script.sh
# 查看定时任务
crontab -l
# 删除定时任务
crontab -r
命令格式:at [选项] 时间
常用参数:
-f 文件:从指定文件读取命令-l:列出待执行的at任务-d 任务号:删除指定的at任务-c 任务号:查看指定任务的内容-m:任务完成后发送邮件给用户时间格式:
HH:MM:指定小时和分钟(如14:30)now + n minutes/hours/days/weeks:相对时间midnight/noon/teatime:特殊时间MMDDYY 或 MM/DD/YY:指定日期使用示例:
# 在指定时间执行命令
echo"backup.sh" | at 14:30
at 14:30
> /script/backup.sh
> Ctrl+D
# 查看待执行的at任务
at -l
# 删除at任务
at -d 1
# 相对时间
at now + 2 hours
at now + 30 minutes
at now + 1 day
正则表达式(Regular Expression,简称regex或regexp)是一种用于匹配字符串中字符组合的模式。在Linux文本处理中,正则表达式是三剑客(grep、sed、awk)的核心基础,掌握正则表达式对于高效的文本处理至关重要。
字符匹配:
.:匹配任意单个字符(除换行符)[]:匹配方括号内的任意一个字符[^]:匹配不在方括号内的任意一个字符\:转义特殊字符使用示例:
grep 'a.c' file.txt # 匹配a、c之间有任意字符的字符串,如abc、aac、a1c
grep '[aeiou]' file.txt # 匹配任意元音字母
grep '[0-9]' file.txt # 匹配任意数字
grep '[^0-9]' file.txt # 匹配任意非数字字符
grep '\.' file.txt # 匹配实际的点号字符
位置锚定:
^:匹配行首$:匹配行尾\<:匹配词首\>:匹配词尾使用示例:
grep '^hello' file.txt # 匹配以hello开头的行
grep 'world$' file.txt # 匹配以world结尾的行
grep '^$' file.txt # 匹配空行
grep '\<word' file.txt # 匹配以word开头的单词
grep 'word\>' file.txt # 匹配以word结尾的单词
重复匹配:
*:匹配前面的字符0次或多次\{n\}:匹配前面的字符恰好n次\{n,\}:匹配前面的字符至少n次\{n,m\}:匹配前面的字符n到m次使用示例:
grep 'ab*c' file.txt # 匹配ac、abc、abbc、abbbc等
grep 'o\{2\}' file.txt # 匹配恰好两个连续的o
grep 'o\{2,\}' file.txt # 匹配至少两个连续的o
grep 'o\{1,3\}' file.txt # 匹配1到3个连续的o
扩展正则表达式提供了更强大的匹配能力,在grep中使用-E选项,在sed中使用-r选项启用。
重复匹配:
+:匹配前面的字符1次或多次?:匹配前面的字符0次或1次{n}:匹配前面的字符恰好n次{n,}:匹配前面的字符至少n次{n,m}:匹配前面的字符n到m次使用示例:
grep -E 'ab+c' file.txt # 匹配abc、abbc、abbbc等(至少一个b)
grep -E 'ab?c' file.txt # 匹配ac或abc(b可选)
grep -E 'o{2}' file.txt # 匹配恰好两个连续的o
grep -E 'colou?r' file.txt # 匹配color或colour
分组和引用:
():分组,将多个字符当作一个整体|:或运算,匹配多个模式中的任意一个\n:向后引用,n为1-9的数字使用示例:
grep -E '(ab)+' file.txt # 匹配ab、abab、ababab等
grep -E 'cat|dog' file.txt # 匹配cat或dog
grep -E 'go{2}d|bad' file.txt # 匹配good或bad
# 分组引用示例
echo"the the" | grep -E '(\w+) \1'# 匹配重复的单词
预定义字符类:
\w:匹配单词字符(字母、数字、下划线)\W:匹配非单词字符\s:匹配空白字符(空格、制表符等)\S:匹配非空白字符\d:匹配数字(0-9)\D:匹配非数字字符使用示例:
grep -E '\w+' file.txt # 匹配一个或多个单词字符
grep -E '\d{3}' file.txt # 匹配恰好3个数字
grep -E '\s+' file.txt # 匹配一个或多个空白字符
grep命令默认使用基本正则表达式,使用-E选项启用扩展正则表达式。
基本用法:
grep "pattern" file.txt # 基本字符串匹配
grep -E "pattern1|pattern2" file.txt # 扩展正则,匹配多个模式
grep -P "pattern" file.txt # 使用Perl兼容正则表达式(部分系统支持)
高级示例:
# 匹配IP地址
grep -E '\b([0-9]{1,3}\.){3}[0-9]{1,3}\b' file.txt
# 匹配邮箱地址
grep -E '\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b' file.txt
# 匹配日期格式(YYYY-MM-DD)
grep -E '\b[0-9]{4}-[0-9]{2}-[0-9]{2}\b' file.txt
# 匹配手机号码(中国)
grep -E '\b1[3-9][0-9]{9}\b' file.txt
# 匹配URL
grep -E 'https?://[^/]+' file.txt
grep常用正则选项:
grep -i "pattern" file.txt # 忽略大小写
grep -v "pattern" file.txt # 反向匹配(不匹配的行)
grep -w "pattern" file.txt # 匹配整个单词
grep -x "pattern" file.txt # 匹配整行
grep -A 2 "pattern" file.txt # 显示匹配行及后2行
grep -B 2 "pattern" file.txt # 显示匹配行及前2行
grep -C 2 "pattern" file.txt # 显示匹配行及前后各2行
sed命令支持基本正则表达式,使用-r选项启用扩展正则表达式。
基本替换语法:
sed 's/regexp/replacement/' file.txt # 替换每行第一个匹配
sed 's/regexp/replacement/g' file.txt # 替换所有匹配
sed -r 's/regexp/replacement/' file.txt # 使用扩展正则表达式
高级sed正则示例:
# 提取行首的数字
sed 's/^\([0-9]\+\).*/\1/' file.txt
# 删除HTML标签
sed 's/<[^>]*>//g' file.html
# 格式化电话号码(123-456-7890)
sed -r 's/([0-9]{3})([0-9]{3})([0-9]{4})/\1-\2-\3/' file.txt
# 提取URL中的域名
sed -r 's|https?://([^/]+).*|\1|' file.txt
# 将日期格式从MM/DD/YYYY转换为YYYY-MM-DD
sed -r 's|([0-9]{1,2})/([0-9]{1,2})/([0-9]{4})|\3-\1-\2|' file.txt
sed地址定界与正则:
sed '/pattern/d' file.txt # 删除匹配pattern的行
sed '/pattern/s/old/new/g' file.txt # 在匹配pattern的行中替换
sed '/start_pattern/,/end_pattern/d' file.txt # 删除两个模式之间的行
sed '1,/pattern/s/old/new/' file.txt # 从第1行到匹配pattern的行进行替换
awk内置强大的正则表达式支持,可以在模式和动作中使用。
基本正则匹配:
awk '/pattern/ {print}' file.txt # 匹配包含pattern的行
awk '!/pattern/ {print}' file.txt # 匹配不包含pattern的行
awk '$1 ~ /pattern/ {print}' file.txt # 匹配第1列包含pattern的行
awk '$1 !~ /pattern/ {print}' file.txt # 匹配第1列不包含pattern的行
高级awk正则示例:
# 匹配以数字开头的行
awk '/^[0-9]/ {print}' file.txt
# 匹配IP地址并提取
awk '/\b([0-9]{1,3}\.){3}[0-9]{1,3}\b/ {print}' file.txt
# 匹配邮箱地址并统计
awk '/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b/ {count++} END {print "邮箱数量:", count}' file.txt
# 匹配日期并重新格式化
awk 'match($0, /([0-9]{1,2})\/([0-9]{1,2})\/([0-9]{4})/, arr) {print arr[3] "-" arr[1] "-" arr[2]}' file.txt
# 使用split函数和正则提取域名
awk '{split($0, arr, "https?://"); if(length(arr)>1) {split(arr[2], dom, "/"); print dom[1]}}' file.txt
awk内置字符串函数与正则:
# sub函数:替换第一个匹配
awk '{sub(/pattern/, "replacement"); print}' file.txt
# gsub函数:替换所有匹配
awk '{gsub(/pattern/, "replacement"); print}' file.txt
# match函数:返回匹配位置
awk 'match($0, /pattern/) {print "匹配位置:", RSTART, "匹配长度:", RLENGTH}' file.txt
# split函数:按正则分割
awk '{n = split($0, arr, /[,:;]/); for(i=1; i<=n; i++) print arr[i]}' file.txt
性能优化建议:
[0-9]比.更高效.*可能导致回溯过多.*?代替.*调试技巧:
# 使用grep --color高亮显示匹配部分
grep --color -E 'pattern' file.txt
# 使用grep -o只显示匹配的部分
grep -o -E 'pattern' file.txt
# 使用sed -n和p命令只显示匹配的行
sed -n '/pattern/p' file.txt
# 使用awk打印匹配位置和长度
awk 'match($0, /pattern/) {print NR ":" RSTART "-" RSTART+RLENGTH-1 ":" $0}' file.txt
常见模式参考:
# 匹配整数
^[0-9]+$
# 匹配浮点数
^[0-9]+\.[0-9]+$
# 匹配十六进制颜色代码
^#[0-9A-Fa-f]{6}$
# 匹配中文字符
[\u4e00-\u9fa5]
# 匹配HTML标签
<[^>]+>
# 匹配JSON字符串
"[^"\\]*(\\.[^"\\]*)*"
grep(Global Regular Expression Print)是Linux中最常用的文本搜索工具,支持强大的正则表达式。
命令格式:grep [选项] 模式 文件
常用参数:
-i, --ignore-case:忽略大小写-v, --invert-match:反向匹配,显示不匹配的行-n, --line-number:显示匹配行的行号-c, --count:只显示匹配的行数-l, --files-with-matches:只显示包含匹配的文件名-r, --recursive:递归搜索目录-w, --word-regexp:匹配整个单词-A NUM:显示匹配行后NUM行-B NUM:显示匹配行前NUM行-C NUM:显示匹配行前后各NUM行--color=auto:高亮显示匹配内容-E, --extended-regexp:使用扩展正则表达式-P, --perl-regexp:使用Perl兼容正则表达式实战示例:
# 基本文本搜索
grep "error" log.txt # 搜索包含error的行
grep -i "error" log.txt # 忽略大小写搜索
grep -n "error" log.txt # 显示行号
grep -v "error" log.txt # 显示不包含error的行
grep -c "error" log.txt # 统计匹配行数
# 高级正则表达式搜索
grep -E "error|fail|exception" log.txt # 匹配多个错误关键词
grep -E "\b[0-9]{3}-[0-9]{3}-[0-9]{4}\b" file.txt # 匹配电话号码格式
grep -E "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b" file.txt # 匹配邮箱
# 上下文搜索
grep -A 3 "error" log.txt # 显示匹配行及后3行
grep -B 3 "error" log.txt # 显示匹配行及前3行
grep -C 3 "error" log.txt # 显示匹配行及前后各3行
# 文件搜索
grep -r "error" /var/log/ # 递归搜索目录
grep -l "error" *.log# 只显示包含匹配的文件名
grep -w "error" log.txt # 匹配整个单词(不会匹配errors)
# 复杂模式匹配
grep -E "^2024-01-01.*error.*timeout" log.txt # 匹配特定日期和错误类型的行
grep -P "(?<=user:)[a-zA-Z0-9]+" log.txt # 使用Perl正则提取用户名
grep --color=auto "error" log.txt # 高亮显示匹配内容
sed(Stream Editor)是一个强大的流编辑器,可以对文本进行各种转换和处理。
命令格式:sed [选项] '脚本' 文件
常用参数:
-n:关闭默认输出-e 脚本:添加要执行的脚本-f 脚本文件:从文件读取脚本-i:直接修改文件内容-r, -E:使用扩展正则表达式常用操作:
s/旧字符串/新字符串/:替换(默认只替换每行第一个)s/旧字符串/新字符串/g:全局替换d:删除行p:打印行i\:插入行a\:追加行c\:替换整行y/字符集1/字符集2/:字符转换实战示例:
# 基本替换操作
sed 's/old/new/' file.txt # 替换每行第一个old为new
sed 's/old/new/g' file.txt # 替换所有old为new
sed 's/old/new/2' file.txt # 只替换每行第2个old
sed -i 's/old/new/g' file.txt # 直接修改文件
# 使用正则表达式的替换
sed -r 's/([0-9]{3})([0-9]{3})([0-9]{4})/\1-\2-\3/' file.txt # 格式化电话号码
sed -r 's|https?://[^/]+||' file.txt # 删除URL中的协议和域名
sed 's/<[^>]*>//g' file.html # 删除HTML标签
# 删除操作
sed '/pattern/d' file.txt # 删除包含pattern的行
sed '/^$/d' file.txt # 删除空行
sed '/^#/d' file.txt # 删除注释行(以#开头)
sed '1,5d' file.txt # 删除1到5行
sed '$d' file.txt # 删除最后一行
# 打印操作
sed -n '1,5p' file.txt # 显示1到5行(类似head)
sed -n '5,$p' file.txt # 显示第5行到末尾(类似tail从第5行开始)
sed -n '/pattern/p' file.txt # 只显示包含pattern的行(类似grep)
# 插入和追加
sed '1i\newline' file.txt # 在第1行前插入新行
sed '$a\newline' file.txt # 在最后追加新行
sed '/pattern/a\newline' file.txt # 在匹配pattern的行后追加新行
# 多命令组合
sed -e 's/old/new/' -e 's/foo/bar/' file.txt # 执行多个替换
sed 's/old/new/; s/foo/bar/' file.txt # 在同一脚本中执行多个命令
# 高级文本处理
sed -r 's/^([A-Z][a-z]+) ([A-Z][a-z]+)$/\2, \1/' file.txt # 交换姓名顺序(Last, First)
sed 's/\b\w/\u&/g' file.txt # 将每个单词首字母大写
sed -r 's/([a-z])([A-Z])/\1_\L\2/g' file.txt # 将驼峰命名转换为下划线命名
awk是一个功能强大的文本处理工具,特别适合处理结构化文本数据。
命令格式:awk [选项] '模式{动作}' 文件
常用参数:
-F 分隔符:指定字段分隔符-v 变量=值:定义变量-f 脚本文件:从文件读取awk脚本内置变量:
$0:整行内容$1,$2,...:第1,2,...个字段NF:当前行的字段数(Number of Fields)NR:当前行号(Number of Records)FNR:当前文件中的行号FS:字段分隔符(Field Separator)OFS:输出字段分隔符(Output Field Separator)RS:记录分隔符(Record Separator)ORS:输出记录分隔符(Output Record Separator)FILENAME:当前文件名实战示例:
# 基本字段处理
awk '{print $1}' file.txt # 打印第1列
awk '{print $1, $3}' file.txt # 打印第1和第3列
awk -F: '{print $1,$3}' /etc/passwd # 指定分隔符为冒号,打印用户名和UID
awk -F',''{print NF}' file.csv # 显示每行的字段数
# 行号处理
awk '{print NR, $0}' file.txt # 显示行号和整行内容
awk 'NR>1{print}' file.txt # 跳过第1行(常用于跳过表头)
awk 'NR==5{print}' file.txt # 只显示第5行
awk 'NR%2==0{print}' file.txt # 只显示偶数行
# 条件过滤
awk '$3>80{print}' file.txt # 打印第3列大于80的行
awk '$1=="root"{print}' /etc/passwd # 打印第1列等于root的行
awk '$1~/pattern/{print}' file.txt # 打印第1列匹配pattern的行
awk '$1!~/pattern/{print}' file.txt # 打印第1列不匹配pattern的行
# 数学计算
awk '{sum+=$3} END {print "总和:", sum}' file.txt # 求第3列的和
awk '{sum+=$3; count++} END {print "平均值:", sum/count}' file.txt # 求平均值
awk '$3>max{max=$3} END {print "最大值:", max}' file.txt # 求最大值
awk 'NR==1{min=$3} $3<min{min=$3} END {print "最小值:", min}' file.txt # 求最小值
# 字符串处理
awk '{print length($0)}' file.txt # 显示每行的字符数
awk '{print toupper($0)}' file.txt # 将整行转换为大写
awk '{print tolower($0)}' file.txt # 将整行转换为小写
awk '{gsub(/old/, "new"); print}' file.txt # 全局替换(类似sed的g)
# 格式化输出
awk '{printf "%-10s %5d %8.2f\n", $1, $2, $3}' file.txt # 格式化输出
awk 'BEGIN{printf "%-10s %-10s %-10s\n", "Name", "Age", "Score"; print "----------"} {printf "%-10s %5d %8.2f\n", $1, $2, $3}' file.txt # 带表头
# 多文件处理
awk '{count[FNR]++} END {for(i=1;i<=FNR;i++) print i, count[i]}' file1.txt file2.txt # 统计每行出现的文件数
# 数组和关联数组
awk '{count[$1]++} END {for(word in count) print word, count[word]}' file.txt # 统计单词出现次数
awk '!seen[$0]++' file.txt # 删除重复行(保留第一次出现的)
# 高级正则表达式应用
awk 'match($0, /([0-9]{3})-([0-9]{3})-([0-9]{4})/, arr) {print arr[1], arr[2], arr[3]}' file.txt # 提取电话号码
awk 'BEGIN{IGNORECASE=1} /pattern/' file.txt # 忽略大小写匹配
日志分析场景:
# 统计不同错误类型的数量
grep -E "(ERROR|WARN|INFO)" app.log | awk '{count[$2]++} END {for(type in count) print type, count[type]}'
# 提取特定时间段的日志并统计访问量
sed -n '/2024-01-01 14:00:00/,/2024-01-01 15:00:00/p' access.log | awk '{print $1}' | sort | uniq -c | sort -nr
# 分析访问日志,统计每个IP的访问次数
grep -v "^#" access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -20
# 统计响应时间超过1秒的记录
grep -E '" [0-9]{3} [0-9]{4,}' access.log | awk '{print $1, $7, $9}'
数据处理场景:
# 从CSV文件中提取特定列并重新格式化
awk -F',''$5>100 {printf "用户:%s, 消费:%.2f, 等级:%s\n", $2, $5, $6}' users.csv
# 合并两个文件的关联数据
awk -F',''NR==FNR{a[$1]=$2; next} ($1 in a){print $0, a[$1]}' file1.csv file2.csv
# 数据清洗:删除空行和注释行
sed '/^$/d; /^#/d' data.txt | awk 'NF>0 {print}'
# 统计文本中各种字符的出现频率
sed 's/\(.\)/\1\n/g' file.txt | grep -v '^$' | sort | uniq -c | sort -nr
系统管理场景:
# 分析系统进程,统计内存使用超过1GB的进程
ps aux | awk '$6>1048576 {print $2, $11, $6/1024 "MB"}'
# 统计磁盘使用情况,找出大文件
find / -type f -size +100M -exec ls -lh {} \; | awk '{print $5, $9}' | sort -nr
# 分析网络连接状态
netstat -an | grep -E "(ESTABLISHED|LISTEN)" | awk '{state[$NF]++} END {for(s in state) print s, state[s]}'
# 监控系统负载,超过阈值时发送告警
uptime | awk -F'load average:''{print $2}' | awk -F',''{if($1>8.0) print "系统负载过高:" $1}'
grep优化:
# 对于大文件,使用固定字符串搜索更快
grep -F "fixed_string" large_file.txt # 比正则表达式搜索更快
# 限制搜索范围,避免全文件扫描
grep "pattern" file.txt | head -100 # 只获取前100个匹配
# 使用多线程加速(部分grep版本支持)
grep --mmap "pattern" large_file.txt # 使用内存映射
sed优化:
# 避免不必要的全局替换
sed 's/pattern/replacement/' file.txt # 如果只需要替换第一个,不要加g
# 对于大文件,使用就地编辑节省内存
sed -i 's/pattern/replacement/' large_file.txt # 直接修改文件,不创建临时文件
# 组合多个操作为单个sed脚本
sed -e 's/pat1/rep1/' -e 's/pat2/rep2/' -e '/pat3/d' file.txt # 比多次调用sed更高效
awk优化:
# 预定义变量,避免重复计算
awk 'BEGIN{OFS=","} {print $1, $2}' file.txt # 在BEGIN块中设置输出分隔符
# 使用next跳过不需要的行
awk '$1=="#" {next} {process($0)}' file.txt # 跳过注释行,避免不必要的处理
# 合理使用数组,避免内存溢出
awk '{if(NR%1000==0) {process_array(); delete a}} {a[NR]=$0}' large_file.txt
# 对于数值计算,使用内置函数而非外部命令
awk '{sum+=$1} END {print sum}' file.txt # 比调用外部计算器更高效
uname - 显示系统信息
uname # 显示内核名称
uname -a # 显示所有系统信息
uname -r # 显示内核版本
uname -m # 显示硬件架构
uptime - 显示系统运行时间
uptime # 显示系统运行时间、用户数、负载
uptime -p # 显示格式化的运行时间
date - 显示或设置系统日期时间
date # 显示当前日期时间
date +"%Y-%m-%d %H:%M:%S"# 格式化显示
date -s "2024-01-01 12:00:00"# 设置日期时间
cal - 显示日历
cal # 显示当月日历
cal 2024 # 显示2024年全年日历
cal 12 2024 # 显示2024年12月日历
系统时间概念:
查看时间信息:
date # 显示当前本地时间
date -u # 显示UTC时间
timedatectl # 显示详细时间信息(CentOS 7+)
hwclock # 显示硬件时间
时间格式详解:
# 常用时间格式字符串
%Y # 年份(4位,如2024)
%m # 月份(01-12)
%d # 日期(01-31)
%H # 小时(00-23,24小时制)
%I # 小时(01-12,12小时制)
%M # 分钟(00-59)
%S # 秒(00-59)
%s # Unix时间戳(秒数)
%A # 星期几(完整名称,如Monday)
%a # 星期几(缩写,如Mon)
%B # 月份名称(完整,如January)
%b # 月份名称(缩写,如Jan)
%p # AM/PM
%Z # 时区缩写
时间格式化示例:
date +"%Y-%m-%d"# 2024-01-01
date +"%H:%M:%S"# 14:30:45
date +"%Y-%m-%d %H:%M:%S"# 2024-01-01 14:30:45
date +"%A, %B %d, %Y"# Monday, January 01, 2024
date +"%s"# Unix时间戳(1704117045)
date +"%Y-%m-%d_%H-%M-%S"# 文件名格式(2024-01-01_14-30-45)
时间计算:
# 显示昨天、明天
date -d "yesterday"# 昨天
date -d "tomorrow"# 明天
date -d "1 day ago"# 1天前
date -d "1 week ago"# 1周前
date -d "1 month ago"# 1个月前
date -d "+3 days"# 3天后
date -d "next monday"# 下周一
date -d "last friday"# 上周五
设置系统时间:
# 设置日期和时间(需要root权限)
date -s "2024-01-01 14:30:45"
date -s "20240101 14:30:45"# 简写格式
date -s "14:30:45"# 只设置时间
# 同步网络时间(需要安装ntpdate)
yum install -y ntpdate
ntpdate pool.ntp.org # 同步网络时间
hwclock --systohc # 将系统时间写入硬件时间
时区设置:
# 查看当前时区
ls -l /etc/localtime # 查看时区链接
cat /etc/timezone # 查看时区文件(某些系统)
# 列出所有可用时区
timedatectl list-timezones # CentOS 7+
ls /usr/share/zoneinfo/ # 传统方式
# 设置时区(CentOS 7+)
timedatectl set-timezone Asia/Shanghai
timedatectl set-timezone America/New_York
# 传统方式设置时区
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
NTP时间同步:
# 安装NTP服务
yum install -y ntp
# 启动NTP服务
systemctl start ntpd
systemctl enable ntpd
# 手动同步时间
ntpdate -u pool.ntp.org
# 查看NTP同步状态
ntpq -p # 查看NTP服务器状态
timedatectl status # 查看时间同步状态
top - 实时显示系统进程
top # 显示系统进程信息
top -u username # 显示指定用户的进程
htop - 增强版进程查看器(需安装)
yum install -y htop # 安装htop
htop # 显示彩色进程信息
free - 显示内存使用情况
free # 显示内存信息
free -h # 人性化显示
free -m # 以MB为单位显示
df - 显示磁盘空间使用情况
df # 显示磁盘使用情况
df -h # 人性化显示
df -T # 显示文件系统类型
du - 显示目录空间使用情况
du # 显示当前目录大小
du -h # 人性化显示
du -sh /home/user/ # 显示指定目录总大小
ps - 显示进程状态
ps # 显示当前用户的进程
ps -ef # 显示所有进程的详细信息
ps aux # 显示所有进程的详细信息(BSD风格)
ps -ef | grep nginx # 查找特定进程
kill - 终止进程
kill PID # 正常终止指定进程
kill -9 PID # 强制终止进程
killall process_name # 按名称终止所有相关进程
jobs - 显示后台任务
jobs# 显示当前shell的后台任务
jobs -l # 显示详细信息
bg - 将任务放到后台运行
bg %1 # 将任务1放到后台运行
fg - 将后台任务放到前台
fg %1 # 将任务1放到前台运行
yum - CentOS 软件包管理
yum update # 更新所有软件包
yum install package # 安装软件包
yum remove package # 卸载软件包
yum search keyword # 搜索软件包
yum list installed # 列出已安装软件包
yum info package # 显示软件包信息
yum clean all # 清理缓存
rpm - RPM软件包管理
rpm -ivh package.rpm # 安装RPM包
rpm -Uvh package.rpm # 升级RPM包
rpm -e package # 卸载RPM包
rpm -qa # 查询所有已安装包
rpm -qi package # 查询软件包信息
rpm -ql package # 查询软件包文件列表
rpm -qf /path/file # 查询文件所属软件包
ping - 测试网络连通性
ping www.baidu.com # 持续ping测试
ping -c 4 www.baidu.com # 指定ping次数
ping -i 0.5 www.baidu.com # 设置间隔时间
ifconfig - 显示/配置网络接口(需安装net-tools)
yum install -y net-tools # 安装ifconfig
ifconfig # 显示所有网络接口
ifconfig eth0 # 显示指定接口信息
ifconfig eth0 up # 启用接口
ifconfig eth0 down # 禁用接口
ip - 现代网络配置工具
ip addr show # 显示IP地址信息
ip link show # 显示网络接口信息
ip route show # 显示路由表
ip addr add 192.168.1.100/24 dev eth0 # 添加IP地址
netstat - 显示网络连接信息
yum install -y net-tools # 安装netstat
netstat -tuln # 显示监听端口
netstat -an # 显示所有连接
netstat -rn # 显示路由表
netstat -i # 显示网络接口统计
ss - 现代网络连接查看工具
ss -tuln # 显示监听端口
ss -an # 显示所有连接
ss -s # 显示统计信息
ss -p # 显示进程信息
wget - 下载文件
wget http://example.com/file.zip # 下载文件
wget -c http://example.com/file.zip # 断点续传
wget -O newname.zip http://example.com/file.zip # 指定保存名称
wget -b http://example.com/file.zip # 后台下载
curl - 网络数据传输工具
curl http://example.com # 获取网页内容
curl -O http://example.com/file.zip # 下载文件
curl -I http://example.com # 只显示响应头
curl -u user:pass http://example.com # 带认证访问
ssh - 远程登录
ssh user@192.168.1.100 # 远程登录
ssh -p 2222 user@host # 指定端口登录
ssh -i key.pem user@host # 使用密钥登录
scp - 安全复制文件
scp file.txt user@host:/path/ # 上传文件
scp user@host:/path/file.txt ./ # 下载文件
scp -r dir/ user@host:/path/ # 递归复制目录
scp -P 2222 file.txt user@host:/path/ # 指定端口
- | -rw-r--r-- file.txt | ||
d | drwxr-xr-x directory/ | ||
l | lrwxrwxrwx link -> target | ||
c | crw--w---- /dev/tty0 | ||
b | brw-rw---- /dev/sda | ||
p | prw------- mypipe | ||
s | srwxrwxrwx socket |
rwx | |||
rw- | |||
r-x | |||
r-- | |||
-wx | |||
-w- | |||
--x | |||
--- |
%Y | ||
%y | ||
%m | ||
%d | ||
%H | ||
%I | ||
%M | ||
%S | ||
%s | ||
%A | ||
%a | ||
%B | ||
%b | ||
%p | ||
%Z |
cat /etc/redhat-release
rpm -qa | grep mysql
rpm -qa | grep mariadb
rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64
mkdir -p /opt/software
cd /opt/software
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar
tar -xvf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar
解压后包含以下RPM包:
rpm -ivh mysql-community-common-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.28-1.el7.x86_64.rpm
如果遇到依赖问题,使用yum安装:
yum install -y libaio
yum install -y net-tools
systemctl start mysqld
systemctl enable mysqld
systemctl status mysqld
MySQL 5.7安装后会生成临时密码:
grep 'temporary password' /var/log/mysqld.log
输出示例:
2024-01-01T00:00:00.000000Z 1 [Note] A temporary password is generated for root@localhost: Abcdefg1!
mysql -u root -p
ALTERUSER'root'@'localhost'IDENTIFIEDBY'NewPass123!';
exit;
mysql -u root -p
GRANTALLPRIVILEGESON *.* TO'root'@'%'IDENTIFIEDBY'NewPass123!'WITHGRANTOPTION;
FLUSHPRIVILEGES;
vi /etc/my.cnf
在[mysqld]部分添加:
bind-address = 0.0.0.0
systemctl restart mysqld
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload
CREATEDATABASE bigdata CHARACTERSET utf8mb4 COLLATE utf8mb4_general_ci;
SHOWDATABASES;
DROPDATABASE bigdata;
USE bigdata;
CREATETABLEusers (
idINT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOTNULL,
email VARCHAR(100) UNIQUE,
created_at TIMESTAMPDEFAULTCURRENT_TIMESTAMP
);
DESCRIBEusers;
SHOWTABLES;
DROPTABLEusers;
INSERTINTOusers (username, email) VALUES ('admin', 'admin@example.com');
SELECT * FROMusers;
SELECT username, email FROMusersWHEREid = 1;
UPDATEusersSET email = 'newemail@example.com'WHERE username = 'admin';
DELETEFROMusersWHEREid = 1;
CREATEUSER'bigdata'@'%'IDENTIFIEDBY'Bigdata123!';
GRANTALLPRIVILEGESON bigdata.* TO'bigdata'@'%';
FLUSHPRIVILEGES;
SHOWGRANTSFOR'bigdata'@'%';
REVOKEALLPRIVILEGESON bigdata.* FROM'bigdata'@'%';
DROPUSER'bigdata'@'%';
mysqldump -u root -p bigdata > bigdata_backup.sql
mysql -u root -p bigdata < bigdata_backup.sql
mysqldump -u root -p --all-databases > all_databases_backup.sql
vi /etc/my.cnf
[mysqld]
# 基本设置
basedir=/usr/local/mysql
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# 字符集设置
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
# 连接设置
max_connections=200
max_connect_errors=1000
wait_timeout=600
interactive_timeout=600
# 内存设置
key_buffer_size=256M
max_allowed_packet=64M
table_open_cache=256
sort_buffer_size=1M
read_buffer_size=1M
read_rnd_buffer_size=4M
myisam_sort_buffer_size=64M
# InnoDB设置
innodb_buffer_pool_size=1G
innodb_log_file_size=256M
innodb_log_buffer_size=8M
innodb_flush_log_at_trx_commit=1
innodb_lock_wait_timeout=50
# 日志设置
log_error=/var/log/mysqld.log
slow_query_log=1
slow_query_log_file=/var/log/mysql-slow.log
long_query_time=2
systemctl restart mysqld
mysql -V
SELECT table_schema AS'Database',
ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS'Size (MB)'
FROM information_schema.tables
GROUPBY table_schema;
SHOWPROCESSLIST;
SHOWSTATUSLIKE'Threads%';
SHOWTABLESTATUSFROM bigdata;
OPTIMIZETABLEusers;
REPAIRTABLEusers;
DELETEFROM mysql.user WHEREUser='';
FLUSHPRIVILEGES;
DELETEFROM mysql.user WHEREUser='root'AND Host NOTIN ('localhost', '127.0.0.1', '::1');
FLUSHPRIVILEGES;
DROPDATABASEIFEXISTStest;
DELETEFROM mysql.db WHERE Db='test'OR Db='test\\_%';
FLUSHPRIVILEGES;
ALTERUSER'bigdata'@'%'PASSWORDEXPIREINTERVAL90DAY;
ALTERUSER'bigdata'@'%'
WITH MAX_QUERIES_PER_HOUR 1000
MAX_UPDATES_PER_HOUR 100
MAX_CONNECTIONS_PER_HOUR 10;
Tab | |
Ctrl+C | |
Ctrl+D | |
Ctrl+Z | |
Ctrl+L | |
Ctrl+A | |
Ctrl+E | |
Ctrl+U | |
Ctrl+K | |
Ctrl+R | |
↑/↓ |
> | ls > file.txt | |
>> | echo "test" >> file.txt | |
< | wc < file.txt | |
; | cd /home; ls -l | |
&& | mkdir test && cd test | |
cd test || mkdir test | ||
& | python script.py & | |
$ | echo $HOME | |
* | ls *.txt | |
? | ls file?.txt | |
~ | cd ~ | |
. | ./script.sh | |
.. | cd .. |
e进入编辑模式rd.breakCtrl+X启动mount -o remount,rw /sysroot
chroot /sysroot
passwd root
exit
reboot
df -h
du -sh /*
find /var/log -type f -name "*.log" -exec truncate -s 0 {} \;
yum clean all
find / -type f -size +100M -exec ls -lh {} \;
ip addr show
ping 8.8.8.8
systemctl restart network
cat /etc/resolv.conf
systemctl status firewalld
firewall-cmd --list-all
ps -ef | grep 进程名
kill PID
kill -9 PID
pkill -f 进程名
ls -l 文件名
chmod 755 文件名
chown 用户:组 文件名
chmod -R 755 目录名
恭喜您完成了Linux入门到实战课程的学习! 🎉
通过本课程的学习,您已经掌握了Linux操作系统的核心技能,包括:
这些技能将为您后续的大数据学习和工作奠定坚实的基础。继续加油!💪