Shell程序集锦五——有用的小脚本[收集]

前言:以下是收集的一些Shell小脚本,有些已经测试完毕,还有一部分没有测试完。中间有很多,我已经平时都用到了。以后还有类似的有用的小脚本也要加进来。 

  
环境:
winxp+vm+centos4.3
 
1.shell写的进度指示条(旋转型):
#!/bin/sh 
proc() { 

     c0=’-’ 
     c1=’\’ 
     c2=’|’ 
     c3=’/’ 
     begin=$1 
     end=$2 
     row=$3 
     pos1=`expr $begin + 1` 
     pos2=`expr $begin + 5` 

     printf "\033[2J" 
     while [ $begin -le $end   ]; do 
         index=`expr $begin % 4` 
         pro=`echo "scale=0; ${begin}*100/$end" | bc` 
         eval printf \"’\033[${row};${bos1}H$c’$index   ’$pro%%   ’\" 
         begin=`expr $begin + 1` 
     done 
     echo "done" 


# call subroutine 
proc 0 102 20 

1.1 shell写的进度指示条2(旋转型):
drawper ()
{
_per=`expr $1 \* 100 / $2`
case `expr $_per / 4 % 4` in
0) _char="|" ;;
1) _char="/" ;;
2) _char="-" ;;
3) _char="\\" ;;
esac
printf "\r$_char   $_per%%"
if [ $1 -eq $2 ];then
printf "\n"
fi
}

i=1
while [ $i -le 100 ]
do
drawper $i 100
i=`expr $i + 1`
done

1.2 shell写的进度指示条3(方块前进型):
#!/bin/sh 

