第一章 第一个Shell程序
以 #!解析器名称 开头,表示选择哪个解释器解释shell脚本
source命令
使用source执行shell脚本时,不会创建子进程,而在父进程中直接执行。
当需要在程序中修改当前shell本身的环境变量时,使用source命令
source命令也可用来读入包含函数的文件
使用方法:source fileName 或者 . fileName
export命令
export命令用于设置或显示环境变量
使用方法:export [-fnp] [变量名称]=[变量设置值]
-f 代表[变量名称]中为函数名称
-n 删除指定的变量。变量实际上并没有删除,只是不会输出到后续指令的执行环境中
-p 列出所有的shell赋予程序
env命令
env命令用于临时改变环境变量值
unset命令
从当前shell删除变量或函数
函数传递
$0 $1 $2 位置参数
$* 以一个单字符串显示所有向脚本传递的参数
$@ 所有向脚本传递的参数
$# 传入函数的参数个数
$$ 脚本运行的当前进程id号
$! 后台运行的最后一个进程id号
$? 显示最后命令的退出状态
$- 显示shell使用的当前选项
标准输入输出符号
0<:标准输入
1> 或者 >:重定向标准输出
2>:重定向标准错误
&>:标准输出和标准错误
获取命令执行返回值
命令
如:echo 123
$((数值计算)) 获取数值计算结果 如:$((100 - 2*100/400))
替换运算符
模式匹配运算符
shift命令可以截取参数列表最左端的一个参数
type命令判断被执行命令的来源(别名、关键字、函数、内置命令、外部命令)
test命令用于评估表达式,返回零(true)或者非零(false)
逻辑运算符
运算符号
= 等于 应用于:整型或字符串比较 如果在[] 中,只能是字符串
!= 不等于 应用于:整型或字符串比较 如果在[] 中,只能是字符串
< 小于 应用于:整型比较 在[] 中,不能使用 表示字符串
大于 应用于:整型比较 在[] 中,不能使用 表示字符串
-eq 等于 应用于:整型比较
-ne 不等于 应用于:整型比较
-lt 小于 应用于:整型比较
-gt 大于 应用于:整型比较
-le 小于或等于 应用于:整型比较
-ge 大于或等于 应用于:整型比较
-a 双方都成立(and) 逻辑表达式 –a 逻辑表达式
-o 单方成立(or) 逻辑表达式 –o 逻辑表达式
-z 空字符串
-n 非空字符串
执行反单引号(`)之间的命令,引用结果作为字符串
getopt命令用于分析命令标志和参数
元字符
^ 锁定行或字符串的开始
$ 锁定行或字符串的结尾
当^和$结合使用时,意味着模式必须匹配整个串
. 匹配除了换行符以外的任意字符
[...] 方括号表达式,匹配括号内任意一个字符;如果^符号位于方括号的开始,则不匹配方括号中的任意字符
转义字符,用于打开或关闭后续字符的特殊含义
x{m,n} 区间表达式,匹配x字符出现的次数区间
? 匹配前面正则表达式的零个或一个实例
POSIX字符集
[:alnum:] 数字字符
[:alpha:] 字母字符
[:blank:] 空格与制表符
[:cntrl:] 控制字符
[:digit:] 数字字符
[:graph:] 非空格
[:lower:] 小写字母
[:print:] 可显示的字符
[:punct:] 标点符号字符
[:space:] 空白(whitespace)字符
[:upper:] 大写字母
[:xdigit:] 十六进制数字
[. .] 排序符号,如[.]表示cn字符序列,而单独的c和n都不行
[= =] 等价字符集
后向引用:匹配之前正则表达式使用(和)括起来选定之后引用的模式,使用1~9来引用选定的模式
如:(go).*1 匹配一行中前后出现两个go
交替、分组
交替|:在不同序列之间用管道符号隔开
分组():让元字符修饰前置字符串
如:(man|woman)+ 匹配一个或多个man或者woman字符串
排序文本
sort命令用于排序文件,对已排序的文件进行合并,并检查文件以确定它们是否已排序
文本去重
uniq命令用于文本去重(在使用uniq命令前,先使用sort命令,使所有重复行相邻)
统计文本
wc命令用于统计文本行数、字数以及字符数
打印和格式化输出
pr命令用于将文本转换成适合打印的文件
fmt命令用于编排文本文件
fold命令限制文本宽度
提取文本开头和结尾
head命令提取文件开头
tail命令提取文件结尾
字段处理
cut命令用于从一个文本文件或者文本流中提取文本列
join命令用于根据指定栏位,找到两个文件中指定栏位内容相同的行,将它们合并,并根据要求的格式输出内容
文本替换
tr命令用于替换字符
Linux下的配置文件
/etc/group 用户组定义
/etc/passwd 用户信息定义
/etc/inittab init的配置文件,在Linux启动时扮演重要角色
/etc/shadow 用户密码的存放地址
/etc/crontab cron(定期执行命令的程序)的配置文件
/etc/fstab 文件系统信息
文件
ls命令用于列出文件
chown命令用于改变文件的所有者
chgrp命令用于改变文件的用户组
umask命令用于指定哪些权限在新文件的默认权限中被删除
chmod命令用于修改文件权限
touch命令更新文件的访问和修改时间
find命令用于寻找文件
xargs命令用于遍历处理文件
comm命令用于比较两个已排序文件之间的差异
diff命令用于比较两个文件之间的差异
文件系统
fdisk命令用于查看/修改系统的分区表
mkfs命令用于创建文件系统
mount命令用于加载文件系统到指定的加载点
umount命令用于卸载已经加载的文件系统
df命令用于显示当前挂载情况
工作地址范围
命令
[:特殊字符:]用于匹配特俗字符
awk代码结构
内建变量
FILENAME 当前输入文件的名称
FS 字段分隔符(支持正则表达式),默认为空格
OFS 输出字段分隔字符,默认为空格
ORS 输出记录分隔字符,默认为n
RS 输入记录分隔字符
NF 当前记录的字段数
NR 在工作中的记录数
FNR 当前输入文件的记录数
局部变量:列在函数参数列表中并且在字首前置一些额外的空白 如: add(x,y, sum) {}
字符串函数
sub(/reg/, newsubstr, str) 只替换第一个匹配字符串
gsub(/reg/, newsubstr, str) 将字符串str中所有符号/reg/正则的子串替换为字符串newsubstr
index(str, substr) 返回子串substr在串str中的索引
length(str) 返回字符串的长度
match(str, /reg/) 如果在串str中找到正则/reg/匹配的串,则返回出现的位置,未找到则返回0
split(str, array, sep) 使用分隔符sep把字符串分解成数组array
substr(str, position[, length]) 返回str中从position开始的length个字符
toupper(str) 对字符进行大小写转换
sprintf("format", expr) 对expr使用printf格式说明
进程管理命令
fork函数用于创建进程
ps命令用于查看系统正在运行的进程
top命令用于查看系统一段时间进程的动态信息
pstree命令用于打印进程树形结构
Ctrl+C快捷键用于中断前台进程
Ctrl+快捷键用于杀死前台进程
Ctrl+Z快捷键用于挂起前台进程
bg命令用于将挂起进程转换为后台进程
fg命令用于将后台进程转换为前台进程
jobs命令用于显示当前shell的进程状况
kill命令用于向指定进程发送信号
init命令用于进程初始化工具,可切换运行等级
init进程
调度系统任务
加载proc虚拟文件系统:mount -t proc proc /proc
安装openssh
替换阿里云的源
echo "/" > /etc/apk/repositories
echo "/" >> /etc/apk/repositories
同步时间
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
更新源、安装openssh 并修改配置文件、生成key、启动sshd服务
apk update && apk add --no-cache openssh-server tzdata && sed -i "s/#PermitRootLogin.*/PermitRootLogin yes/g" /etc/ssh/sshd_config && ssh-keygen -t rsa -P "" -f /etc/ssh/ssh_host_rsa_key && ssh-keygen -t ecdsa -P "" -f /etc/ssh/ssh_host_ecdsa_key && ssh-keygen -t ed25519 -P "" -f /etc/ssh/ssh_host_ed25519_key && /usr/sbin/sshd -D
使用SSH登录远程主机(要求远程主机正在运行sshd)
基于口令的登录方法
ssh -l 登录账号 远程主机
日志清理程序
把以下代码保存为log_clean.sh文件中即可使用
内含操作:备份重要的日志、限制日志目录大小、清理老旧日志
# maximum log size
alarmrate=500
# the max size file can reach
file_max_size=5
# this is the directory where fresh logs are originally written
working_dir=/mnt/soho_storage/log
# this is the frequency our program runs
SLEEPTIME=5# h.day and timestamp to log filename
filenameConvert()
{timestamp=$(date +%Y%m%d%H%M%S)timestamp=`echo $timestamp`RETVAL=$1.$timestamp
}# search dir to fetch the oldest log
searchdir()
{oldestlog=`ls -rt | head -n 1 | awk '{print $1}'`
}# this function clean old logs under working dir if it reaches it's size limitation
clear_old_log_under_working_dir()
{cd $working_dirwhile truedologsize=`du -ms $working_dir | awk '{print $1}'`if [ $logsize -gt $alarmrate ]thensearchdirrm -rf $oldestlogelsebreak;fidone
}# this is the main process of our log backup activity
backuplog_process()
{cd $log_ram_dirfor i in * dofile_size=`du -m $i | awk '{print $1}'`# need to backup log filecase $i in access.log | error.log | apcupsd.events | soho.log)if [ ! -d $working_dir ]thenmkdir -p $working_dirfiif [ file_size -gt file_max_size ]thenfilenameConvert $icp $log_ram_dir/$i $working_dir/$RETVALecho "" > $log_ram_dir/$iclear_old_log_under_working_dirfi;;*)if [ file_size -gt file_max_size ]thenecho "" > $log_ram_dir/$ifidone
}while true
dobackuplog_processsleep $SLEEPTIME
done
系统监控程序
把以下代码保存为system_monitor.sh文件中即可使用
内含操作:监控内存、硬盘、CPU、进程,形成状态报告
# maximum ratio of memory usage
mem_quota=80
# hard disk
hd_path=/dev/sda1
# maximum ratio of hard disk usage
hd_quota=80
# maximum ratio of cpu usage
cpu_quota=80
# time gap between two times fetching cpu status
time_gap=60
# generate report every 10 minutes
runtime_gap=60# fetch the ratio of memory usage
# @return 1: if larger than $mem_quota0: if less than $mem_quota
watch_memory()
{mem_total=`cat /proc/meminfo | grep MemTotal | awk '{print $2}'`mem_free=`cat /proc/meminfo | grep MemFree | awk '{print $2}'`mem_usage=$((100-mem_free*100/mem_total))if [ $mem_usage -gt $mem_quota ]thenmem_message="ALARM!! The memory usage is $mem_usage%!!"return 1elsereturn 0fi
}# fetch the top 10 most wasting memory process
proc_memory_top10()
{mem_busiest=`ps aux | sort -nk 4r | head -n 11`
}# fetch the ratio of hard disk usage
# @return 1: if larger than $hd_quota0: if less than $hd_quota
watch_hd()
{hd_usage=`df | grep $hd_path | awk '{print $5}' | sed 's/%//g'`if [ $hd_usage -gt $hd_quota ]thenhd_message="ALARM!! The hard disk usage is $hd_usage%!!"return 1elsereturn 0fi
}# fetch cpu status at a time point
# format used unused
get_cpu_info()
{cat /proc/stat | grep -i "^cpu[0-9]+" | awk '{used+=$2+$3+$4;unused+=$5+$6+$7+$8} END{print used,unused}'
}# fetch the ratio of cpu usage
# fetch cpu stat two times, with time gap, then calculate the average status
# @return 1: if larger than $cpu_quota0: if less than $cpu_quota
watch_cpu()
{time_point_1=`get_cpu_info`sleep $time_gaptime_point_2=`get_cpu_info`cpu_usage=`echo $time_point_1 $time_point_2 | awk '{used=$3-$1;total+=$3+$4-$2-$1}';print $used*100/total`if [ $cpu_usage -gt $cpu_quota ]thencpu_message="ALARM!! The cpu usage is over $cpu_usage%!!"return 1elsereturn 0fi
}# fetch the top 10 busiest processes
proc_cpu_top10()
{proc_busiest=`ps aux | sort -nk 3r | head -n 11`
}while true
do# report contentreport=""# memory monitorif [ `watch_memory` -eq 1 ]thenreport=$report'n'$mem_messageproc_memory_top10report=$report'n'$mem_busiestfi# hard disk monitorif [ `watch_hd` -eq 1 ]thenreport=$report'n'$hd_messagefi# cpu monitorif [ `watch_cpu` -eq 1 ]thenreport=$report'n'$cpu_messageproc_cpu_top10report=$report'n'$proc_busiestfi# feedback reportif [ -n $report ]then# fi# sleep timesleep $((runtime_gap-time_gap))
done
转载于:.html
本文发布于:2024-01-29 04:18:45,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170647313012645.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |