Linux 基础-中篇:正则、Shell Scripts和进程管理

Linux 基础-中篇

中篇:
五、正则表达式与文件格式化处理
六、Shell Scripts
七、 邮件、日期和任务排程
八、进程管理与 SELinux

五、正则表达式与文件格式化处理

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

基础正则表达式:

正则中特殊符号 代表意义
[:print:] 代表任何可以被打印出来的字符
[:graph:] 除了空格符(空格键和Tab键)外的其他所有按键
[:alnum:] 代表英文大小写字符及数字,亦即 0-9,A-Z,a-z
[:xdigit:] 代表 16 进位的数字类型,包括 0-9,A-F,a-f
[:alpha:] 代表任何英文大小写字符,亦即 A-Z,a-z
[:lower:] 代表小写字符,亦即 a-z
[:upper:] 代表大写字符,亦即 A-Z
[:digit:] 代表数字,亦即 0-9
[:cntrl:] 代表键盘上面的控制按键,亦即包括 CR,LF,Tab,Del…等等
[:punct:] 代表标点符号
[:space:] 代表任何会产生空白的字符,包括空格键,Tab,CR 等等
[:blank:] 代表空格键与 TAB 按键两者

语法:

  • [ ]:匹配多个字符中的任意一个
  • ^:匹配行首,在 [] 中表示取反
  • $:匹配行尾
  • .:代表一定有一个任意字符
  • *:代表重复前一个字符0到无穷多次
  • \:转义字符
  • {n}:匹配前一个字符确定的 n 次
  • {n,}:至少匹配前一个字符 n 次
  • {n,m}:至少匹配前一个字符 n 次且最多匹配 m 次

扩展正则表达式

  • +:匹配前面的子表达式一次或多次
  • ?:匹配前面的子表达式零次或一次
  • |:用或(or)的方式找出整个字符串
  • ():标记一个子表达式的开始和结束位置

Linux文本处理三剑客

grep [-option] pattern [filename]	# 过滤
	-c	仅列出文件中包含模式的行数。
	-i	忽略模式中的字母大小写。
	-l	列出带有匹配行的文件名。
	-n	在每一行的最前面列出行号。
	-v	列出没有匹配模式的行。
sed [-option] [command] [filename]	# 采用流编辑模式,根据脚本命令来处理文本文件中的数据,每次仅读取一行内容
	-e 该选项会将其后跟的脚本命令添加到已有的命令中。
	-f 该选项后接脚本文件
	-n	该选项会屏蔽启动输出
	-i	此选项会直接修改源文件
# sed 命令:[n1,[n2]]function
# function:
#	a 新增,后接字符串,在当前行的下一行新增一行
#	c 取代,后接字符串,取代n1,n2之间的行
#	d 删除
#	i 插入,后接字符串,在当前行的上一行新增一行
#	p 打印
#	s 取代,格式为:s/pattern/replacement/flags
awk '条件类型1{动作1}...' [filename]	# 逐行处理文本,并将一行分成数个“字段”处理
# 在 awk 的括号内,每一行的字段都有变量名称,那就是$1,$2...$0 代表一行的全部变量
# awk 内建变量:
#	NF 每一行的字段总数
#	NR 目前 awk 所在的行数
#	FS 目前的分隔字符,默认是空格符
# awk 关键字
#	BEGIN 读取数据前执行的命令
#	END   读完数据后执行的命令

六、Shell Scripts

bash shell 的优点:

  • 命令编修能力:history。上下键翻看输入过的命令
  • 命令与文件补全功能:tab建
  • 设置命令别名:alias
  • 工作控制、前景背景控制
  • 程序化脚本
  • 通配符

变量设定规则:

  • 双引号中的特殊字符可以保持原有特性,单引号中则是纯文本;
  • 可以使用 \ 转义;
  • 在一串指令中,可以使用反单引号 `` 或 $() 执行其他指令
  • 可以使用 export 将变量变成环境变量
  • 可以使用 unset 取消变量

${变量+特殊字符+关键字}:编辑变量内容

  • #:从前删除匹配的最短的那一个
  • ##:从前删除匹配的最长的那一个
  • %:从后删除匹配的最短的那一个
  • %%:从后删除匹配的最长的那一个
  • /旧字符/新字符:替换第一个匹配的字符
  • //旧字符/新字符:替换全部匹配的字符

