基础命令
命令语法 :
命令(空格) [选项](空格)[参数]
- {必选项} [可选项]
命令的分类 :
-
内部命令 :linux内核自带命令,执行效率高
-
外部命令 :需要安装才能使用,系统默认安装了很多外部命令
-
区分命令类型 : type 命令
- type 是 shell内嵌 = 内部命令
- clear 是 /usr/bin/clear = 外部命令
-
命令存放
-
echo $PATH
- usr/loacl/sbin : sbin 为特权命令,只有管理员才能用
- usr/loacl/bin : bin 为普通命令任何人都可以用
-
-
常用命令
- Tab : 补全命令
- Ctrl + C : 结束任务
- Ctrl + L :清屏
- Ctrl + insert : 复制
-
常用命令
- ls : 查看文件内容 [ -a -l -d ]
- pwd : 显示当前目录
- cd : 切换文件目录
- touch : 打开创建文件、没有则创建
- -a 只修改文件的access时间。(访问时间)
- -c 或 --no-create 不创建不存在的文件
- -d 使用指定的日期时间,而非现在的时间
- -m 指修改Modify 时间,而不修改 access 访问时间
- -r file 使用指定的file文件时间戳更新文件的时间戳
- -t 将时间修改为参数指定的日期。
- mkdir [选项] 目录 : 创建文件夹
- rm : 删除指定文件夹
- -i 删除前逐一询问确认
- -f 强制删除
- -r 将目录及一下之档案亦逐一删除
- clear : 清屏 (ctrl + l)
- hostname : 显示主机名
- reboot / shutdown - r / init6 : 重启命令
- logout :注销命令
- halt / shutdown -h / init 0 : 关机命令
- uname : 显示当前操作系统和机器的信息
- uname -a : 显示完整信息
-
其他命令
-
mv : 移动文件、重命名
- -b : 若需覆盖文件,则覆盖前先行备份
- -i : 若指定目录已有同名文件,则先询问是否覆盖旧文件
- -f : 若文件存在,则直接覆盖
- -u :若目标文件存在,且 source比较新,才会更新(update)
-
cat :查看文件内容
-b : 列出行号
-E : 将结尾断行行字节 $ 显示出来
-n : 列出行号
-
more / less :查看文件
-
head : 查看文件内容 (正向)
-
tail [option] [file]: 查看文件内容(反向)
-n : 制定行数
-f : 追踪文档,时时更新
-
cp [options] 源文件或目录 目标目录 : 复制文件或目录
vim 文件编辑
- 命令模式 :
- 插入模式 :aio
- 末行模式 : 冒号
- 替换模式 : R
- 位置命令
- 光标移动到本行开头 : home
- 光标移动到本行末尾 : end
- 光标移动到尾部 : G
- 光标移动到开头 :gg
- 光标移动一个单词 : w
- 上翻页 : pgUp
- 下翻页 :pgDn
- 保存命令
- 保存退出 :wq
- 存盘 zz 保存退出
- 退出命令
- :q 退出(不保存退出、没有编辑的情况下可用)
- :q! 强制退出不保存(修改后,放弃修改退出)
- :w 保存,不退出
- :wq 保存退出
- 黏贴复制 :
- 复制一行 yy
- 复制 n 行 nyy
- 黏贴 p [P前贴在前面,p黏贴在后面]
- 删除
- 删除字符 x [向后删除] X[向前删除]
- 删除一行 : dd [删除 n行 ndd ]
- 删除一个单词 : dw
- 内容替换
- :s /old/new [替换所在行的第一个old内容]
- :%s/old/new/ [替换全文的old,默认每行只替换第一个]
- :%s/old/new/g [替换全文]
- 替换模式
- 命令行按 R 建进入替换模式 [替换对应的字符串,类似 编辑模式操作]
- 内容插入行号
- set nu : 插入行号
- set nonu : 取消行号
- 命令撤销
- 撤销操作 u 向上一步,重复上一次操作
- 查找文件内的某以内容
- 斜杠 / 查找的内容 [查找 string define / string define ]
- 有特殊字符需要转义 : / \ /bin\ / bash
- 命令模式 :
-
-
组合命令
- > : 重定向输出
- >> : 追加输出方式进行重定向输出
- | :管道符号,两个命令用 and方式连接
- && : 逻辑控制符,前面的执行成功,后面再执行
- history : 操作历史记录
-
打包、解包命令
-
tar 打包 :tar -vcf 打包名.tar 被打包的文件A 被打包的文件B 被打包的文件C
c = create : 生成档案文件、创建打包文件
v = verbosely : 报告进度
f = file : 指定档案文件名称,f 后面一定是 .tar文件,必须放在左后
-
tar 解包 :tar -xvf 打包名.tar -C 解包路径位置
x : 解包
C :更改解压目录,目录必须存在
-
-
解压、压缩
- tar -zcvf 打包压缩文件名.tar.gz 被压缩的文件/目录
- tar -jxvf 打包文件.tar.bz2 -C 目录路径
日期命令
-
常用命令
-
date : 显示当前时间
date (功能描述:显示当前时间)
date +%Y (功能描述:显示当前年年份)
date +%m (功能描述:显示当前月份)
date +%d (功能描述:显示当前是哪一天)
date +%Y%m%d … (功能描述:显示当前年年月日各种格式 )
date “+%Y-%m-%d %H:%M:%S” 或者单引号也可以 (功能描述:显示时间格式)
-
设置系统时间 : date -s 字符串时间
-
日历查看 : cal
cal -3 :查看3个月的日历
-
文件搜索命令
-
find : 查找文件 find path 【options】
find / -atime -2 # 查找在系统中最后48小时访问的文件 (Access Time,文件读取访问时间)
find / -empty # 查找在系统中为空的文件或者文件夹
find / -group susan # 查找在系统中属于group为susan的文件
find / -mtime -1 #查找在系统中最后24小时里修改过的文件 (modify time)
find / -user susan #查找在系统中属于susan这个用户的文件
find / -size +10000c #查找出大于10000000字节的文件(c:字节,w:双字,k:KB,M:MB,G:GB)
find / -size -1000k #查找出小于1000KB的文件
find ./ | grep Spring 筛选
-
locate : 模糊查找
- 等同于 find -name
- 直接搜索索引数据库(var/lib/mlocate/locatedb)此库包含所有本地文件的信息,每天索引一次
-
grep 过滤查找、grep 【options】 PATTERN 范围(文件夹或文件)
-c:只输出匹配行的计数
-i:不区分大小写
-n:显示匹配行及行号
-w : 显示整个单词
-r : 递归查询(对文件夹中全部文件进行检索)
-v : 反取
-l : 只给出匹配的文件名
-L : 列出不匹配的文件名
-o : 只列出匹配的内容
-E : 支持扩展的正则表达式
-q : 在标准输出中不输出任何内容,及静默模式
-
文件内容排序
- sort 文件名
- -n (name) : 按数字排序 sort -n [文件名]
- -r :反序排序 sort -n -r [文件名]
- -o [文件名]:结果输出到文件 sort -n -o [文件名]
- -t “排序分隔符”:分隔符 sort -n -t : -k3 /etc/
- -k : 关键字(按照指定列来排序)
- sort 文件名
-
数据去重
- sort char | uniq -i -c
-
文件颜色含义
-
绿色文件 :可执行文件,可执行程序
-
红色文件 :压缩文件或者包文件
-
d / 蓝色文件 :目录
-
白色文件 :一般性文件、如文本文件、配置文件、源码文件等、
-
浅蓝色文件 :链接文件、主要式是使用ln 命令建立的文件
-
| / 红色闪烁 :表示链接的文件有问题
-
b / 黄色 :表示设备
-
灰色 :表示其他文件
目录结构
- /boot : 系统启动相关文件 ,如内核
- /dev : 设备文件
- /etc : 配置文件
- /home : 普通用户家目录,每一个用户的家目录通常默认为 /home/username
- /root : 管理员家目录
- /lib : 库文件
静态库 : .a
动态库 :.dll, .so /lib/modules :内核模块文件 - /media : 挂载点目录,额外的临时文件系统
- /mnt : 挂载点目录,额外的临时文件系统
- /opt : 可选目录,第三方程序的安装目录
- /sys : 伪文件系统,跟硬件设备先关的属性映射文件
- /tmp : 临时文件 /var/tmp
- /var : 可变化的文件(日志存放)
- /sbin : 管理可执行文件
- /bin : 可执行文件,用户命令
- /usr : shared, read-only 全局的只读文件,存放库文件,文档,用户数据等
- /proc : 内存系统文件
- /run : 系统运行时文件,不能随意删除,但是重启的时候应该抛弃,下次系统运行时重新生成
用户及组管理
linux用户在操作系统中可以进行日常管理和维护,涉及的相关配置文件如下:
/etc/passwd:保存用户信息
/etc/shadow:保存用户密码(以加密形式保存)
/etc/group:保存组信息
/etc/login.defs:用户属性,密码过期时间,密码最大长度等限制
/etc/default/useradd:显示或更改默认的useradd配置文件
-
用户划分
- 管理员 : root
- 系统用户 : UID小于1000,系统服务管理用户,一般不允许登录系统
- 普通用户 : UID大于999 ,权限较小,可以登录,只能使用bin目录下命令
-
添加用户 : useradd 用户名 (功能描述:添加新用户)
-
设置用户密码 :passwd 用户名 (功能描述:设置用户密码)
- -l 锁定
- -u 解锁
- -d 删除
- -S 对密码状态输出一个简述
- –stdin 作为标准输入
-
判断用户是否存在 :id 用户名
-
切换用户 :su 用户名称 (功能描述:切换用户,只能获得用户的执行行权限,不能获得环境变量)
-
删除用户 :userdel 用户名 (功能描述:删除用户但保存用户主目录)
- -r 删除用户关联文件
- -rf 强制删除用户关联文件
- userdel -r 用户名 (功能描述:用户和用户主目录,都删除)
-
修改用户信息 : usermod [选项] 用户名
-
更改用户密码过期信息 : chage [选项] 用户名
- -m 密码可更改的最小天数。零代表任何时候都可以更改密码
- -M 密码保持有效的最大天数
- -W 用户密码到期前,提前收到警告信息的天数
- -E 账号到期的日期,过了这天,账号将不可用
- -d 上一次更改的日期
- -l 停滞时期。如果一个密码已过期这些天,那么此账号将不可用
- -l 列出当前的设置,有非特权用户来确定他们的密码或账号任何时过期
-
用户密码
- /etc/passwd : 密码文件
- [用户名] :[密码]:[uid] : [GID] : [身份描述] :[主目录] :[登录shell]
- /etc/shadow :影子文件
- 用户名 :这是用户登录系统是使用的用户名,它在系统中是唯一的
- 口令 : 此字段存放加密的口令
- 最后一次修改的时间 :标识从某一时期起到用户最后一次修改口令的天数
- 最小时间间隔 : 两次修改口令之间的最小天数
- 最大时间间隔 : 口令保持有效的最多天数,即多少天后必须修改口令
- 警告时间 :从系统开始警告到口令正式失效的天数
- 不活动时间 : 口令过期多少天后,该账号被禁用
- 失效时间 : 指示口令失效的聚堆天数
- 标识 : 未使用
- /etc/passwd : 密码文件
-
查看登陆用户信息
whoami (功能描述:显示自身用户名称)
who am i (功能描述:显示登录用户的用户名)
who (功能描述:看当前有哪些用户登录到了了本台机器器上)
-
sudo 命令、允许临时管理员权限
-
查看创建用户、cat /etc/passwd
-
groups : 列出当前用户的所有分组
adm 分组用于系统监控,比如/var/log中的部分日志就是 adm 分组
sudo 分组用户可以通过 sudo 指令提升权限
-
新建组 : groupadd 组名
-
删除组 : groupdel 组名
-
修改组 :groupmod -n 新组名 老组名
-
查看全部组 :cat /etc/group
-
修改用户组 :usermod -g 用户组 用户名
文件权限
- 修改文件权限 : chmod 【权限数】 【文件名】
- 改变文件拥有者 :chown 【用户名】 【文件名】
- 改变所属组 :chgrp 最终用户组 (功能描述:改变文件或者目录的所属组)
系统管理及线程管理
-
磁盘管理
- df - h :disk free 显示磁盘剩余空间
- du -h【目录名称】 :disk usage 显示目录下的目录大小
-
进程管理
-
进程查看 :ps -aux (查看系统全部进程)
-
PID : 进程号
-
%CPU:该进程占用CPU资源的百分比,占用越高,进程越耗费资源
-
%MEM:该进程占用物理理内存的百分比,占用越高,进程越耗费资源
-
VSZ:该进程占用虚拟内存的大小,单位KB
-
RSS:该进程占用实际物理理内存的大小,单位KB
-
STAT:进程状态
R (TASK_RUNNING),可执行状态
S (TASK_INTERRUPTIBLE),可中断的睡眠状态
D (TASK_UNINTERRUPTIBLE),不可中断的睡眠状态
T (TASK_STOPPED or TASK_TRACED),暂停状态或跟踪状态
Z (TASK_DEAD - EXIT_ZOMBIE),退出状态,进程成为僵尸进程
-
START:该进程的启动时间
-
TIME:该进程占用CPU的运算时间,注意不是系统时间
-
COMMAND:产生此进程的命令名
-
-
-
健康状态
-
Htop / top -d 【秒数】 :指定top命令每隔几秒更新。默认3秒
-
Htop / top -i : 使 top 不显示任何闲置或者僵死进程
-
Htop / top -p : 通过指定监控进程ID来仅仅监控某个进程的状态
-
状态含义
PID : 进程ID
PPID : 父进程ID
RUSER : 真实用户名
UID : 进程所有者用户ID
USER : 进程所有者用户名
GROUP : 进程所有者组名
TTY : 启动进程的终端名。不是从终端启动的进程则显示为
PR : 优先级
NI : nice值。负值表示高优先级,正值表示低优先级
P : 最后使用CPU,仅在多CPU环境下有意义
%CPU : 上次更新到现在的CPU时间占用百分比
TIME : 进程使用CPU时间总计,单位秒
TIME+ : 进程使用CPU时间总计,单位 1/100秒
%MEM : 进程使用的物理内存百分比
VIRT : 进程使用虚拟内存总量. 单位kb VIRT = SWAP + RES
SWAP : 进程使用的虚拟内存中,被换出的大小,单位 KB
RES : 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
CODE : 可执行代码占用的物理内存大小,单位kb
DATA : 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
SHR : 共享内存大小,单位 kb
nFLT : 页面错误次数
nDRT : 最后一次写入到现在,被修改过的页面数
S : 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
COMMAND : 命令名/命令行
FLags : 任务标志
-
-
杀死线程
- kill -9 pid进程号
网络信息
-
netstat
用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况
-
netstat 命令
- netstat - a : (all) 显示所有连接和监听端口
- netstat - e : 显示以太网统计信息。它列出的项目包括传送的数据报的总字节数、错误数、删除数、数据报的数量和广播的数量
- netstat - n : 以数字形式显示地址和端口号
- netstat -o : 显示与每个连接相关的所属进程 ID
- netstat -p proto 显示 proto 指定的协议的连接;proto 可以是下列协议之一: TCP 、UDP 、TCPv6 或 UDPv6
- netstat -t tcp 查看TCP连接
- netstat -anp 查看这个系统目前网络状况
[root@cmspmysql3 ~]# netstat -antp |grep 3306
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1635/haproxy
tcp 0 0 10.224.16.18:3306 192.168.104.91:35468 TIME_WAIT -
tcp 0 0 10.224.16.18:3306 192.168.104.96:43870 FIN_WAIT2 1663/haproxy
tcp 0 0 10.224.16.94:21456 10.168.119.80:3306 ESTABLISHED 1667/haproxy
tcp 0 0 10.224.16.94:21554 10.168.119.80:3306 TIME_WAIT
tcp 0 0 10.224.16.94:7478 10.168.119.80:3306 ESTABLISHED 1672/haproxy
# 本地地址 10.224.18:3306 / 10.224.18.94:3306
# 对端连接地址 :192.168.104.91:35468 / 192.168.104.96:43870 / 10.168.119.80:3306
- 输出结果说明
- Active Internet connections : 有源的TCP连接
- Recv-Q : 接收队列(一般均为0,否则标识堆积)
- Send- Q : 发送队列(一般均为0,否则标识堆积)
- Active Unix domain Sockets : 有源Unix域套接字
- Proto : 显示连接使用协议
- RefCnt :表示连接到本套接口上的进程号
- Types : 显示套接口的类型
- State :显示套接口当前的状态
- Path : 表示连接到套接口的其他进程使用的路径名
-
其他网络命令
- 本地网络命令
- ifconfig : 查看本机网卡信息(网络接口信息)
- ip add :查看网卡信息
- 网络测试
- ping 测试网络延迟
- telnet 查看服务是否通
- host DNS地址查询
- dig DNS查询
- curl : 请求网页
- 本地网络命令
-
查看网络IP
- windows : ipconfig
- linux : ifconfig
- macos : ifconfig
远程指令
- ssh远程登录 ssh user@ip
- scp 拷贝一个文件到远程
软件安装
- rpm -q 【软件名】 :查询
- rpm -a : (all)列出全部
- rpm -i : (info) 详细信息
- rpm -l : (list) 显示全部文件
- rpm -f : (file) 显示文件对应的rpm包
- rpm - e 【软件名】 :卸载rpm软件包
- rpm -e --nodeps 【软件名】: 卸载前 跳过 依赖检查
- rpm -ivh 【包的全路径】 :软件安装到指定路径
进程与线程
-
进程与线程的区别 : 进程分配CPU、内存、硬盘, 线程只分配CPU
-
进程管理命令
- 启动 : systemctl start nginx
- 停止: systemctl stop nginx
- 重启: systemctl restart nginx
- 重载: systemctl reload nginx
- 状态 : systemctl status nginx
- 开机自启 : systemctl enable nginx
- 开机禁止: systemctl disable nginx
-
进程表记录
-
描述信息 : 进程在内存中存放位置 、 PID 、当前状态、 内存分配多大、属于哪个用户
-
资源信息 :进程拥有资源、比如进程和虚拟机内存如何映射,拥有那些文件、使用那些I/O设备
-
内存分布 :约定操作系统如何使用内存
- 栈(向下增长)
- 空闲区
- 堆(向下增长)
- 数据段(全局变量、常量)
- 正文段 :程序指令
-
指令 tasklist / TList
TASKLIST [/S system [/U username [/P [password]]]] [/M [module] | /SVC | /V] [/FI filter] [/FO format] [/NH] #参数列表: /S system 指定连接到的远程系统。 /U [domain\]user 指定应该在哪个用户上下文执行这个命令。 /P [password] 为提供的用户上下文指定密码。如果省略,则提示输入。 /M [module] 列出当前使用所给 exe/dll 名称的所有任务,如果没有指定模块名称,显示所有加载的模块。 /SVC 显示每个进程中主持的服务。 /V 显示详述任务信息。 /FI filter 显示一系列符合筛选器指定的标准的任务。 /FO format 指定输出格式,有效值: "TABLE"、"LIST"、"CSV"。 /NH 指定列标题不应该在输出中显示,只对 "TABLE" 和 "CSV" 格式有效。
-
-
线程记录表
- 线程也需要 ID, 可以叫作 ThreadID
- 记录自己的执行状态(阻塞、运行、就绪)、优先级、程序计数器以及所有寄存器的值等等
-
进程通信
- 管道
- 本地内存共享
- 本地消息队列
- Kafka
- RabbitMQ
- ActiveMQ
- RocketMQ
- 远程调用(RPC) - 基于HTTP协议
-
服务器性能
- 计算密集型 :大量的计算
- I/O密集型 : 频繁的文件操作(写日志、读写数据库等)
- I/O密集型 : 频繁的文件操作(写日志、读写数据库等)
- 交换(Swap)技术:允许一部分进程使用内存,不使用内存的进程数据先保存在磁盘上
- GC 内存回收
- 职责 :
1、操作系统进行交互、负责申请内存
2、应用会向GC申请内存
3、承担垃圾回收能力、标记不用的对象并回收
4、针对应用特性进行动态的优化
- 职责 :
Nginx管理
-
安装启动(yum)
- 检查是否安装 : rpm -qa | grep nginx
- 卸载已经安装 :yum -y remove nginx
-
安装依赖
- 安装nginx依赖 :yum -y install zlib zlib-devel pcre pcre-devel
- 安装nginx :yum -y install nginx
-
启动程序
- 检查语法错误 :nginx -t
- 服务启动 :systemctl start nginx
- 启动验证 :systemctl status nginx
-
文件结构
- conf目录 :配置文件
- html目录 :提供web服务的根目录
- logs目录 : nginx日志存储目录
- modules目录 :存放一些模块用到的库
- sbin目录 :存放 nginx二进制文件、使用的命令
-
安装方式说明
- 编译安装
- 启动命令 :/nginx安装路径/sbin/nginx
- 配置文件目录 :/nginx安装路径/conf/
- 默认的”server块” : 直接配置到了nginx.conf文件中
- yum源安装
- 启动命令 :启动的二进制文件已经被拷贝到 /usr/sbin 目录下,命令已经添加到环境变量中
- 配置文件位置 :/etc/nginx/
- 默认的”server块”会配置在”/etc/nginx/conf.d/default.conf”文件,主配置文件中会含有 include /etc/nginx/conf.d/*.conf;
- 编译安装
-
常用命令
- Nginx : 不加选项,启动nginx服务
- Nginx -h 或–?选项 : 查看nginx命令帮助
- Nginx -v选项 :查看nginx版本信息
- Nginx -V选项 :查看nginx编译信息
- Nginx -c选项 :启动nginx时指定主配置文件
- Nginx -t 或 -T选项 :测试nginx.conf文件是否存在语法错误
- Nginx -s选项:向正在运行的nginx主进程发送信号,信号的可用值有stop, quit, reopen, reload
- ./nginx -s stop 停止
- ./nginx -s quit 安全退出
- ./nginx -s reload 重新加载配置文件
- ps aux | grep nginx 查询nginx进程
-
配置管理
-
配置文件路径
- 主配置文件 :/nginx/nginx.conf
- 引入 :conf.d文件(同级别)
- 引入 :default.d 文件(同级别)
- 默认主配置文件 :/nginx/nginx.conf.default
- 网页根目录 : /html
- 主配置文件 :/nginx/nginx.conf
-
配置说明
-
公共配置
user nginx; #网站运行的用户 worker_processes auto; #设置的进程数 error_log /var/log/nginx/error.log; #错误日志 pid /run/nginx.pid; #进程的id
-
引入配置
include /usr/share/nginx/modules/*.conf
-
event : 高效模块
work_connections 1024 # 一个进程可支持1024个链接
-
HTTP配置
server_tokens off # 隐藏外部服务器信息 sendfile on : 开启缓冲 access_log /var/log/nginx/access.log main # 访问日志 include /etc/nginx/conf.d/*.conf; # 相同端口,不同IP,载入不同域名的对应的服务分发
- Server服务
- 监控端口、服务名、跟目录
- 监听端口 listen 80 default_server;
监听端口 listen [::]:80 default_server;
监听域名 server_name www.linux.con;
网站根目录 root /usr/share/nginx/html;
- 监听端口 listen 80 default_server;
- 引入配置文件 : include /etc/nginx/default.d/*.conf
- 访问路径匹配 :location hello/{返回内容}
- 监控端口、服务名、跟目录
- Server服务
-
TLS(SSL)配置
-
-
文本处理工具
1. grep工具
grep是行过滤工具;用于根据关键字进行过滤
# 语法
# grep [选项] '关键字' 文件名
grep --color=auto 'root' passwd
# 别名设置(临时性)
alias grep='grep --color=auto'
# 别名设置配置文件
vim /etc/bashrc
# 文件最后添加即可
alias grep='grep --color=auto'
# 刷新
source /etc/bashrc
# gre -n 添加行号
grep -n 'root' passwd
# grep -ni 添加行号,忽略大小写
grep -ni 'root' passwd
# 过滤出以root开头的行
grep -ni '^root' passwd
# 过滤以root结尾的行
grep -ni 'root$' passwd
# 过滤不包含的行(取反)
grep -ni -v '^root' passwd
grep -nB 3 '^ftp' passwd
# 多个筛选条件
[root@cmspnginx1 log]# ll | egrep '20180101|20190101'
-rw------- 1 root root 4014 Oct 20 2017 yum.log-20180101
-rw------- 1 root root 1027 Dec 21 2018 yum.log-20190101
# 打开压缩版本 多个文件,按照两个条件进行筛选
[root@cmspnginx1 log]# zcat tmpro_443_error.log-202208*gz tmpro_443_error.log-202208*gz |grep ' uestionnaireServiceInlet' | grep -E '15873623|234355|3453478'
常用选项 :OPTIONS :
# -i : 不区分大小写
# -v : 查找不包含所指定的内容的行,反向选择
# -w : 按单词搜索
# -o :打印匹配关键字
# -c : 统计匹配到的次数
# -n : 显示行号
# -r : 逐层遍历目录查找
# -A :显示匹配行及后面多少行
# -B : 显示匹配行前后多少行
# -C : 显示匹配行前后多少行
# -l : 只列出匹配的文件名
# -L :列出不匹配的文件名
# -e :使用正则表达式表示
# -E :使用扩展正则匹配
# ^key : 以关键字开头
# key$ : 以关键字结尾
# ^$ :匹配空行
# --color=autp : 可以将关键字部分自动加上颜色
2. cut工具
语法 : cut 选项 文件名
# 列处理工具
# -c : 以字符串为单位进行分割,截取
# -d :自定义分隔符,默认为制表符 \t
# -f : 与-d 一起使用,指定截取哪个区域
举例说明
# 按照分隔符进行截取,指定需要的列
cut -d ':' -f1 passwd
cut -d: -f1 passwd
cut -d: -f1,7 passed
# 截取 1-5 个字符
cut -c1-5 passwd
# 10- 全部截取
cut -c10- passwd
3. sort 工具
将文件的每一行作为一个单位,从首字符向后,依次按照ASCII值进行比较,最后将他们按照升序输出
-u : 去除重复值
-r : 降序排列,默认为升序
-o : 将排序结果输出到文件中,类似重定向符号 >
-n : 以数字排序,默认是按字符排序
-t : 分隔符
-k : 第 N 列
-b : 忽略前导空行
-R :随机排序,每次运行的结果均不同
cut -d -f
# 冒号分割的第三列用数字进行排序
sort -n -t: -k3 1.txt
sort -nr -t: -k3 1.txt
sort -nr -t: -k3 1.txt -o > 2.txt
4. uniq工具
去除连续重复的数据
常与sort搭配使用
-i : 忽略大小写
-c :统计重复的次数
-d :只显示重复行
sort char | uniq -i -c
5. tee工具
从标准输入读取并写入到标准输出的文件,即双向覆盖重定向(屏幕输出 | 文本输入)
echo hello world | tee 11.txt
# 追加
echo hello world | tee -a 11.txt
6. diff工具
比较两个文件的不同
语法 :
diff [选项] 文件1 文件2
-b : 不检查空格
-B : 不检查空白行
-i : 不检查大小写
-w :忽略所有空格
-c :上下文格式显示
-u :合并格式显示
--normal :正常格式显示(默认)
7. paste工具
用于合并文件行
-d : 自定义间隔符,默认是tab
-s :串行处理,非并行 [第一行是第一个文件、第二行是第二个文件]
paste [file1] [file2]
[root@linux124 test]# cat 11.txt
hello world
hello world
[root@linux124 test]# cat hello.txt
name=hello
mask=nihao
[root@linux124 test]# paste 11.txt hello.txt
hello world name=hello
hello world mask=nihao
8. tr 工具
搜索替换 :用于字符转换,替换和删除,主要用于删除文件中控制字符或进行字符转化
command | tr 'string1' 'string2'
# -d 删除字符串1中所有输入字符
# -s 删除所有重复初夏字符串序列,只保留第一个,集将重复出现的字符串压缩成一个字符串
tr 'string1' 'string2' < filename
# a-z 替换A-Z
tr 'a-z' 'A-Z' < 1.txt
[root@linux124 test]# cat hello.txt
name=hello
mask=nihao
[root@linux124 test]# tr 'a-z' 'A-Z' < hello.txt
NAME=HELLO
MASK=NIHAO
[root@linux124 test]# cat hello.txt
name=hello
mask=nihao
[root@linux124 test]# tr 'a-z' 'A-Z' < hello.txt > 22.txt
bash快捷键
常用通配符
* : 匹配0或多个任意字符
? : 匹配任意单个字符
[list] : 匹配 [list] 中任意单个字符,或者是一组单个字符
[!list] : 匹配除 [list] 中任意单个字符
[root@linux121 ~]# ls file[123].jpg
{string1,string2,....} 匹配string,string2或更多字符串
[root@linux121 ~]# ls file{1,2.3,11,13}.jpg
bash中的引号
- 双引号 " " :会把引号的内容当做一个 整体 ,允许通过 $ 符号引用其他变量值
- 单引号 ’ ‘:会把引号的内容当成整体来看待,禁止引用其他变量值,shell中特殊符号都被视为普通字符
- 反撇号 ``: 反撇号与 $() 一样,引用或括号中的命令会优先执行,如果存在嵌套,反撇号不能用
[root@linux121 ~]# date +%F
2022-08-04
[root@linux121 ~]# echo $(date +%F)
2022-08-04
[root@linux121 ~]# echo "$(date +%F)"
2022-08-04
[root@linux121 ~]# echo '$(date +%F)'
$(date +%F)
shell部分
文件处理三剑客 : grep 、sed、awk 工具使用
变量定义
[root@linux124 ~]# A=123456
[root@linux124 ~]# echo $A
123456
[root@linux124 ~]# echo ${A}
123456
# {} 形式可切片,直接复制情况不能
[root@linux124 ~]# echo ${A:3:3}
456
交互式定义变量
让用户自己给变量赋值
语法 : read [选项] 变量名
选项 | 释义 | 备注 |
---|---|---|
-p | 定义提示 用户的信息 | |
-n | 定义字符数(限制变量值的长度) | |
-s | 不显示(不显示用户输入的内容) | |
-t | 定义超时间,默认单位为秒(限制用户输入变量值的超时时间) |
[root@linux124 ~]# read name
nihao
[root@linux124 ~]# echo $name
nihao
# 用法1 :
[root@linux124 ~]# read -p '请输入你的名字 : ' name
‘请输入你的名字 : ’ jackcat h
[root@linux124 ~]# echo $name
jack
[root@linux124 ~]# read -s -p ‘请输入你的名字 : ’ name
请输入你的名字 :
[root@linux124 ~]# echo $name
nihao
# 用法2 : 变量来自文件
[root@linux124 ~]# read -p ‘请输入你的名字’ name mask < 1.txt
[root@linux124 ~]# echo $name
nihao
[root@linux124 ~]# echo $mask
定义变量类型(declare)
语法 : declare 选项 变量名=变量值
选项 | 释义 | 举例 |
---|---|---|
-i | 将变量看成整数 | declare -i A=123 |
-r | 定义只读变量 | declare -r B=hello |
-a | 定义普通数组;查看普通数组 | |
-A | 定义关联数组,查看关联数组 | |
-x | 将变量通过环境导出 | declare -x AAA=123456 等于 export AAA=123456 |
变量的分类
- 本地变量 :当前用户自定义的变量,当前进程中有效
- 环境变量 :当前进程有效,并且能够被子进程调用
- env :查看当前用户的 环境变量
- set : 查询当前用户的所有环境变量(临时变量与环境变量)
- export :变量名=变量值 或者 变量名=变量值;export 变量名
- 全局变量 :所有用户和程序都可以调用,且继承,新建用户默认能够调用
- ¥¥系统变量 :shell本身已经固定好了它的名字和作用
内置变量 | 释义 |
---|---|
$? | 验证上一条命名是否成功,如果是0,则成功,其他则有问题 |
$0 | 当前执行的程序或脚本的名称 |
$# | 脚本后接的参数的个数 |
$* | 脚本后所有参数,参数当做一个整体输出,每一个变量参数之间以空格隔开 |
$@ | 脚本后面的所有参数,参数是独立的,也是全部输出 |
$1-$9 | 脚本后面的位置参数,$1表示第一个位置 参数,以此类推 |
10 − {10}- 10−{n} | 扩展位置参数,第10个位置变量必须大于{}大括号起来{2位数字一行括起来} |
$! | 后台运行的 最后一个 进程号(当前终端) |
!$ | 调用最后一条命令历史中的参数 |
$$ | 当前进程的进程号 |
echo $(( 1 + 1))
echo $[10-5]
echo $[85*74]
expr 1 + 1
expr 10 - 5
expr 10 \* 5 = 50
条件判断语句
- 格式1 : test 条件表达式
- 格式2 :[ 条件表达式 ]
- 格式3 :[[ 条件表达式 ]] 支持正则
判断文件类型
- -e : 判断文件是否存在
- -f : 判断文件是否存在并是一个普通文件
- -d :判断文件是否存在且是一个文件夹
- -L :判断文件是否存在并且是衣蛾 软连接文件
- -b :判断文件是否存在,并且是一个快设备文件
- -S : 判断文件是否存在,并且是一个套接字文件
- -C : 判断文件是否存在,并且是一个字符设备文件
- -p : 判断文件是否存在,并且是一个 命名管道文件
- -s : 判断文件是否存在,并且是一个非空文件(有内容)
# 格式1
test -e ./test1
# 格式2
[ -d ./dir1 ]; echo $?
# 格式3
[[ -d ./dir1 ]]; echo $?
判断文件权限
- -r : 当前用户对其是否可读
- -w : 当前用户对其是否可写
- -x : 当前用户是否可执行
- -u :是否有suid,高级权限冒险位
- -g :是否sgid,高级权限强制位
- -k :是否有t 位,高级权限粘滞位
流程控制语句
# 形式1
if [ condition ] ; then
command
command
fi
# 形式2
if test 条件 ; then
command
command
fi
# 形式3
if [[ 条件 ]] ; then
command
command
fi
# 形式4
if [ condition ] ; then
command
else
command
fi
[条件] && command1 || command2
# 用户自己输入字符串,如果用户输入hello,则打印world,否则打印请输入 hello
#!/bin/env bash
read -p '请输入一个字符串:' str
if ["$str" = 'hello']; then
echo 'world'
else
echo '请输入hello'
fi
read -p '请输入一个字符串:' str
if [ $1 = hello ]; then
echo 'world'
else
echo '请输入hello'
fi
案例
需求 : 判断当前主机是否和远程主机是否ping通
#!/bin/env bash
# 判断当前主机是否和远程主机是否ping通
read -p '请输入你要ping的主机IP:' ip
ping -c3 $ip &>/dev/null
if [$? -eq 0]; then
echo "当前主机和远程主机 $ip 是通的"
else
echo "当前主机和远程主机 $ip 不同的"
fi
案例
判断进程是否存在
#!/bin/env bash
# 判断线程是否存在
ps -ef | grep httpd | grep -v 'grep' &>/dev/null
if [$? -eq 0]; then
echo "线程存在"
else
echo "线程不存在"
fi
#!/bin/env bash
pgrep httpd 'grep' &>/dev/null
if [$? -eq 0]; then
echo "线程存在"
else
echo "线程不存在"
fi
pgrep httpd &>/dev/null
test $? -eq && echo "当前http进程存在" || echo "当前进程不存在"
# pgrep 命令 : 以名称为依据,从运行进程队列中查找进程,并显示查找到的进程id
选项
-o :仅显示查找到的最小(起始)进程号
-n :仅显示查找到的最大(结束)进程号
-l :显示进程名称
-P : 指定父进程号,
-g :指定进程组
-t :指定开启进程的终端
-u :指定进程的有效用户ID
案例
判断服务是否正常
1、判断进程是否存在,用 /etc/init.d/http status判断状态等方法
2、最好的方式是直接去访问一下,通过访问成功或者失败的返回值判断
wget http://www.itheima.com
curl http://www.itheima.com
elinks -dump http://www.itheima.com
#!/bin/env bash
web_server = www.itcase.cn
wget -P /Shell/ $web_server &>/dev/null
[ $? -eq 0 ] && echo "当前服务ok" && rm -f /shell/index.* || echo "当前网站不ok"
案例
判断用户是否存在
输入一个用户,用脚本判断该用户是否存在
#!/bin/env bash
# for ip in 'cat ip.txt'
read -p '请输入你的用户名:' user_name
id $user_name &>/dev/null
if [ $? -eq 0 ]
then
echo "该用户存在"
else
echo "用户不存在"
fi
for循环
# 方式1
for variable in {list}
do
command
command
for variable in a b c
do
command
command
done
# 方式2,后面直接自己添加参加,每个参数执行一次
for variable
do
command
command
done
# 方式3
for ((expr1;expr2;expr3))
do
command
command
done
# expr1 : 定义变量的初始值
# expr2 :决定是否进行循环的条件
# expr3 :决定训话变量如何改变,决定循环什么时候退出
for (( i=1;i<=5;i++ ))
do
echo $i
done
案例
计算 1-100 基数和
# 1. 定义一个变量来保存奇数的和 sum=0
# 2. 找出 1- 100 的奇数,保存到另一个变量中,i = 遍历出来的奇数
# 3. 从 1-200 中找出奇数后,在相加,然后将和赋值给变量,循环变量 FOR
# 4. 遍历完毕,sum 的值打印出来
#!/bin/env bash
# for ip in 'cat ip.txt'
sum=0
for i in {1..100..2}
do
let sum = $sum + $i
done
echo "1-100的奇数和为 :$sum"
案例
质数(素数):筛选质数
#!/bin/env bash
# for ip in 'cat ip.txt'
read -p "请输入一个正整数 :" number
[ $number -eq 1 ] && echo "$number不是质数" && exit
[ $number -eq 1 ] && echo "$number是质数" && exit
for i in `seq 2 $[$number-1]`
do
[ $[$number%$i] - eq 0 ] && echo "$number 不是质数" && exit}
done
echo "$number 是质数" && exit
案例
批量添加5个新用户,以 u1 到 u5 命名,并统一加一个新组,组名以 class,统一改密码为 123
#!/bin/env bash
# 判断 class 组是否存在
grep -w ^class /etc/group &>/dev/null
test $? -ne 0 && groupadd class
# for ip in 'cat ip.txt'
# 循环创建用户
for (( i=1;i<=5;i++ ))
do
useradd -G class u$i
echo 123|passwd --studin u$i
done
# 批量用x新建用户 stu1 - stu5,要求这几个用户的家目录都在/rhome
#!/bin/env bash
# 判断 /rhome 是否存在
[ -f /rhome ] && mv /rhome /rhome.bak
# 文件不在,目录不在,进行创建
test ! -f /rhome -a ! -d /rhome && mkdir /rhome
# [ -f /rhome ] && mv /rhome /rhome.bak || [ ! -d /rhome ] && mkdir /rhome
# for ip in 'cat ip.txt'
# 循环创建用户
for (( i=1;i<=5;i++ ))
do
useradd -d /rhome/stu$i stu$i
echo 123|passwd --studin u$i
done
局域网内检查主机网络通信
把能ping同的IP 和不能ping通的IP分类,并保存到 两个文本文件中
#!/bin/env bash
# 定义变量
ip=10.1.1
# 循环去 ping主机的ip
# for ip in 'cat ip.txt'
for ((i=1;i<=10,i++))
do
ping -c1 $ip.$i &>/dev/null
if [ $? -eq 0 ];then
echo "$ip.$i is ok" >> /tmp/ip_up.txt
else
echo "$ip.$i is down" >> /tmp/ip_down.txt
fi
done
# [ $? -eq 0 ] && echo "$ip.$i is ok" >> /tmp/ip_up.txt || echo "$ip.$i is down" >> /tmp/ip_down.txt
shell脚本并发
并发执行
{程序}& 表示程序放在后台进行执行,如果需要等待执行完毕在进行下面的内容,需要家wait
#!/bin/env bash
# 定义变量
# for ip in 'cat ip.txt'
ip=10.1.1
# 循环去 ping主机的ip
for ((i=1;i<=10,i++))
do
{
ping -c1 $ip.$i &>/dev/null
if [ $? -eq 0 ];then
echo "$ip.$i is ok" >> /tmp/ip_up.txt
else
echo "$ip.$i is down" >> /tmp/ip_down.txt
fi
}&
done
wait
echo "ip is ok..."
# [ $? -eq 0 ] && echo "$ip.$i is ok" >> /tmp/ip_up.txt || echo "$ip.$i is down" >> /tmp/ip_down.txt
while循环语句
while 表达式
do
command
done
while [ 1 -eq 1 ] 或者 (( 1 > 2 ))
do
command
done
#!/bin/env bash
sum=0
for (( i=0;i<=50;i+=2))
do
let sum=$sum+$i (let sum=sum+i)
done
echo "1-50的偶数和为 :$sum"报警,
#!/bin/env bash
sum=0
i=2
while [ $i -le 50 ]
do
let sum=sum+i
let i+=2
done
echo "1-50的偶数和为 :$sum"
脚本同步系统时间
30秒同步一次系统时间,时间同步服务器10.1.1.1
如果同步失败,则进行邮件同步,每次失败都进行报警
同步成功,也进行邮件通知,但成功100次通知一次
#!/bin/env bash
NTP_SERVER = 10.1.1.1
count = 0
while true
do
ntpdate $NTP_SERVER &>/dev/null
if [ $? -ne 0 ];then
echo "system date failed " | mail -s "check system data" root@loaclhost
else
let count++
if [$count -eq 100 ];then
echo "system date success " | mail -s "check system data" root@loaclhost
&& count = 0
fi
fi
sleep 30
done
echo "1-50的偶数和为 :$sum"
sed 文件编辑器
- sed 将每一行存放在缓存区,对这个副本进行编辑,不会修改源文件
- 分为命令行模式、和脚本模式
sed [options] ‘处理动作’ 文件名
选项 | 说明 | 备注 |
---|---|---|
-e | 进行多项(多次)编辑 | |
-n | 取消默认输出 | 不自动打印模式空间 |
-r | 使用扩展正则表达式 | |
-i | 原地编辑(修改源文件) | |
-f | 指定sed脚本的文件名 |
动作 | 说明 | 备注 |
---|---|---|
‘p’ | 打印 | |
‘i’ | 在指定行之前插入内容 | 类似vim里的大写 O |
‘a’ | 在执行行之后插入内容 | 类似vim里的小写 o |
‘c’ | 替换指定行所有内容 | |
‘d’ | 删除指定行 |
对文件进行增删改查
# sed 选项 '定位+命令' 需要处理的文件
[root@linux124 ~]# sed '' a.txt # 不做处理
[root@linux124 ~]# sed -n 'p' a.txt 打印每一行,并取消默认输出
[root@linux124 ~]# sed -n '1p' a.txt 打印第 1 行
[root@linux124 ~]# sed -n '2p' a.txt 打印第 2 行
[root@linux124 ~]# sed -n '1,,5p' a.txt 打印第 1-5 行
[root@linux124 ~]# sed -n '$p' a.txt 打印最后 1 行
[root@linux124 ~]# sed -n '2ihello world ' a.txt # 第二行插入
[root@linux124 ~]# sed -n 'ihello world ' a.txt # 每一行插入
[root@linux124 ~]# sed -n '3ihello\world ' a.txt # 插入 2 行
[root@linux124 ~]# sed -n 'a9999 ' a.txt # 每一行后插入 9999
[root@linux124 ~]# sed -n '2,3a9999 ' a.txt # 第二行和第三行插入 9999
[root@linux124 ~]# sed -n '$chello world ' a.txt # 最后一行替换为 hello world
[root@linux124 ~]# sed -n '/^adm/citcast ' a.txt # 修改 以adm开头的行
[root@linux124 ~]# sed -n '1,5chello world ' a.txt # 将1-5行压缩为内容
[root@linux124 ~]# sed '4d' a.txt # 删除第四行内容
[root@linux124 ~]# sed '1,4d ' a.txt # 删除 1-4行的内容
[root@linux124 ~]# sed ' d ' a.txt # 都删除
[root@linux124 ~]# sed -n '/[0-9]/d ' a.txt # 删除包含数字的
对文件进行搜索替换操作
语法 : sed 选项 ‘s/搜索的内容/替换的内容/动作’ 需要处理的文件
s 表示 search搜索;斜杠 / 表示分隔符,可以自己定义;动作一般是 打印 p 和全局 替换 g
[root@linux124 ~]# sed -n 's/root/ROOT/p' 1.txt # 搜索小写 root, 替换为ROOT, 打印
[root@linux124 ~]# sed -n 's/root/ROOT/gp' 1.txt # 搜索小写 root, 替换为ROOT, 全局整行替换
[root@linux124 ~]# sed -n 's/^#//gp' 1.txt # 以 # 号开头 ,替换为空,全局替换
[root@linux124 ~]# sed -n 's@/sbin/nologin@itcast@gp' 1.txt # 将 sbin/nologin 替换成 itcast
[root@linux124 ~]# sed -n 's@/\/sbin\/nologin/itcast/gp' 1.txt #
[root@linux124 ~]# sed -n '10s#/sbin\/nologin#itcast#p' a.txt # 第十行 将 sbin/nologin 替换成 itcast
[root@linux124 ~]# sed -n 's@/sbin/nologin@itcastma@p' 1.txt #
[root@linux124 ~]# sed -n '1,5s/^/#/gp' 1.txt # 1-5行 行首加 #
命令 | 解释 | 备注 |
---|---|---|
r | 从另外文件中读取内容 | |
w | 内容另存为 | |
& | 保存查找串以便在替换串中引用 | 和\ ( \ )相同 |
= | 打印行号 | |
! | 对所选行以外的所有行应用命令,放到行数之后 | |
q | 退出 |
awk 用法
文本处理工具,对列进行处理。
awk 自带一些变量,可以在书写脚本时调用
基本用法 : awk [option] 代码块 文件名
常用参数
选项 | 含义 | 使用演示 |
---|---|---|
-F | 指定文件分隔符 | awk -F “\n” |
-f | 使用文件中的内容作为命令的输入 | awk -f script.txt |
-v | 给变量赋值,支持多个 v 赋值 | awk -v Num=num−vNum1=num1 |
# awktest.txt 文件以逗号为分隔符,打印第二行,第一列
awk -F "," NR==2'{print $1}' awktest.txt
# awktest.txt 文件以逗号为分隔符,打印第 10 行 各列
awk -F "," NR==10'{print "这是第"NR"行","第1列是:"$1,"第2列是:"$2}' awktest.txt
awk的内置变量
变量名称 | 说明 | 使用示例 | 示例说明 |
---|---|---|---|
$number | 记录被分割后的第number列的字段,$表示整行文本。 | {print 1,3} | 打印第1列和第3列字段 |
FS | 字段分割符(可使用FlieSplit记忆) | BEGIN{FS=“\n”} | 使用换行分割文本 |
NF | 当前行中的字段数量 | {print “当前行共有"NF"列”} | 打印当前行的列数 |
NR | 当前的行号(NnumberRow,从1开始) | NR%2{print “这是偶数行”} | 判断是否是偶数行 |
RS | 表示记录分隔符,多行文本的情况下,RS字符将文本分割成几个大块(RowSplit) | BEGIN{ FS=“\N” RS=" " } | 对一个使用空行分割多个行的文本,RS表示的字符将文本分成多个段落,FS表示的字符将这些段落中的行分割成多个列。 |
OFS | 表示输出字段之间分隔符,将输出的多个字段使用OFS拼接,缺省为" "。(OutFileSpilt) | BEGIN{OFS=“;”} {print “字段1”,“字段2”,“字段3”} | 输出的字段1、字段2、字段3变成"字段1;字段2;字段3" |
ORS | 表示输出行之间记录分隔符,在两个单独行插入定义的字符串,缺省为"\n" | BEGIN{ ORS=“\n\n” } | 输出的文本行之间有两个空行 |
awk 脚本
#awk的脚本文件
#开始部分,一般用于脚本执行前的初始化,比如设置每一列的标题、设置分割符等等。
BEGIN{
FS=","
print "第一列","第二列"
}
#这里是主要执行的代码块
{print "这是第"NR"行"}
NR%2 {print NR,"这是偶数行"}
#END代码块。
END{
print "总计共有"NR"行"
print "脚本执行结束"
}
# 执行指令
awk -f awkScript.txt awktest.txt
正则表达式
字符 | 描述 |
---|---|
. | 可代替除一行之外的任何单个字符 |
* | 可代替零个或多个在它前面出现的字符 |
[chars] | 可代替chars中的任何一个字符,chars是一串字符序列。你可以用-符号来定义一个字符范围。如果^是chars中的第一个字符,那么将匹配没有在chars中指定的字符 |
^ | 匹配一行的开头 |
$ | 匹配一行的结尾 |
\ | 把\后面的字符照常输出,通常用来转义(不使用特殊含义)一个元字符 |
!~ | 匹配到的内容取反,表示不匹配 |
awk -F "," '{if($0 ~ "2020/07/01"){print $0}else{print "none"}}' awktest.txt