#! /bin/bash
N=20
while :;
do
load=`uptime |awk '{print $10}' |cut -d'.' -f 1`
if [ $load -gt $N ] ; then
uptime |awk '{print $1,$8,$9,$10,$11,$12}' >>/root/anaload/`date +%m%d`_anaload.txt
vmstat 1 600 >>/root/anaload/`date +%m%d`_anaload.txt
echo " " >>/root/anaload/`date +%m%d`_anaload.txt
fi
sleep 10
done
awk
(1).命令格式
有三种方式:
命令行方式:
awk [ -F 域分隔符 ] ‘commands’ input_file(s)
域分隔符不指定时缺省为空格,commands是awk命令语句。
awk脚本方式。
awk命令文本方式:
awk –f awk_script_file input_file(s)
(2).awk语句的构成
awk语句都由模式和动作组成。模式决定何时进行操作,动作是操作的具体内容。
模式可以是任何条件语句或复合语句或正则表达式。有两个特殊模式:BEGIN和END。BEGIN在任何文本浏览动作之前,END使用在完成文本浏览之后。
实际动作在{}中指定,简单如打印,复杂的如控制和循环等。
(3).域和记录
awk执行时,其浏览域用$1、$2、…、$n标识,多个域之间用逗号分隔,如$1,$3。
$0标识整个记录(整行)。
(4).awk中的正则表达式
除了基本的元字符外,awk中还可以使用如下两个字符:
+,匹配一个或多个字符;
?,匹配模式出现频率。
(5).awk条件操作符
操作符 描述 操作符 描述
< 小于 >= 大于等于
<= 小于等于 ~ 匹配正则表达式
== 等于 !~ 不匹配正则表达式
!= 不等于
要匹配一个正则表达式,可以使用~后紧跟/正则表达式/,也可使用if语句,if后面的条件用()括起来。
如:
awk '{if ($4 ~ /Brown/) print $0}' grade.txtawk '$4 ~ /Brown/ {print $0}' grade.txt
(6).复合条件操作符
&&:语句两边必须同时匹配为真。
||:语句两边同时或其中一边为真。
!:求逆。
如:
awk '{if ($1 == "P.Bunny" && $4 == "Yellow") print $0}' grade.txtawk '{if ($4 == "Yellow" || $4 ~ /Brown/) print $0}' grade.txt
(7).awk内置变量
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME Awk正在浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行-F选项
NF 浏览记录的域个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
访问命令行参数的方法:ARGV[n]。
访问系统环境变量:ENVIRON[ “EDITOR” ] = “vi”。
FNR表示awk目前操作的记录数,其值小于等于NR。
NF表示记录域个数,在记录被读之后设置。
OFS允许指定输出域分隔符,缺省为空格。
ORS允许指定输出记录分隔符,缺省为新行(\n)。
RS为记录分隔符,缺省为新行(\n)。
例:
显示记录个数:
awk 'END {print NR}' grade.txt
文件非空时才操作:
awk '{if (NR > 0 && $4 ~ /Bronw/) print $0}' grade.txt
显示路径中的文件名:
echo “/usr/sybase/etc/rc.file” |awk -F/ '{print $NF}'
(8).awk其他操作符
= += -= *= /= %= ^= 赋值操作符
? 条件表达操作符
+ - * / % ^ 算术操作符
++ -- 前缀和后缀
在awk中可以设置变量。如:
awk '{name=$1; belts=$4; \if (belts ~ /Yellow/) print name" is belt "belts}' grade.txt
(9).awk内置字符串函数
gsub(r,s) 在整个$0中用s替代r
gsub(r,s,t) 在整个t中用s替代r
index(s,t) 返回s中字符串t的第一位置
length(s) 返回s的长度
match(s,r) 测试s是否包含匹配r的字符串
split(s,a,fs) 在fs上将s分成序列a
sprintf(fmt,exp) 返回经fmt格式化后的exp
sub(r,s) 在$0中用最左边最长的子串s替代r
substr(s,p) 返回字符串s中从p开始的后缀部分
substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分
使用举例:
awk 'gsub(/4842/,4899) {print $0}' grade.txt
awk 'BEGIN {print index("Bunny","ny")}' grade.txt
awk '$1 == "J.Troli" {print length($1)" "$1}' grade.txt
awk 'BEGIN {print length("A good man")}'
awk 'BEGIN {print match("ABCD", /d/) }'
awk 'BEGIN { print split("123#456#678", myarray, "#"); \ print myarray[1]; print myarray[2]; print myarray[3])}'
awk "$1 == "J.Troli" {sub(/26/, "29", $0); print $0}' grade.txt
awk '$1 == "L.Tanskey" {print substr($1, 1, 5)}' grade.txt
awk '{print substr($1, 3)}' grade.txt
(10).字符串屏蔽序列
\b 退格键
\f 走纸换页
\n 新行
\r 回车键
\t tab键
\ddd 八进制值
\c 任意其他特殊字符,如\\为反斜线
(11).awk输出函数printf
基本语法:< P>
printf( [格式控制项],参数)
格式控制类似与c语言中的printf函数。
例如:
awk 'BEGIN { printf "%f\n", 999}'awk 'BEGIN {print "Name\t\tS.Number"} {printf "%-15s %s\n", $1, $3 }'
(12).在命令行向awk传值
格式:
awk 命令变量=输入值。
如:
df -k |awk '($4 ~ /^[0-9]/) \ { if ($4 < TRIGGER) print $6"\t"$4}' TRIGGER=5600who |awk '{ if ($1 == user) print $1"connected to "$2}' user=$LOGNAME
(13).awk数组
数组使用前不用定义,一般使用循环来访问数组。格式:
for ( element in array ) print array[element]
sed
(1).命令格式
调用sed有三种格式:
命令行格式:
sed [选项] sed命令 输入文件
使用sed脚本文件:
sed [选项] –f sed脚本文件 输入文件
可执行sed脚本:
sed脚本 [选项] 输入文件
当没有输入文件时,sed从标准输入中接收输入。sed不会对原始输入文件做修改。
sed命令要用单引号括起来。
sed选项:
n:不打印,sed不写编辑行到标准输出,缺省为打印所有行(编辑和未编辑)。
c:无用。
f:调用脚本文件。
(2).sed定位文本的方式
x x为一行号,如1
x,y 表示行号范围从x到y,如2,5
/pattern/ 查询包含模式的行
/pattern/pattern/ 查询包含两个模式的行
pattern/,x 在给定行号上查询包含模式的行
x,/pattern/ 通过行号和模式查询匹配行
x,y! 查询不包含指定行号x和y的行
sed模式匹配使用正则表达式。
(3).基本sed编辑命令
p 打印匹配行
= 显示文件行号
a\ 在定位行号后附加新文本信息
i\ 在定位行号后插入新文本信息
d 删除定位行
c\ 用新文本替换定位文本
s 使用替换模式替换相应模式
r 从另一个文件中读文本
w 写文本到一个文件
q 第一个模式匹配完成后退出或立即退出
l 显示与八进制ASCII码等价的控制字符
{} 在定位行执行的命令组
n 从另一个文件中读文本下一行,并附加在下一行
g 将模式2粘贴到/pattern n/
y 传送字符
n 延续到下一输入行,允许跨行的模式匹配
例如:
显示文本1到3行:
sed -n '1,3p' quote.txt
显示匹配的行:
sed -n '/Neave/p' quote.txt
在第四行查询模式:
sed -n '4,/The/p' quote.txt
匹配元字符(使用反斜线屏蔽含义):
sed -n '/\$/p' quote.txt
显示整个文件:
sed -n '1,$p' quote.txt
打印模式匹配的行号:
sed -n '/music/=' quote.txt
删除匹配的文本行:
sed '/Neave/d' quote.txt
写入文件/从文件读:
sed '/Neave/w dht' quote.txtsed '/company/r sedex.txt' quote.txt
匹配后退出:
sed '/.a.*/q' quote.txt
显示文件中控制字符:
sed -n '1,$l' func.txt
(4).附加文本
附加文本的操作格式(附加文本中的\表示换行,最后一行不加\,表示结束):
[address]a\text\text\text
插入文本、修改文本与此类似。
(5).替换文本
格式:
[address[,address]] s/pattern-to_find/replace_pattern/[g p w n]
替换选项:
g,缺省替换第一次出现,使用g替换所有出现。
p,打印。
w 文件名,将输出结果写到文件。
如:
sed -n 's/night/NIGHT/p' quote.txt
附加或修改原匹配模式,可以使用(&)命令,&保存发现模式。
将nurse改为”Hello” nurse:
sed -n 's/nurse/"Hello" &/p' quote.txt
#! /bin/bash
rmail="
[email protected]"
L="25"
host=`hostname`
while :; do
load=`uptime |awk '{print $10}' |cut -d'.' -f 1`
if [ $load -gt $L ] ; then
uptime |awk '{print $8,$9,$10,$11,$12}'>/tmp/mail.txt
mail -s $host:`cat /tmp/mail.txt|awk '{print $3$4$5}'` $rmail </tmp/mail.txt
sleep 600
fi
sleep 3
done
#! /bin/bash
rmail="[email protected]"
N="2000000"
host=`hostname`
while :; do
n=`sar -n DEV 1 2 |grep eth0 | tail -n1 |awk '{print $5}' |cut -d. -f1`
if [ $n -gt $N ] ; then
sar -n DEV 1 |grep eth0 | tail -n1>/tmp/sar.txt
mail -s $host\_flow:`echo $n` $rmail </tmp/sar.txt
sleep 600
fi
sleep 3
done
#! /bin/bash
N=2
[email protected]
while :; do
ipfile=/usr/local/sbin/serverip.txt
for ip in `cat $ipfile`; do
mailfile=/tmp/pkgloss.txt
pkgloss=`ping -c4 $ip |grep 'transm' |awk -F',' '{print $2}' |awk '{print $1}'`
if [ $pkgloss -lt $N ]; then
echo $ip >$mailfile
ping -c4 $ip |grep 'transm' >>$mailfile
mail -s "$ip loss packets" $rmail<$mailfile
fi
done
sleep 100
done
#! /bin/bash
w=`date +%w`
rs=/usr/bin/rsync
rsou=ypl-web:/data/wwwroot
rde=/backup/webatt
d1=`date +%y%m%d`
d2=`date -d "-1 day" +%y%m%d`
m1=`date -d "-1 day" +%y%m`
m2=`date +%y%m`
sou=$rsou/ypl/attachments
des=$rde/ypl-att
exec 1>/var/log/att-bak.log 2>&1
echo attbak start `date`
if [ "$w" = "0" ]; then
$rs -aur --delete $rsou/ypl/ $des/attachments_$w
else
$rs -aur --delete --exclude=attachments $rsou/ypl/ $des/attachments_$w
[ -d $des/attachments_$w/attachments/month_$m2 ] || mkdir -p $des/attachments_$w/attachments/month_$m2
$rs -aur $sou/month_$m1/$d2* $des/attachments_$w/attachments/month_$m1/
$rs -aur $sou/month_$m2/$d1* $des/attachments_$w/attachments/month_$m2/
$rs -aur $sou/swfupload/$d2* $des/attachments_$w/attachments/swfupload/
$rs -aur $sou/swfupload/$d1* $des/attachments_$w/attachments/swfupload/
/usr/bin/find $des/attachments_$w/attachments/ -type f -mmin +1600 |xargs rm
fi
echo attbak end `date`
while :;
do
nmap -sS -vv 121.10.118.111 |grep 80 |tail -n1>/tmp/nmap.txt
rr80=`cat /tmp/nmap.txt|awk '{print $2}'`
[ "$rr80" = "open" ] && mail -s rr_port_80 [email][email protected][/email] </tmp/nmap.txt
sleep 10
done当然可以尝试修改脚本使其监控80端口是否正常。
#!/bin/sh
grep HISTTIMEFORMAT /etc/bashrc || echo 'export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "' >>/etc/bashrc
for U in `grep -v shutdown /etc/passwd|awk -F: '$NF~/sh/&&$NF!~/no/{print $1}'`
do
UHOME=`cat /etc/passwd|grep "^$U"|cut -d: -f6`
[ ! -f $UHOME/.bash_history ] && touch $UHOME/.bash_history
chattr +a $UHOME/.bash_history
done
#! /bin/bash
STORE_NAME=`date +%m%d`
STORE_DIR='/home/backup/mysql/'
exec 1>/var/log/mysqlbak.log 2>&1
echo mysqlbak begin at `date`
[ ! -d $STORE_DIR ] && mkdir -p $STORE_DIR
/usr/local/mysql/bin/mysqldump -uroot -p'password' databasename > $STORE_DIR/mysql-$STORE_NAME.sql
gzip $STORE_DIR/mysql-$STORE_NAME.sql
find $STORE_DIR -mtime +7 -name '*.sql.gz' |xargs rm -f
echo mysqlbak finish at `date`
#! /bin/bash
dir=/home/mysql
for file in `ls $dir`; do
for file2 in `ls $dir/$file` ; do
own=`ls -ld $dir/$file/$file2 |awk '{print $3}'`
if [ "$own" = "root" ] ; then
chown -R mysql:mysql $dir/$file/$file2
echo "$dir/$file/$file2" >>/tmp/checkown.log
fi
done
done
#! /bin/bash
exec >>/tmp/addcnip.log 2>> /tmp/addcnip.log
echo " "
echo begin at `date`
d=`date +%y%m%d --date "-1 hour"`
d1=`date +%d --date "-1 hour"`
d2=`date +y%m%d%H --date "-1 hour"`
d3=`date +%H --date "-1 hour"`
svnpath=http://lishiming.5d6d.com/svn/cnip
logfile=/home/logs/access-$d2\_log
count1=`wc -l /usr/local/sbin/newcnip.txt|awk '{print $1}'`
accipf=/usr/local/sbin/nocnip.txt
newcnipf=/usr/local/sbin/newcnip.txt
dip=192.168.1.102
ipt=/sbin/iptables
awk '{print $1}' $logfile |sort -n|uniq |grep -v '^$'|grep -v '_'>/tmp/initip.txt
rm -f /tmp/cnip.txt
rm -f /tmp/initip2.txt
rm -f /tmp/nocnip.txt
for ip in `cat /tmp/initip.txt`; do
n=`grep $ip $accipf|wc -l`
if [ "$n" = "0" ] ; then
echo $ip >>/tmp/initip2.txt
fi
done
killall whois
for ip in `cat /tmp/initip2.txt|grep -v '^$'`; do
[ -d /tmp/whois ] || mkdir /tmp/whois
whois $ip >/tmp/whois/$ip
coun=`cat /tmp/whois/$ip |grep 'ountry'|awk '{print $2}'|head -n1`
if [ "$coun" = "CN" ] || [ "$coun" = "cn" ]; then
ippool=`cat /tmp/whois/$ip |grep 'netnum' |awk '{print $2"-"$4}'`
echo $ippool >>/tmp/cnip.txt
else
echo $ip >>/tmp/nocnip.txt
fi
rm -f /tmp/whois/$ip
done
cat $accipf >>/tmp/nocnip.txt
grep -v '^$' /tmp/nocnip.txt|sort -n |uniq >$accipf
cat $newcnipf |grep -v '^$'>>/tmp/cnip.txt
count2=`grep -v '^$' /tmp/cnip.txt|sort -n |uniq |wc -l |awk '{print $1}'`
if [ "$count1" -lt "$count2" ]; then
sort -n /tmp/cnip.txt |uniq |grep -v '^$'>$newcnipf
/bin/cp -f $newcnipf /tmp/cnip/$d1-cnip.txt
$ipt -F
for ip in `cat $newcnipf|grep -v '^$'`; do
$ipt -I INPUT -m iprange --src-range $ip -d $dip -j DROP
done
for ip2 in `cat /usr/local/sbin/goodip.txt`; do
$ipt -I INPUT -s $ip2 -d $dip -j ACCEPT
done
if [ "$d3" != "00" ] ; then
/usr/bin/svn remove $svnpath\/$d.txt -m 'if exist'
fi
/usr/bin/svn import /tmp/cnip/$d1-cnip.txt $svnpath\/$d.txt -m 'add cnip'
fi
echo end `date`
#! /bin/bash
exec 1>/var/log/mysqlbak.log 2>&1
data_source=/home/mysql/
backup_dir=/mnt/mysqlbak
remote_dir=1.2.3.4:/data/mysqlbak
n=`date +%d`
w=`date +%w`
echo backup of mysql begins at `date`
/etc/init.d/mysqld stop
p=/var/run/mysqld/mysqld.pid
while ps -p $p >/dev/null;
do
sleep 1 && echo -n .
done
sync;sync;sync;sleep 2;
rsync -aru --delete $data_source/* $backup_dir/mysql_$w/
/etc/init.d/mysqld start
echo backup of mysql finished at `date`
rsync -aru --delete $backup_dir/mysql_$w/* $remote_dir/mysql_$n/
echo remote backup of mysql finished at `date`
df -h|awk '$5~/[8 9][0-9]%|100%/ ' >/tmp/checkdisk.log
sed 's/\(^a.*\)/\1 12/' test
#cat test
askdj
aslkd aslkdjf3e
skdjfsdfj
sdkfjk
fsdkfjksdjfkjsdf
12sdfesdf
aslkdjfkasdjf asdlfkjaskdfj
#sed 's/\(^a.*\)/\1 12/' test
askdj 12
aslkd aslkdjf3e 12
skdjfsdfj
sdkfjk
fsdkfjksdjfkjsdf
12sdfesdf
aslkdjfkasdjf asdlfkjaskdfj 12
#! /bin/bash
chd='www.5dforum.com/bbs.php'
mailer='[email protected]'
maxrp=3
while :; do
n1=0
c=`ping -c 10 www.5dforum.com |grep received |awk '{print $4}' `
if [ $c == "0" ] ; then
for i in `seq 1 $maxrp`; do
c=`ping -c 10 www.5dforum.com |grep received |awk '{print $4}' `
if [ $c == "0" ] ; then
n1=$i
fi
sleep 10
done
if [ $n1 == $maxrp ]; then
echo "The 5dforum\'s network is down!"|mail -s 5dforum-down $mailer
exit
fi
else
if $(curl $chd|grep 'Discuz!'>/dev/null) ; then
sleep 30
else
n2=0
for i in `seq 1 $maxrp`; do
if $(curl $chd|grep 'Discuz!'>/dev/null) ; then
sleep 30
else
n2=$i
fi
done
if [ $n2 == $maxrp ] ; then
echo "The 5dforum is something wrong, please cheack!"|mail -s 5dforum-down $mailer
exit
fi
fi
fi
sleep 30
done
- «
- 1
- ...
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- ...
- 63
- »