龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 操作系统 > LINUX系统 >

经典shell编程实例

时间:2011-03-20 22:37来源:未知 作者:admin 点击:
分享到:
如何远程杀死僵进程? 所谓“僵进程”是指处于睡眠中,而且没用的进程。在进行并行计算时经常会有僵进程产生。由于用 top 看不到“僵进程”,所以写了如下一个叫做“rkill”的 sh

  如何远程杀死僵进程?

  所谓“僵进程”是指处于睡眠中,而且没用的进程。在进行并行计算时经常会有僵进程产生。由于用 top 看不到“僵进程”,所以写了如下一个叫做“rkill”的 shell 文件:

  #!/bin/tcsh

  echo " Input start number of node: "

  set N1="___FCKpd___0lt;"

  echo " Input end number of node: "

  set N2="___FCKpd___0lt;"

  echo " Input the NAME of program"

  set pname="___FCKpd___0lt;"

  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 vuDLinux联盟-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 的行,vuDLinux联盟并将其导入临时文件 ftmp 中

  grep 'ap[0-9]\{6\}\.html' archivepix.html >ftmp

  # 将 ftmp 中的每一行转换为 ap000303.html 的形式,这样 ff1 和 ff2 vuDLinux联盟中的字符串在形式上就是相同的了。

  set ff2 = ` sed -e 's/.*\(ap[0-9]\{6\}\.html\).*/\1/g' ftmp`

  rm ftmp -f

  # 比较变量 ff1 和 ff2 的内容,如果一个字符串只存在于 ff2 中,vuDLinux联盟那么就把文件 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'vuDLinux联盟可用于正则表达式。

  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','>> 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" `vuDLinux联盟 # 精华之处

  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\.\(.*\)/ vuDLinux联盟“\.”表示一个真正的点,“\.jpg\.” 代表文件名中的“ .jpg.”;vuDLinux联盟“\(.*\)” 中的‘.’匹配一个非换行符的字符,‘*’匹配 0 个或多个“先前”字符,

  它与 shell 的通配符完全不同,shell 的通配符代表 0 个或多个“任意”字符。

  “.*”所代表的内容被设为“标签 1”,可在需要的地方用“\1”引用。值得注意

  的是:“.*”决不能用“*”来代替,因为“*”将表示任意个“\.”。

  /-\1.jpg/ “\1”代表“标签 1”的内容

  g 表示行内全面替换

  这里还有一个地方需要提醒,那就是将 `echo ...` 引起来的不是单引号,而是键盘左上角标有 “~ ` ”上的撇号.

[1] [2] 下一页

精彩图集

赞助商链接