linux 常用脚本分析

来源:互联网 发布:淘宝上怎么设置促销价 编辑:程序博客网 时间:2024/05/16 14:50
  常用Shell脚本集   来源: ChinaUnix博客  日期: 2008.01.31 09:32 (共有0条评论) 我要评论   如何用脚本实现分割文件CODE:[Copy to clipboard]#!/bin/bashif [ $# -ne 2 ]; then        echo 'Usage: split file size(in bytes)'        exitfifile=$1size=$2if [ ! -f $file ]; then        echo "$file doesn't exist"        exitfi#TODO: test if $size is a valid integerfilesize=`/bin/ls -l $file | awk '{print $5}'`echo filesize: $filesizelet pieces=$filesize/$sizelet remain=$filesize-$pieces*$sizeif [ $remain -gt 0 ]; then        let pieces=$pieces+1fiecho pieces: $piecesi=0while [ $i -lt $pieces ];do        echo split: $file.$i:        dd if=$file of=$file.$i bs=$size count=1 skip=$i        let i=$i+1doneecho "#!/bin/bash" >; mergeecho "i=0" >;>; mergeecho "while [ $i -lt $pieces ];" >;>; mergeecho "do" >;>; mergeecho " echo merge: $file.$i" >;>; mergeecho " if [ ! -f $file.$i ]; then" >;>; mergeecho " echo merge: $file.$i missed" >;>; mergeecho " rm -f $file.merged" >;>; mergeecho " exit" >;>; mergeecho " fi" >;>; mergeecho " dd if=$file.$i of=$file.merged bs=$size count=1 seek=$i" >;>; mergeecho " let i=$i+1" >;>; mergeecho "done" >;>; mergechmod u+x merge' 如何查找日期为某一天的文件CODE:[Copy to clipboard]#!/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:[Copy to clipboard]# ls -l * |grep "^-"|wc -l ---- to count files # ls -l * |grep "^d"|wc -l ----- to count dir 如何只列子目录?CODE:[Copy to clipboard]ls -F | grep /$ 或者 alias sub = "ls -F | grep /$"(linux)ls -l | grep "^d" 或者 ls -lL | grep "^d" (Solaris)如何实现取出文件中特定的行内容CODE:[Copy to clipboard]如果你只想看文件的前5行,可以使用head命令,如: head -5 /etc/passwd 如果你想查看文件的后10行,可以使用tail命令,如: tail -10 /etc/passwd 你知道怎么查看文件中间一段吗?你可以使用sed命令 如: sed -n '5,10p' /etc/passwd 这样你就可以只查看文件的第5行到第10行。如何查找含特定字符串的文件CODE:[Copy to clipboard]例如查找当前目录下含有"the string you want find..."字符串的文件:$find . -type f -exec grep “the string you want find...” {} ; -print 如何列出目录树CODE:[Copy to clipboard]下面的短小的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:[Copy to clipboard]我们经常会遇到需要取出分字段的文件的某些特定字段,例如/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个字符或字段 在vim中实现批量加密CODE:[Copy to clipboard]密码中还是不能带空格,不管了,能加密就好,先这么用着。============================================================#!/bin/bash# Encrypt file with vimif (test $# -lt 2) then    echo Usage: decrypt password filenameelse    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 ; donetest2.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 ; donetest2.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]$ $@等特定shell变量的含义CODE:[Copy to clipboard]在shell脚本的实际编写中,有一些特殊的变量十分有用:$# 传递到脚本的参数个数$* 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个$$ 脚本运行的当前进程ID号$! 后台运行的最后一个进程的进程ID号$@ 与$#相同,但是使用时加引号,并在引号中返回每个参数$- 显示shell使用的当前选项,与set命令功能相同$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。如何使程序的执行结果同时定向到屏幕和文件CODE:[Copy to clipboard]program_name |tee logfile这样程序执行期间的显示都记录到logfile同时显示到标准输出(屏幕)。 如何用sendmail给系统所有用户送信CODE:[Copy to clipboard]首先在aliases文件里面建立一个alias:alluser: :include:/etc/mail/allusers并执行newaliases使之生效,然后在/etc/mail/allusers里面列出所有用户,可以使用下面的命令:awk -F: '$3 >; 100 { print $1 }' /etc/passwd >; /etc/mail/allusers如何查找某条命令的相关库文件CODE:[Copy to clipboard]在制作自己的发行版时经常需要判断某条命令需要哪些库文件的支持,以确保指定的命令在独立的系统内可以可靠的运行。在Linux环境下通过ldd命令即可实现,在控制台执行:ldd /bin/ls即可得到/bin/ls命令的相关库文件列表。 如何使用host命令获得更多信息CODE:[Copy to clipboard]Host能够用来查询域名,然而它可以得到更多的信息。host -t mx linux.com可以查询出Linux.com的MX记录,以及处理Mail的Host的名字。Host -l linux.com会返回所有注册在linux.com下的域名。host -a linux.com则会显示这个主机的所有域名信息。 如何停止终端多个进程CODE:[Copy to clipboard]以下是脚本:echo "系统当前用户"echo "---------------"who | awk '{print $2}'echo "---------------"echo "输入要杀死终端的终端号:"read $TTYkill -9 ${K}=`ps -t $TTY | grep [0-9] | awk '{print $1}'` 如何转存用户bash_history文件#把以下代码添加到/etc/profile文件内export HISTTIMEFORMAT="%F %T " USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'` LOCAL_name=`hostname` HISTDIR=/var/log/.hist/${LOCAL_name}_`date +%Y%m%d`_auditlog #判断$USER_IP是否为空,如果为空则使用hostname记录. if [ -z $USER_IP ] then USER_IP=`hostname` fi if [ ! -d $HISTDIR ] then mkdir -p $HISTDIR #为$HISTDIR赋值权限,让所有用户都可以访问. chmod 777 $HISTDIR fi if [ ! -d $HISTDIR/${LOGNAME} ] then mkdir -p $HISTDIR/${LOGNAME} chmod 300 $HISTDIR/${LOGNAME} fi export HISTSIZE=4096 DT=`date +%Y%m%d"_"%T` export HISTFILE="$HISTDIR/${LOGNAME}/${USER_IP}_${LOGNAME}_$DT" chmod 600 $HISTDIR/${LOGNAME}/*.hist* 2>/dev/null待续.....本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/31547/showart_474080.html