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 script 文件中,然後將該文件的屬性改爲可執行並執行之的話,你會發現用 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章