Shell 编程实例集锦
上一篇 / 下一篇 2007-07-01 23:38:06 / 个人分类:Linux
Shell 编程实例集锦
如何远程杀死僵进程?所谓“僵进程”是指处于睡眠中,而且没用的进程。在进行并行计算时经常会有僵进程产生。由于用 top 看不到“僵进程”,所以写了如下一个叫做“rkill”的 shell 文件:
#!/bin/tcsh
echo " Input start number of node: "
set N1="$<"
echo " Input end number of node: "
set N2="$<"
echo " Input the NAME of program"
set pname="$<"
echo "**********************************************************"
while($N1 <= $N2)
set h='t'$N1
set ppid=`rsh $h ps -ef | grep $pname | awk '{print $2}' `
echo "rsh $h kill $ppid"
rsh $h kill $ppid
@ N1++
end
echo "**********************************************************"
如何将一个 index 文件中的空链接删除?在目录 /doc/Art_and_Photos/photo/NASA-Astronomy_Picture_of_the_Day 中只有有限的几个文件,而 archivepix.html 文件中却链接了两千多个文件,我们的目标就是要把不存在的文件链接删除掉。
#!/bin/tcsh -f
# 从当前目录中查找有哪些可用文件。find 不支持正则表达式 \{\}
set tmp=`find . -type f -maxdepth 1 -name "ap[0-9][0-9][0-9][0-9][0-9][0-9].html" `
# 将查找结果 ./ap000303.html 转换为 ap000303.html
set ff1=`echo $tmp | sed -e 's/\.\/\(ap[0-9]\{6\}\.html\)/\1/g' `
# 在文件 archivepix.html 中查找包含类似 ap000303.html 的行,并将其导入临时文件 ftmp 中
grep 'ap[0-9]\{6\}\.html' archivepix.html >ftmp
# 将 ftmp 中的每一行转换为 ap000303.html 的形式,这样 ff1 和 ff2 中的字符串在形式上就是相同的了。
set ff2 = ` sed -e 's/.*\(ap[0-9]\{6\}\.html\).*/\1/g' ftmp`
rm ftmp -f
# 比较变量 ff1 和 ff2 的内容,如果一个字符串只存在于 ff2 中,那么就把文件 archivepix.html 中含有
# 该字符串的行删除掉。
foreach f2 ($ff2)
echo $f2
set flag=0
foreach f1 ($ff1)
if ($f2 == $f1) then
set flag=1
endif
end
if($flag == 0) then
sed -e '/'$f2'/d' archivepix.html >ftmp # 此句最关键之处在于'$f2'可用于正则表达式。
mv ftmp archivepix.html -f
endif
end
如何将一个目录中的所有文件链接到网页中?只要将下列程序的输出导到一个文件中,再将其拷至网页的相应位置就可以了。这里最关键的是看双引号如何输出(\")。
#!/bin/tcsh -f
set dd = "/doc/Art_and_Photos/Flash/flash/AGui"
set ffff = `find $dd -type f `
set n=0
foreach f ($ffff)
@ n++
echo $f
echo '< a href='\"$f\"'<'$n',</a>'>> AGui.html
end
如何为一堆文件换名字?在吴老师的笔记心得中介绍了张林波的高招,但那是 bash 的,而且是以命令行形式给出的。为了便于理解,我将其改写为 tcsh 格式,并将其置于脚本文件之中,更利于使用。
#!/bin/tcsh -f # -f 说明直接运行该文件,而不会先运行 .cshrc 进行初始化
rm tmp_file -f # 确保该文件不存在
foreach fold (*.jpg.*)
set fnew = ` echo $fold | sed -e "s/\.jpg\.\(.*\)/-\1.jpg/g" ` # 精华之处
echo "mv $fold $fnew -f " >>tmp_file
end
chmod a+x tmp_file
./tmp_file
rm tmp_file -f
在这个脚本文件中,关键是“精华之处”。它的意义是:首先将要修改的文件名($fold)通过管道( | ) 传给流编辑器(sed),流编辑器对文件名进行处理,其各项的具体意义为:
set fnew = ` echo $fold | sed -e "s/\.jpg\.\(.*\)/-\1.jpg/g" `
sed -e 命令+选项 表示允许多点编辑
s/re/string/ 用 string 替换正则表达式 re
/\.jpg\.\(.*\)/ “\.”表示一个真正的点,“\.jpg\.” 代表文件名中的“ .jpg.”;
“\(.*\)” 中的‘.’匹配一个非换行符的字符,‘*’匹配 0 个或多个“先前”字符,
它与 shell 的通配符完全不同,shell 的通配符代表 0 个或多个“任意”字符。
“.*”所代表的内容被设为“标签 1”,可在需要的地方用“\1”引用。值得注意
的是:“.*”决不能用“*”来代替,因为“*”将表示任意个“\.”。
/-\1.jpg/ “\1”代表“标签 1”的内容
g 表示行内全面替换
这里还有一个地方需要提醒,那就是将 `echo ...` 引起来的不是单引号,而是键盘左上角标有 “~ ` ”上的撇号.
如何解决网页中字体放大时出现重叠的问题?方案一:适用于单层目录
#!/bin/tcsh -f
set dir=`ls .`
foreach d ($dir)
if( -d $d) then # 判断是否为目录
cd $d
echo "cd $d"
foreach f (*.htm *.html)
sed -e '/[0-9]pt/d' $f > ftmp # 删除所有包含 9pt、12pt 等关键词的行
mv ftmp $f -f
end
cd ..
endif
end
方案二:适用于多层目录
#!/bin/tcsh -f
set SearchPath = "/doc/Reading/everything/武侠/梁羽生"
set files=`find $SearchPath -type f -name "*.htm*" `
foreach f ($files)
echo $f
sed -e '/[0-9]pt/d' $f > ftmp
mv ftmp $f -f
end
如何将一个目录中所有文件名由大写变为小写我们以目录 tmp 为例
1. 进入 tmp 目录的上一级目录
2. zip -r tmp.zip tmp/*
3. mv tmp tmp-old (这是为了安全起见,此处也可改为 rm -r -f tmp )
4. unzip -LL tmp.zip
这样,tmp 目录中的文件名就全改为小写了。在确认无误后,可将 tmp-old 目录删除。
如何将一个文件中的内容由大写变为小写最简单的做法是在 ~/.cshrc 中设如下命令:
alias tr 'tr A-Z a-z< \!* >ttttmp; mv ttttmp \!* -f'
此处别名必须为 tr,其他的就不行,不知为什么。当需要对文件进行操作时,敲如下命令:
tr [filename]
该命令在命令行中运行没有任何问题,但是如果将其放在一个 shell scrīpt 文件中,然后将该文件的属性改为可执行并执行之的话,你会发现用 alias 设置的简化命令全部失效。解决办法为:
source shell_file
此处还顺便说一句,sh 命令运行的是 bash 文件。
如何使系统每隔大约3小时自动激活一次声卡1. 由于我们所用的声卡驱动程序是一个试用版的,在一星期以内,它有3小时的有效时间(尚可接受)。但超过一个星期以后,有效时间就只有20分钟了,那是绝对无法忍受的!吴首教为此感到义愤填膺,于2003年9月1日“坐台”完毕后,组建攻关小组并亲自挂帅,带领组员王某人经过“极其艰苦” 的奋斗,终于攻克了这一难题。短命的攻关小组在完成了其历史使命,并开完“非典声卡激活经验总结表彰大会”后,就地解散。茫茫天地间只留下了如下解决方案:
(1) 建立 shell 脚本文件 opensound
#!/bin/tcsh -f
while(1)
set datesave=`date +%m%d%H%M%Y`
date 082500002003
/usr/lib/oss/soundoff
/usr/lib/oss/soundon
date $datesave
sleep 10800
end
(2) 将 opensound 的属性改为所有人均可执行, 命令为:
chmod a+x opensound
(3) 将 opensound 拷贝至 /usr/local/bin
(4) 在 /etc/rc.d/rc.local 中加入
/usr/local/bin/opensound >&/dev/null&
(5) 重新启动计算机。然后我们就能永远听到美妙的声音啦!!! (此事又一次证明: 道高一尺, 魔高一丈!)
2. 曾经我以为这一问题已圆满解决,但在使用过程中却问题多多,人生最痛苦的事莫过如此。究其原因,都是 soundoff 惹得祸。为了声音永驻,我将不惜 CPU 时间与其试比高。
#!/bin/tcsh -f
set datesave=`date +%m%d%H%M%Y`
date 082500002003
/usr/lib/oss/soundoff
/usr/lib/oss/soundon
date $datesave
sleep 8000 # 以上是为了在系统启动时激活声卡
while(1)
/usr/lib/oss/soundoff >& out
set flag=`cat out`
rm out -f
set N=0
if("$flag" != "") then # flag 不是空串说明 soundoff 执行失败
while(2)
@ N++
/usr/lib/oss/soundoff >& out
set flag=`cat out`
rm out -f
if("$flag" == "") then
echo "soundoff succeed"
break
else
echo "$N soundoff failed"
sleep 5
endif
end
endif
set datesave=`date +%m%d%H%M%Y`
date 082500002003
/usr/lib/oss/soundon
date $datesave
sleep 8000
end
安装方便,使用简易,兼容效果好
ISO光盘里已带有JRE,安装时将自动安装上jre
电驴 / aMule下地址
http://lib.verycd.com/2007/06/26/0000154778.html
#yum update
也可以添加一个软件库:
rpm -Uhv http://apt.sw.be/packages/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
需要说明:
下面所安装的LAMP软件可能官方库没有或不全。
cp /etc/php.ini /etc/php.ini.bak
vi /etc/php.ini
cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.bak
gedit /etc/httpd/conf/httpd.conf
cp /etc/php.ini /etc/php.ini.bak
gedit /etc/php.ini
cp /etc/my.cnf /etc/my.cnf.bak
gedit /etc/my.cnf
delete from mysql.user where user='';
/etc/rc.d/init.d/httpd restart
/etc/rc.d/init.d/mysqld start
chmod 755 /home/aphone/
mkdir /home/aphone/action
mkdir /etc/skel/action
chown aphone.aphone /home/aphone/action
mv /var/www/html /var/www/html.bak
ln -s /home/aphone/action /var/www/html
gedit /etc/httpd/conf.d/exam.conf
Alias /phpmyadmin /home/aphone/begin/phpmyadmin
Alias /phpsysinfo /home/aphone/begin/phpsysinfo
|
相关阅读:
- ACPI和APIC有什么关系? (kernbombe, 2007-3-31)
- 核弹 / KernBombe (音译:卡邦) 系统 (原名:Nuclear Bombs系统) (kernbombe, 2007-9-22)
- KernBombe声卡音量设置 (kernbombe, 2007-7-01)
- KernBombe安装Nvidia显示驱动 (kernbombe, 2007-7-01)
- KernBombe安装打印机(基于cups平台)(其他linux也适用) (kernbombe, 2007-7-01)
- KernBombe 的快速关机 (kernbombe, 2007-7-01)
- 强烈推荐使用永中集成Office 2007作linux办公平台 (kernbombe, 2007-7-03)
- Linux更新工具Yumex&yum揭秘 (kernbombe, 2007-7-05)
- 通过yum安装LAMP (kernbombe, 2007-7-05)
标题搜索
日历
|
|||||||||
| 日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
| 1 | 2 | 3 | 4 | ||||||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 | |||
| 12 | 13 | 14 | 15 | 16 | 17 | 18 | |||
| 19 | 20 | 21 | 22 | 23 | 24 | 25 | |||
| 26 | 27 | 28 | 29 | 30 | 31 | ||||
我的存档
数据统计
- 访问量: 93307
- 日志数: 252
- 图片数: 1
- 书签数: 7
- 建立时间: 2007-03-30
- 更新时间: 2008-07-07