脚本的执行方式:

  • 直接执行:sh 或 ./ 的方式,程序在子程序的 bash 内执行。
  • source 脚本:在父程序中执行。
test 测试指令
# 文件类型的判断
	-e 判断文件是否存在
	-f 判断文件是否为普通文件
	-d 判断文件是否为目录
# 文件权限测试
	-r 侦测该文件是否存在且具有 可读 权限
	-w 侦测该文件是否存在且具有 可写 权限
	-x 侦测该文件是否存在且具有 可执行 权限
# 两个文件的比较,如:test file1 -nt file2
	-nt (newer than)判断file1是否比file2新
	-ot (older than)判断file1是否比file2旧
	-ef 判断file1与file2是否为同一文件
# 两个整数之间的判定,如:test n1 -eq n2
	-eq 两数值相等(equal)
	-ne 两数值不相等(not equal)
	-gt n1 大于 n2(greater than)
	-lt n1 小于 n2(less than)
	-ge n1 大于等于 n2
	-le n1 小于等于 n2
# 判定字符串的数据
	test -z string 字符串为空,则为true
	test -n string 字符串为空,则为false,-n可省略
	test str1=str2 两字符串相等,则为true
	test str1!=str2 两字符串相等,则为false
# 多重条件判定
	-a 相当于and
	-o 相当于or
	! 反相状态

还可以利用中括号进行数据的判断,和 test 的用法相似需要注意:

  • 在中括号内的每个组件都需要空格键分隔;
  • 在中括号内的变数,最后都以双引号括起来;
  • 在中括号内的常数,最后都以单或双引号括起来。

shift:使脚本的参数变量号码偏移,后面可接数字。

条件判断语句:

if [ 条件判断式一 ]; then
	条件判断式一成立时,执行的指令
elif [ 条件判断式二 ]; then
	条件判断式二成立时,执行的指令
else
	条件判断式一与二都不成立时,执行的指令
fi
case $var in 
  "匹配字符串1")
	程序段
	;;
  "匹配字符串2")
	程序段
	;;
  "匹配字符串3")
	程序段
	;;
esac

脚本内部的函数功能:

# 函数内部的参数为 $1,$2...
function fname() {
	程序段
}

循环结构

# 当 condition 成立时,执行 program,直至 condition不再成立
while [ condition ]
do
	program
done
# 当条件成立时,停止循环
until [ condition ]
do
	program
done
# 循环时,$var 的内容变换为对应的 con
for var in con1 con2 con3 ...
do
	program
done
for ((初始值; 限制值; 执行步阶))
do
	程序段
done

shell script 的追踪与 debug

sh [-nvx] script.sh

  • -n:不执行,仅查询语法问题;
  • -v:在执行脚本前,先将脚本的内容输出到屏幕上;
  • -x:将使用到的脚本内容显示到屏幕上。

七、邮件、日期和任务排程

收发邮件

mail 命令是 Linux 终端发送邮件用的最多的命令。mailxmail 命令的更新版本。

mail [-s 主题] 目标	# 给目标发送邮件
	-a file 添加附件
mail [-u user]	# 查看邮件

时间与日期

date 命令可以用来显示或设定系统的日期与时间。在显示方面,使用者可以设定欲显示的格式,格式设定为一个加号后接数个标记,其中可用的标记列表如下:

date '+标记'	# 根据标记指定的格式输出时间
#时间# %n 换行;%t TAB键;%% 输出%
	# %H 小时(00..23)
	# %M 分钟
	# %s 从1970年1月1日00:00:00UTC到目前为止的秒数
	# %S 秒
#日期# %T 时间,同 %H:%M:%S
	# %a 星期名(Sun..Sat);%A 星期名,全拼
	# %w 一周中的第几天(0..6)
	# %b 月份名(Jan..Dec);%B 月份名,全拼
	# %y 年份最后两位;%Y 完整年份
	# %m 月份数
	# %d 当月的日数
	# %D 日期,同 %m/%d/%y
	# %j 一年中的第几天,三位数
	# %U 一年中的第几周,以周日为始
	# %W 一年中的第几周,以周一为始