abort() { 
     printf   "\033[m\n" 
     exit 


# do nothing, just simulate time consume. 
idle() { 
     i=1 
     sum=`date +%S` 
     sum=`expr $sum \* $sum | cut -b 1` 
     sum=`expr $sum \* 10` 
     while [ $i -le $sum ]; do 
         i=`expr $i + 2 ` 
         trap abort   2 
     done 


proc() { 
     begin=$1 
     end=$2 
     row=$3 
     pos1=`expr $begin + 1` 
     pos2=`expr $end - 1` 
     mid=`echo "($begin+$end)/2-2" |bc` 

     printf "\033[2J" 
     printf "\033[${row};${begin}H[" 
     printf "\033[${row};${end}H]" 
     while [ $pos1 -le $pos2   ]; do 
         pro=`echo "scale=0; ($pos1 - $begin)*100/($pos2-$begin)" | bc` 
         if [ $pos1 -gt $mid ]; then 
             printf "\033[7m\033[${row};${mid}H$pro%%\033[${row};${pos1}H:" 
         else 
             printf "\033[m\033[${row};${mid}H$pro%%\033[7m\033[${row};${pos1}H:" 
         fi 
         pos1=`expr $pos1 + 1` 
         idle 
         trap abort   2 
     done 
     printf "\033[m\n" 
     echo "done" 


# call subroutine 
printf "### proc 1 80 10 ### hit ENTER to continue " 
if read a; then 
     proc 1 80 10 
fi 

printf "### proc 25 55 10 ### hit ENTER to continue " 
if read a; then 
     proc 25 55 20 
fi

2.如何从PING 中提取出AVERAGE这个字段呀,怎么写这个脚本?
--------------------------
ping -c 5 -f hostname | tail -1 | awk '{ print $4 }' | awk -F "/" '{ print $2 }'
3.查找一个文件中的某个参数的值,找到后替换成一新值
--------------------
sed 's/id=1/id=5/g' test.txt > test2.txt
 
4.通过netstat查看同时连接某个端口的ip数
-------------------------
netstat -na | grep 192.168.1.246:80 | grep TIME_WAIT | cut --delimiter=" " --fields="21" | cut --
delimiter=":" --
fields="1" | sort | uniq | wc -l
 
5.将linux的文本文件转换为windows格式的文本文件。
----------------------
unix2dos filename
 
6.如何在脚本文件中控制输出的颜色   
比如
echo "Error."
我想让Error显示为red 
--------------------------
echo '^[[40;31m显示内容'
注意:^[ 的输入方法是ctrl+v键,再按ESC键
第二个 [ 是直接输入 [ 的
;前的数字是背景色,后面为前景色
背景色:
40黑41红42绿43黄44青45蓝46青47白
前景色:
30黑31红32绿33黄34蓝35紫36青37白
 
7.怎样在当前目录及子目录下的文件中找到包含某单词的文件?
------------------
find dir -print|xargs grep -l yourword
 
8.批量建立文件夹:
------------
mkdir a{1,2,3,4,5,6} 
或者
for i in 1 2 3 4 5 6; do
    mkdir a$i
done
 
9.如何列出某段时间内的所有文件?
------------------------
begin='Jun 23 15:00'
end='Jun 24 15:00'
cat - <- - - - - $begin - - - - -
- - - - - $end - - - - -
`ls -lrtFR`
!
 
10.一次杀掉几个相同的进程:
-----------------------------
LINUX、FREEBSD下用
#killall httpd
or
# kill -9 `ps -ef |grep httpd|awk '{print $2}'`
 
11.如何实现从一个指定的字符串后取出一个字符串.
例如:
The WHO's top official for Asia, Dr. Shigeru Omi, announced Tuesday that the advisory warning against travel
to verb=Beijing is no longer needed. "After careful analysis, WHO has concluded that risk to travelers is now
minimal," said Dr. Omi.
The move now means there are no SARS-related verb=travel warnings anywhere in the world, after nearly four
months.
将"verb=" 后的词取出,本例是将Beijing    travel 取出
-----------
sed 's/.* verb=\([^ ]\{1,\}\) .*/\1/' filename 
首先s///的意思是替换的意思,用后边的内容把前边的部分替换掉~
第一个".*"的意思是不"verb="前边的任何东西,可以是零个或多个
最后边的同理
中间的部分"\"是转意字符~ 两个小阔号中的内容就是后边的\1,这是sed中的后向引用."[^ ]"是非空格的意思,大阔号中的1代
表至少匹配一次~~~
 
12.每5 分钟检测网络连接,(ping 某主机地址192.1.1.1,看是否通)
如通,无任何提示,如不通,屏幕出现提示,并且发出声音告警,
----------------------------
更改一下目标地址和错误消息就可以了。
^G 的输入:Ctrl + v; Ctrl + g;
while( true; )
do
    ping -c 1 -w 1 TARGETADDR > /dev/null 2>&1;
    if [ "$?" -eq "1" ]; then
        echo "ERROR_MESSAGE" && echo ^G;
    fi;
    sleep 300;
done
 
13.ftp自动上传文件脚本
--------------------
ftp -n -i<open 192.168.2.2 
user guest guest 
prompt off 
lcd /usr/local/xx
cd mm/html 
mput * 
cd ../../nn/htm 
lcd /usr/local/yy
mput *
by 
EOF
 
14.磁带机操作:
----------------
1。先找到磁带机的设备文件
ioscan -kfnCtape
2.比如是/dev/rmt/0m
3.将磁带插入磁带机
4。用tar cvf file.tar /directory写入磁带。 
----------
tar cv file 是覆盖磁带的所有
tar rv file 是追加
tar xv 是显示
 
15.把文本中的某一列不打印出来,不知道AWK有没有这样的参数.例:
123,345,678,789
不打印第二列
123,678,789
-------------------
awk能做,但不如用cut更直接:
cut -d "," -f1,3 filename
----------------
awk -F, '{print $1 "," $3 }' filename
 
16 一个文件 行数未知.怎样给这个文件的每行添加一行号.
---------------
nl filename
17 查看网卡的工作速度shell:


#!/bin/sh
if [ "$1" = "" ]; then
echo usage:
echo nr TIME_IN_SECOND
echo for example:
echo ./nr 10
exit
fi
echo see network speed. by seeker
TXDATA=`ifconfig | grep "TX bytes:" | head -n 1 | awk -F':' '{print $3}' | awk -F' ' '{print $1}'`
#echo TX\(sent\) $TXDATA
RXDATA=`ifconfig | grep "RX bytes:" | head -n 1 | awk -F':' '{print $2}' | awk -F' ' '{print $1}'`
#echo RX\(recv\) $RXDATA
TIME=$1
sleep $1
TXDATA1=`ifconfig | grep "TX bytes:" | head -n 1 | awk -F':' '{print $3}' | awk -F' ' '{print $1}'`
#echo TX\(sent\) $TXDATA1
RXDATA1=`ifconfig | grep "RX bytes:" | head -n 1 | awk -F':' '{print $2}' | awk -F' ' '{print $1}'`
#echo RX\(recv\) $RXDATA1
let TX=(TXDATA1-TXDATA)
let RX=(RXDATA1-RXDATA)
let RATET=TX/TIME/1024
let RATER=RX/TIME/1024
let KTX=TX/1024
let KRX=RX/1024
let BWT=RATET*8
let BWR=RATER*8
echo Sent: $KTX K, $RATET K/S, used_bandwidth: $BWT K
echo Recv: $KRX K, $RATER K/S, used_bandwidth: $BWR K


#sh test.sh 10    即测试10秒内网卡的速度.

18、精确找出某些进程的pid   

ps ax|grep "smbd"|awk '/smbd/ {print}'|grep -vE "awk|ps|grep"|awk '/.*/ {print $1}'

   

19、用cut输出特定的列   

han:~/script$ ps
PID TTY          TIME CMD
21169 pts/0    00:00:00 bash
991 pts/0    00:00:00 ps
han:~/script$ ps|cut -c1-5
PID
21169
1099
1100

   

20、tar的一些不常用但有用的用法   

$tar tf mod_resource2.2.tar
mod_resource2.2/debug.h
mod_resource2.2/ap_sem.h
mod_resource2.2/ap_shm.h
mod_resource2.2/mod_resource.c
mod_resource2.2/mod_resource.o
mod_resource2.2/mod_resource.so

   

  1.         

  2. 解压指定的某些文件        tar xf mod_resource2.2.tar mod_resource2.2/ap_sem.h
    tar xf mod_resource2.2.tar mod_resource2.2/{ap_sem.h,debug.h}        

  3. 除了某些文件,都解压        tar xf mod_resource2.2.tar --exclude=ap_sem.h
    tar xf mod_resource2.2.tar --exclude=ap*        

  4. 如果档案内的文件很多        tar tf mod_resource2.2.tar > tmp.txt
    vim tmt.txt
    tar xf mod_resource2.2.tar -X tmp.txt
    tar xf mod_resource2.2.tar -T tmp.txt    

   

21、"<<"在连接到其他交互程序非常有用,如ftp,mysql等客户端工具   

cat > newfile << END
this is a newfile.
END

ftp -in << END
user who
bin
get xxfile
quit
END

mysql db -u who -ppasswd << END
source a.sql
source b.sql
quit
END

   

22、trap信号的屏蔽、捕捉等    

trap "" 2 3 15
trap "my_exit" 2 3 5 #my_exit是shell函数,当遇到2,3,15信号时执行

   

创建唯一临时文件$$代表进程号    

23、用data命令创建日志文件    

DATA=`date +%d%m%y`
touch log.$DATA

   

24、eval两趟扫描,可以用来执行变量中存放的命令。还可以给每个值一个变量名,如有一个文件file里面是这样的   

user1 passwd1
user2 passwd2
...
we can do like this:
while read user passwd
do
eval `echo "${user}"="${passwd}"`
done < file
这样文件中第一列成为了变量名,第二列是值

   

25、logger记录日志   

logger -p notice "message"
-p是指优先级

   

26、set在脚本内部给出参数,set命令就好象你在执行shell脚本时添加在后面的一样    

#!/bin/sh
set p1 p2
echo $1$2
exit 0

       

27、tee,可以将标准输入拷贝到多个文件中和标准输出中
   

$echo name=hanwoody | tee a1.txt a2.txt a3.txt > /dev/null
$cat a?.txt
name=hanwoody
name=hanwoody
name=hanwoody

    

bash中的menu-complete功能很有用的
echo -e "\C-i:menu-complete\nset completion-ignore-case on" > ~/.inputrc
    

将两个文件内容纵向合并 paste -d ' ' a.txt b.txt    

打开文件时指定文件描述符 $ exec 3< readfile ## 在文件描述符3上打开文件readfile,并用于读$ exec 4> writefile ## 在文件描述符4上打开文件writefile,并用于写$ exec 5<&0 ## 文件描述符5和0指向了同一个文件$ exec 5<&- ## 关闭描述符5文件读(<)写(>)符号前面的数字n表示在文件描述符n上打开文件,后面是文件,或用&n表示n指向的文件!0对于读(<)可以省略,1对于写(>)可以省略,所以我们经常看到 
$ cmd1 <readfile
$ cmd2 >writefile 2>&1 
它们分别等价于 
$ cmd1 0<readfile 
$ cmd2 1>writefile 2>&1   

调试shell程序sh -x -v example.sh (man set) 

bash rangefor i in {1..9} {a..z}; do echo $i; done 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值