un腳本
A. shell腳本取重復數據的最後一條記錄
假設你這個.unl文件叫 file.unl,並且內容不含斜杠 / 。
腳本大致如下:
#!/bin/bash
myfile=file.unl
touch tmp
while read line
do
grep "$line" tmp >/dev/null 2>&1
if [ $? -eq 0 ]; then
num=`awk '{print $NF}' tmp`
num=`expr $num + 1`
sed -i 「s/^\($line\t\雹拿)[0-9]*$/\1$num/」 tmp
else
echo -e "$line\t1" >>tmp
fi
done <$myfile # ---> 1), 2)
awk '$NF>1{print}' tmp >err.unl # ---> 3)
sed -i 's/^\(..*\)\t[0-9]*$/\1/' tmp
mv -f tmp $myfile # ---> 4)
exit 0
思路就是,
1)遍歷 unl 文件的每一行,逐行拷貝一份到臨時文件tmp中,後面附加一個出現的次數。
2)遍歷的同時到tmp文件中去查找是否有已存在的相同記錄,如果有,就只是更新tmp文件中記錄的次數而不添加一個新記孝態錄。
3)最後根據tmp文件中記錄的次數是否大於1來生成err.unl文件巧肆源,記錄重復的行及總共出現的次數。
4)將tmp文件中的次數記錄去除即得到更新後的 unl 文件。
由於要求要覆蓋原unl文件,所以這里存在風險。 建議運行腳本前先備份一下原unl文件。
最後,恕我直言,這個題目的難度不止10分。
你看,while循環,grep / sed / awk,全用上了 ^_^
————————————————————————————————————
發現一個更簡練的方法,兩條命令即可搞定:
awk '{s[$0]+=1} END{for(a in s) print a, s[a]}' file.unl >err.unl
awk '{print $1}' err.unl >file.unl
當然,前提是unl文件的每行內容不能含有空格或TAB之類的分隔符。
參考了 http://..com/question/271261293.html#here 這個問題中shuguangbo童鞋的回答。
B. Unsurpt是什麼意思
Unscript 無腳本
C. CentOS開機自動運行自己的腳本詳解
記錄這個事情是上次完成之後,今天要新加一個文件夾,一時之間忘記以前怎麼做了,因為有幾種方法,起碼我知道三種方法,這里記錄一筆以前的做法,覺得最簡單:
操作系統:CentOS-5.2
目標:開機自動掛載區域網中windows的共享目錄
一、root許可權編輯/etc/rc.d/rc.local
Shell代碼
su cd /etc/rc.d/ vi rc.local
二、在這個文件加上你要執行的腳本,全部內容如下:
Shell代碼
#!/bin/sh # # This script will be executed *after* all the other init scripts. # You can put your own initialization stuff in here if you don't # want to do the full Sys V style init stuff. touch /var/lock/subsys/local mount //192.168.0.3/data2-1 /mnt/data2-1 -o username=un,password=123 mount //192.168.0.3/data2-2 /mnt/data2-2 -o username=un,password=123 mount //192.168.0.3/data2-3 /mnt/data2-3 -o username=un,password=123 mount //192.168.0.3/data2-4 /mnt/data2-4 -o username=un,password=123 mount //192.168.0.3/data2-5 /mnt/data2-4 -o username=un,password=123
提示:這里的做法很不成熟,希望不要這樣,最好自己寫個腳本文件在這里來調用,結構更清晰,但是要注意到是把要執行的命令作為一個參數傳遞給su。
另外復習一個VI編輯命令-拷貝
yy
p
三、雖然搞定,還是補充一下
Linux在啟動時,會自動執行/etc/rc.d目錄下的初始化程序,因此我們可以把啟動任務放到該目錄下,有下列辦法:
方案一:
比較簡單,就是上面的做法,/etc/rc.d/目錄下的初始化程序很多,rc.local是在完成所有初始化之後執行的,所以在這里做手腳很合適。
方案二:
init.d目錄下都為可執行程序,他們其實是服務腳本,按照一定格式編寫,Linux 在啟動時會自動執行,類似Windows下的服務。
1、編寫如下面的腳本simpleTest:
Shell代碼
#!/bin/bash #chkconfig:2345 80 05 --指定在哪幾個級別執行,0一般指關機,6指的是重啟,其他為正常啟動。80為啟動的優先順序,05為關閉的優先順序別 #description:simple example service RETVAL=0 start(){ #啟動服務的入口函數 echo "simple example service is started..." } stop(){ #關閉服務的入口函數 echo "simple example service is stoped..." } #使用case選擇 case $1 in start) start ;; stop) stop ;; *) echo "error choice ! please input start or stop";; esac exit $RETVA
3、運行chmod +x /etc/rc.d/init.d/simpleTest,使之可直接執行
4、運行chkconfig --add simpleTest,把該服務添加到配置當中
5、運行chkconfig --list simpleTest,可以查看該服務進程的狀態
方案三、目的是掛載共享目錄,所以可以在/etc/fstab中加上
//192.168.0.3/data2-1 /mnt/data2-1 nfs username=un,password=123 0 0
非常不好意思,方案二中雖然腳本可以運行
# ./simpleTest start
simple example service is started...
但是我在第4步出現
# chkconfig --add simpleTest
在 simpleTest 服務中讀取信息時出錯:沒有那個文件或目錄
沒有進一步解決抱歉。