任务排程

两种任务排程的方式:

  • 突发性的,只做一次:使用 at 指令,需要开启 atd 服务;
  • 例行性的,每隔一定周期就做一次:使用 crontab 指令,需要开启 crond 服务。

Linux 系统上常见的例行性任务有:

  • 进行日志文件的轮替(log rotate);
  • 日志分析 logwatch 的任务;
  • 建立 locate 的数据库;
  • man page 查询数据库的建立;
  • rpm 软件日志文件的建立;
  • 移除暂存文件。
# 可以创建 /etc/at.allow 或 /etc/at.deny 限制at指令的使用
# 可以创建 /etc/cron.allow 或 /etc/cron.deny 限制crontab指令的使用
at [-mldv] TIME	# 添加一个一次性任务
	# -m 邮件通知使用者工作完成
	# at -l 相当于atq,列出该用户所有的at排程
	# at -d 相当于 atrm,取消一个在at排程中的任务
	# at -c 后接工作号码查看工作内容
batch	# 当 CPU 负载低于 0.8 时执行任务
crontab -e	# 编辑 crontab 的工作内容
	# -u username 仅 root,编辑其他用户的任务排程
	# -l 查看 crontab 的工作任务
	# -r 清空 crontab 的工作内容
	# 编辑格式:分  时  日  月  周  指令
	# 特殊字符:
		# * 代表任何时刻
		# , 代表分隔时段
		# - 代表一段时间范围
		# /n 代表每隔n单位间隔进行一次
anacron	# 检查周期性的任务

系统任务的排程在 /etc/crontab,一般服务在 /etc/cron.d/ 目录中,或者将指令放到或链接到 /etc/cron.hourly/ 等目录中,就不需要手动指定时间了。

crond 无法执行过期的任务,但是

  1. 它会根据 /etc/cron.d/0hourly 的设定,主动去 /etc/cron.hourly/ 目录下,执行该目录下的所有执行文件;
  2. 因为 /etc/cron.hourly/0anacron 这个脚本的缘故,主动的每小时执行 anacron,并呼叫 /etc/anacrontab 的配置文件;
  3. 根据 /etc/anacrotab 的设定,依据每天、每周、每月去分析 /etc/cron.daily/,/etc/cron.weekly/,/etc/cron.monthly/ 内的执行文件,以进行周期需要执行的指令。

八、进程管理与 SELinux

在 Linux 中,触发任何一个事件时,系统都会将他定义成为一个程序,并且给予这个程序一个 ID ,称为 PID,同时依据触发这个程序的用户与相关属性关系,给予这个 PID 一组有效的权限设定。

有一些进程在启动后会不断的运作,我们将这些常驻在内存的进程成为:服务(daemon)。

bash 的 job control

bash 的 job control 的使用限制:

  • 这些工作所触发的进程必须来自你 shell 的子进程;
  • 前景:你可以控制与下达指令的环境(foreground);
  • 背景:可以自行运作的工作,无法使用 Ctrl+c 终止它,可使用 bg/fg 呼叫该工作;
  • 背景中执行的进程不能等待 terminal/shell 的输入。

可以在指令最后直接加 & 符,让程序在背景中运行,也可以使用快捷键 Ctrl+z 将正在运行的进程放到背景中暂停。

jobs [-lrs]	# 显示当前的背景工作状态。
	# + 代表最近被放到背景的工作号码
	# - 代表最近最后第二个被放到背景的工作号码
fg [%jobnumber|-]	# 将背景工作拿到前景处理。
	# 默认取出 + 工作
bg [%jobnumber|-]	# 让工作在背景下运行
kill [-s signal] [%jobN] [PID]	# 结束一个进程
	# -l --list 列出能够使用的 signal
	# -1 重新读取一次参数的配置文件
	# -2 代表与键盘输入 Ctrl+c 同样的动作
	# -9 立刻强制删除一个工作
	# -15 以正常的进程方式终止一项工作
killall [-iIe] [cmd name]	# 根据指令名称给与讯号
	# -i 交互式;-I 忽略大小写;-e 严格匹配
nohup cmd [ARG]...	# 让执行的指令不被中断
	# nohup 不支持内部指令

进程管理

进程的状态有(STAT,S):

