2015-06-11 126 views
0

我需要使用shell腳本替換文件中的一行。使用shell腳本替換文件中的一行

的文件是:

# cat /root/sge_scripts/night_sched_conf 
algorithm default 
schedule_interval 0:0:05 
maxujobs 12 
queue_sort_method seqno 

我想通過在腳本產生的值來替換所述第三線(maxujobs之後)。

這是我迄今所做的:

#!/bin/sh 
export SGE_ROOT=/opt/sge 
source=/opt/sge/defalt/common/settings.sh 
delete=1 
total=`qstat -u "*" | awk ' { print $4 } ' | sort | uniq | wc -l` 
total_users=$((total - delete)) 

case $total_users in 

1) range=18;; 
2) range=9 ;; 
3) range=7 ;; 
4) range=6 ;; 
5) range=5 ;; 
6) range=4 ;; 
7) range=3 ;; 
8) range=3 ;; 
9) range=2 ;; 
10) range=2 ;; 
11) range=2 ;; 
12) range=2 ;; 
13) range=1 ;; 
14) range=1 ;; 
15) range=1 ;; 
16) range=1 ;; 
18) range=1 ;; 
19) range=1 ;; 
20) range=1 ;; 
21) range=1 ;; 
22) range=1 ;; 
23) range=1 ;; 
24) range=1 ;; 
25) range=1 ;; 
26) range=1 ;; 
27) range=1 ;; 
28) range=1 ;; 
29) range=1 ;; 
30) range=1 ;; 
31) range=1 ;; 
32) range=1 ;; 
33) range=1 ;; 
34) range=1 ;; 
*) echo "INVALID NUMBER!" ;; 
esac 

current=`cat /root/sge_scripts/night_sched_conf | awk ' /maxujobs/ { print $2 } '` 
if [ "$range" != "$current" ] 
then 
    sed -i '3s/.*/maxujobs   "$range"/' /root/sge_scripts/night_sched_conf 
fi 
+0

而問題是你得到''$ range 「'而不是數字? shell不會在單引號內部擴展內容,這很好。這意味着你需要小心。可能是''3s /.*/ maxujobs'「$ range /」'(這是一個參數,即使第一部分是單引號,第二部分是雙引號)。 –

回答

0

是的,有這樣做。還有在linux命令調用sed這是用來編輯shell腳本文件,比如一個流編輯器的方式更新字符串或替換字符串可以this.You做可以按照下面參考,並嘗試使用此命令replace.Try出來,讓我知道,如果你遇到的任何問題

Reference

+1

我的印象是,他們知道'sed';它們顯示它正在腳本的底部使用。他們應該能夠做得比案例陳述更好,但這是一個完全不同的論點。 –

+0

謝謝,但我想tp傳遞範圍值sed -i'3s /.*/ maxujobs「$ range」/'/ root/sge_scripts/night_sched_conf – sagar

+0

你可以告訴我們確切的文件更改,所以我可以幫助更好這如果沒有完成.. – gks