Chinaunix首页 | 论坛 | 博客
  • 博客访问: 416107
  • 博文数量: 126
  • 博客积分: 4025
  • 博客等级: 上校
  • 技术积分: 1970
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-18 18:09
文章分类

全部博文(126)

文章存档

2009年(126)

我的朋友

分类: LINUX

2009-03-20 13:53:19

##################################
来在网上的资料,还需要验证!!! 慎用


##################################


如何用脚本实现分割文件[code]#!/bin/bash

if [ $# -ne 2 ]; then
        echo 'Usage: split file size(in bytes)'
        exit
fi

file=$1
size=$2

if [ ! -f $file ]; then
        echo "$file doesn't exist"
        exit
fi

#TODO: test if $size is a valid integer

filesize=`/bin/ls -l $file | awk '{print $5}'`
echo filesize: $filesize

let pieces=$filesize/$size
let remain=$filesize-$pieces*$size
if [ $remain -gt 0 ]; then
        let pieces=$pieces+1
fi
echo pieces: $pieces

i=0
while [ $i -lt $pieces ];
do
        echo split: $file.$i:
        dd if=$file of=$file.$i bs=$size count=1 skip=$i
        let i=$i+1
done

echo "#!/bin/bash" >; merge

echo "i=0" >;>; merge
echo "while [ $i -lt $pieces ];" >;>; merge
echo "do" >;>; merge
echo " echo merge: $file.$i" >;>; merge
echo " if [ ! -f $file.$i ]; then" >;>; merge
echo " echo merge: $file.$i missed" >;>; merge
echo " rm -f $file.merged" >;>; merge
echo " exit" >;>; merge
echo " fi" >;>; merge
echo " dd if=$file.$i of=$file.merged bs=$size count=1 seek=$i" >;>; merge
echo " let i=$i+1" >;>; merge
echo "done" >;>; merge
chmod u+x merge' [/code]

如何查找日期为某一天的文件[code]
#!/bin/sh
# The right of usage, distribution and modification is here by granted by the author.
# The author deny any responsibilities and liabilities related to the code.
#
OK=0
A=`find $1 -print`
if expr $3 == 1 >;/dev/null ; then M=Jan ; OK=1 ; fi
if expr $3 == 2 >;/dev/null ; then M=Feb ; OK=1 ; fi
if expr $3 == 3 >;/dev/null ; then M=Mar ; OK=1 ; fi
if expr $3 == 4 >;/dev/null ; then M=Apr ; OK=1 ; fi
if expr $3 == 5 >;/dev/null ; then M=May ; OK=1 ; fi
if expr $3 == 6 >;/dev/null ; then M=Jun ; OK=1 ; fi
if expr $3 == 7 >;/dev/null ; then M=Jul ; OK=1 ; fi
if expr $3 == 8 >;/dev/null ; then M=Aug ; OK=1 ; fi
if expr $3 == 9 >;/dev/null ; then M=Sep ; OK=1 ; fi
if expr $3 == 10 >;/dev/null ; then M=Oct ; OK=1 ; fi
if expr $3 == 11 >;/dev/null ; then M=Nov ; OK=1 ; fi
if expr $3 == 12 >;/dev/null ; then M=Dec ; OK=1 ; fi
if expr $3 == 1 >;/dev/null ; then M=Jan ; OK=1 ; fi
if expr $OK == 1 >; /dev/null ; then
ls -l --full-time $A 2>;/dev/null | grep "$M $4" | grep $2 ;
else
  echo Usage: $0 path Year Month Day;
  echo Example: $0 ~ 1998 6 30;
fi [/code]
如何计算当前目录下的文件数和目录数[code]
# ls -l * |grep "^-"|wc -l ---- to count files
# ls -l * |grep "^d"|wc -l ----- to count dir [/code]
如何只列子目录? [code]
ls -F | grep /$ 或者 alias sub = "ls -F | grep /$"(linux)

ls -l | grep "^d" 或者 ls -lL | grep "^d" (Solaris)
[/code]
如何实现取出文件中特定的行内容 [code]
如果你只想看文件的前5行,可以使用head命令,
如: head -5 /etc/passwd

如果你想查看文件的后10行,可以使用tail命令,
如: tail -10 /etc/passwd

你知道怎么查看文件中间一段吗?你可以使用sed命令
如: sed -n '5,10p' /etc/passwd 这样你就可以只查看文件的第5行到第10行。
[/code]
如何查找含特定字符串的文件 [code]
例如查找当前目录下含有"the string you want find..."字符串的文件:
  $find . -type f -exec grep “the string you want find...” {} ; -print [/code]
如何列出目录树[code]
下面的短小的shell程序可以列出目录树, 充分利用了sed强大的模式匹配能力.
  目录树形式如下:
  .
  `----shellp
  `----updates
  `----wu-ftpd-2.4
  | `----doc
  | | `----examples
  | `----src
  | | `----config
  | | `----makefiles
  | `----support
  | | `----makefiles
  | | `----man
  | `----util
  脚本如下:
  #!/bin/sh
  # dtree: Usage: dtree [any directory]
  dir=${1:-.}
  (cd $dir; pwd)
  find $dir -type d -print | sort -f | sed -e "s,^$1,," -e "/^$/d" -e "s,[^/]*/([^/]*)$,`----1," -e "s,[^/]*/,| ,g" [/code]
如何实现取出文件中特定的列内容 [code]
我们经常会遇到需要取出分字段的文件的某些特定字段,例如/etc/password就是通过“:”分隔各个字段的。可以通过cut命令来实现。例如,我们希望将系统账号名保存到特定的文件,就可以:
  cut -d: -f 1 /etc/passwd >; /tmp/users
  -d用来定义分隔符,默认为tab键,-f表示需要取得哪个字段。
  当然也可以通过cut取得文件中每行中特定的几个字符,例如:
  cut -c3-5 /etc/passwd
  就是输出/etc/passwd文件中每行的第三到第五个字符。
  -c 和 -f 参数可以跟以下子参数:
  N 第N个字符或字段
  N- 从第一个字符或字段到文件结束
  N-M 从第N个到第M个字符或字段
  -M 从第一个到第N个字符或字段 [/code]
在vim中实现批量加密 [code]
密码中还是不能带空格,不管了,能加密就好,先这么用着。

============================================================
#!/bin/bash
# Encrypt file with vim

if (test $# -lt 2) then
    echo Usage: decrypt password filename
else
    vim -e -s -c ":set key=$1" -c ':wq' $2
    echo "$2 encrypted."
fi
============================================================
[weeder@SMTH weeder]$ for file in *.txt ; do encrypt test $file ; done
test2.txt encrypted.
test4.txt encrypted.
test9.txt encrypted.
kick.txt encrypted.
    echo "$2 encrypted."
fi
[weeder@SMTH weeder]$ for file in *.txt ; do encrypt test $file ; done
test2.txt encrypted.
test4.txt encrypted.
test9.txt encrypted.
kick.txt encrypted.
too_old.txt encrypted.
too_old_again.txt encrypted.
bg5.txt encrypted.
[weeder@SMTH weeder]$ [/code]
$@等特定shell变量的含义 [code]
在shell脚本的实际编写中,有一些特殊的变量十分有用:
$# 传递到脚本的参数个数

$* 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个

$$ 脚本运行的当前进程ID号

$! 后台运行的最后一个进程的进程ID号

$@ 与$#相同,但是使用时加引号,并在引号中返回每个参数

$- 显示shell使用的当前选项,与set命令功能相同

$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
[/code]
如何使程序的执行结果同时定向到屏幕和文件  [code]
program_name |tee logfile
这样程序执行期间的显示都记录到logfile同时显示到标准输出(屏幕)。 [/code]
如何用sendmail给系统所有用户送信[code]
首先在aliases文件里面建立一个alias:
alluser: :include:/etc/mail/allusers
并执行newaliases使之生效,然后在/etc/mail/allusers里面列出所有用户,可以使用下面的命令:
awk -F: '$3 >; 100 { print $1 }' /etc/passwd >; /etc/mail/allusers[/code]
如何查找某条命令的相关库文件 [code]
在制作自己的发行版时经常需要判断某条命令需要哪些库文件的支持,以确保指定的命令在独立的系统内可以可靠的运行。
在Linux环境下通过ldd命令即可实现,在控制台执行:
ldd /bin/ls
即可得到/bin/ls命令的相关库文件列表。 [/code]
如何使用host命令获得更多信息 [code]
Host能够用来查询域名,然而它可以得到更多的信息。host -t mx linux.com可以查询出Linux.com的MX记录,以及处理Mail的Host的名字。Host -l linux.com会返回所有注册在linux.com下的域名。host -a linux.com则会显示这个主机的所有域名信息。 [/code]
如何停止终端多个进程 [code]
以下是脚本:
  echo "系统当前用户"
  echo "---------------"
  who | awk '{print $2}'
  echo "---------------"
  echo "输入要杀死终端的终端号:"
  read $TTY
  kill -9 ${K}=`ps -t $TTY | grep [0-9] | awk '{print $1}'`


一个监控磁盘空间大小并自动报警的脚本

#!/bin/sh

#make by codfei

init()
{
IPADD=`ifconfig|grep 172.18|awk '{print $2}'|sed 's/addr://g'`;
NOWTIME=`date +%F-%H:%M`;
MAILTO="";
MAIL_SUB=" !**Report - Disk Capacity Report $NOWTIME **!";
tmpfile=/tmp/iamatmpfile.tmp
}

mhead()
{
        echo "" >$tmpfile;
        echo "From :$IPADD" >>$tmpfile
        echo "State :Report" >>$tmpfile
        echo "ReportBy:$0" >> $tmpfile
        echo "DateTime:$NOWTIME" >> $tmpfile
        echo "Info :codfei" >> $tmpfile
        echo "" >>$tmpfile;
}

smail()
{
mail -s "$MAIL_SUB" $MAILTO < $tmpfile

}
init;

for x in `df | grep /dev | awk '{print $5}' | sed 's/%//g'`
do

  if [ $x -gt 89 ]; then
  mhead;
  df -h >>$tmpfile;
  smail;
  exit 0;
  fi

done






刚刚开始写一些简单脚本,还是觉得不能得心应手,不过总算写完成了。
面试的时候让写监控disk、cpu使用情况超过90% 后,报警给管理员,当时没有写的很准确,回来了就写了一下。如下:有问题请各位网友指出
       一、实现硬盘监控。
~]# vi watch.sh
#!/bin/bash
for i in `df -k |awk '{print $5}' |grep -v ^[a-z] |awk -F"%" '{print $1}'`
do
if [ $i -ge 90 ]; then
/bin/mail -s "$HOSTNAME `date +%Y-%m-%d-%H-%M----%w`Filesystem over" < /fileawk -- -f
#/bin/mail -s "fileawk over" < /fileawk -- -f
#cat /fileawk | /bin/mail -s "$HOSTNAME$ Filesystem over" -- -f
else
echo `date` Filesystem up to snuff  >> /var/log/filesystem.log
fi
done
 
~]# cat /fileawk
192.168.1.238 文件系统使用超过了90% 。
 
注:
     1、这个for的赋值采用的方法有所不同,但效果一样。
for disk in `df -h|awk '{print $5}'|sed 's/%//g'|grep -v "U"`
     2、date +%Y-%m-%d-%H-%M----%w可阅读性不强,可换成
date +%Y%m%d-%R 
 
        二、实现对CPU的监控
#!/bin/bash
logdir=/var/log
logfile=$logdir/cpucheck.log
if [ -f $logfile ]
then
echo "logfile is exist !"
else
touch $logfile
fi
for cpucheck in `sar -u 2 2 |awk '{print $NF}'|sed '1,3d'|sed 's/\([0-9]*\)\..*/\1/g'`
do
if [ $cpucheck -le 10 ]; then
/bin/mail -s "$HOSTNAME `date` cpu USE 90%" bo < /fileawk -- -f
echo cpu Use 90% send post to admin.
else
echo "cpu up to snuff" >> $logfile
echo cpu up to snuff!
fi
done
 
注:
对sar 理解不深,有错误之处请指出,谢谢!
 
三、服务器上有两块网块,一块配有电信网关eth0,另一块配有网通的网关eth1,正常的用eth1,网通出现问题时,自动切换到电信。
root:/root>cat gateWin.sh
#!/bin/bash
win=`ping -c 10 192.168.1.138 |grep From |wc -l`
winstatu=`ping -c 10 192.168.1.138 |grep From |awk '{print $1}'|tail -n 1`
if [ "$winstatu" = From -a "$win" -gt 7 ]; then
echo "`date +%y-%m-%d-%R`  network error " >> /var/log/gate.log
#echo "NETWORKING=yes" > /etc/sysconfig/network
#echo "HOSTNAME=dns.secure.net" >> /etc/sysconfig/network
#echo "GATEWAY=11.23.55.77" >> /etc/sysconfig/network
#/bin/mail -s
else
echo "`date +%y-%m-%d-%R` network good" >> /var/log/gate.log
fi


阅读(781) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~