R:当前进程正在运行中或在运行队列中等待
S:该程序目前正在睡眠状态,但可以被唤醒
D:不可中断,不可被唤醒的睡眠状态,通常是在等待 I/O 的情况。
T:停止状态,后台暂停或进程处于除错状态
Z:僵尸状态,进程已经终止但无法被移除至内存外
s:当前进程有多个子进程
l:当前进程可能会开启多个子进程,多线程
+:表示这个进程在后台运行
<:表示当前进程优先级高
N:表示当前进程优先级低
L:被锁入内存

进程的优先级越高,其PRI(Priority)值越低。这个 PRI 值由核心动态调整,用户可以通过 NI(Nice) 值调整进程的优先级,相关性为 新PRI = 旧PRI + nice。调整 NI 时要留意:

  • nice 值的可调整范围为 -20 ~ 19;
  • 一般用户只能调整自己进程的 nice 值,且范围为 0 ~ 19
  • 一般用户只能将 nice 值调高。
ps aux	# 查看所有进程信息
	# -A 显示所有的进程,同 -e
	# a 不与 terminal 有关的所有进程
	# u 有效使用者相关的进程
	# x 通常与 a 一起使用,显示较完整信息
	# -l 较详细地显示进程信息
	# j 工作格式
	# -f 做一个更完整的输出
top [-p PID]	# 持续侦测进程运作状态
	# -d 后面接更新的秒数,默认5秒
	# -b 以批次的方式执行 top
	# -n 与 -b 搭配,意思是需要进行几次 top 的输出
	# top 内部命令
		# ? 帮助
		# P 以CPU的使用率排序显示
		# M 以Memory的使用率排序显示
		# N 以PID排序显示
		# T 由该进程使用的CPU时间累积TIME+排序
		# k 给与某个PID一个讯号signal
		# r 给与某个PID重新制定一个nice值
pstree [-AIUup]	# 列出目前系统上面所有的进程树的相关性

SELinux

SELinux 是 Security Enhanced Linux 的缩写,指的是安全强化的 Linux。SELinux 是整合到 Linux 内核的一个模块,它是在进行进程、文件等细部权限设定依据的一个核心模块。

一般的,依据进程拥有者与文件资源的 rwx 权限来决定一个进程有无存取某一个文件的能力,这种存取文件系统的方式称为自主式访问控制(Discretionary Access Control,DAC)。这种 DAC 的访问控制存在几个问题:(1)root 具有最高权限;(2)使用者可以取得进程来变更文件资源的访问权限。

SELinux 导入了委任式访问控制(Mandatory Access Control,MAC),它能够针对特定的程序与特定的文件资源来进行权限的管控。也就是说,SELinux 是透过 MAC 的方式来管控进程,它控制的主体是进程,而目标则是该进程能否读取的文件资源。

SELinux 工作流程:主体(进程)想要访问文件资源,SELinux 分析政策(Policy,默认是target)内的规则,通过后对比安全性上下文(security context),一致后允许访问,最后再看文件与自身权限。

SELinux 的三种模式:

  • enforcing:强制模式,代表 SELinux 正常工作;
  • permissive:宽容模式,代表 SElinux 运作,但是仅做记录,不会实际限制文件存取;
  • disable:关闭 SELinux。
getenforce	# 查看 SELinux 的模式
setenfore	# 临时修改 SELinux 的模式
	# /etc/selinux/config 永久修改
sestatus	# 查看 SELinux 的状态
getsebool [-a] [rule_name]	# 查看 SELinux 规则是否开启
seinfo [-Atrub]	# 查看 SELinux 的统计信息
sesearch [-A] [-s 主体类别] [-t 目标类别] [-b 布尔值]	# 查询规则的用处
	# -A 列出允许读取或放行的相关数据
setsebool [-P] [rule_name] [0|1]	# 设置 SELinux 规则的开启与关闭,-P 写入配置文件
chcon [-R] [-t type] [-u user] [-r role] file...
	# 修改文件的 SELinux type
	# -R 连同目录下的子目录一同修改
	# --reference=范例文件
restorecon [-Rv] file...	# 恢复为预设值
semanage	# 管理 SELinux 的默认选项

你可能感兴趣的:(Linux,linux,正则表达式,运维)