天天看點

Linux常用shell腳本

如何用腳本實作分割檔案 

代碼: 

#!/bin/bash 

if [ $# -ne 2 ]; then 

echo 'Usage: split file size(in bytes)' 

exit 

fi 

file=$1 

size=$2 

if [ ! -f $file ]; then 

echo "$file doesn't exist" 

#TOD test if $size is a valid integer 

filesize=`/bin/ls -l $file | awk '{print $5}'` 

echo filesize: $filesize 

let pieces=$filesize/$size 

let remain=$filesize-$pieces*$size 

if [ $remain -gt 0 ]; then 

let pieces=$pieces+1 

echo pieces: $pieces 

i=0 

while [ $i -lt $pieces ]; 

do 

echo split: $file.$i: 

dd if=$file of=$file.$i bs=$size count=1 skip=$i 

let i=$i+1 

done 

echo "#!/bin/bash" > merge 

echo "i=0" >> merge 

echo "while [ $i -lt $pieces ];" >> merge 

echo "do" >> merge 

echo " echo merge: $file.$i" >> merge 

echo " if [ ! -f $file.$i ]; then" >> merge 

echo " echo merge: $file.$i missed" >> merge 

echo " rm -f $file.merged" >> merge 

echo " exit" >> merge 

echo " fi" >> merge 

echo " dd if=$file.$i of=$file.merged bs=$size count=1 seek=$i" >> merge 

echo " let i=$i+1" >> merge 

echo "done" >> merge 

chmod u+x merge' 

如何查找日期為某一天的檔案 

#!/bin/sh 

# The right of usage, distribution and modification is here by granted by the author. 

# The author deny any responsibilities and liabilities related to the code. 

OK=0 

A=`find $1 -print` 

if expr $3 == 1 >/dev/null ; then M=Jan ; OK=1 ; fi 

if expr $3 == 2 >/dev/null ; then M=Feb ; OK=1 ; fi 

if expr $3 == 3 >/dev/null ; then M=Mar ; OK=1 ; fi 

if expr $3 == 4 >/dev/null ; then M=Apr ; OK=1 ; fi 

if expr $3 == 5 >/dev/null ; then M=May ; OK=1 ; fi 

if expr $3 == 6 >/dev/null ; then M=Jun ; OK=1 ; fi 

if expr $3 == 7 >/dev/null ; then M=Jul ; OK=1 ; fi 

if expr $3 == 8 >/dev/null ; then M=Aug ; OK=1 ; fi 

if expr $3 == 9 >/dev/null ; then M=Sep ; OK=1 ; fi 

if expr $3 == 10 >/dev/null ; then M=Oct ; OK=1 ; fi 

if expr $3 == 11 >/dev/null ; then M=Nov ; OK=1 ; fi 

if expr $3 == 12 >/dev/null ; then M=Dec ; OK=1 ; fi 

if expr $OK == 1 > /dev/null ; then 

ls -l --full-time $A 2>/dev/null | grep "$M $4" | grep $2 ; 

else 

echo Usage: $0 path Year Month Day; 

echo Example: $0 ~ 1998 6 30; 

如何計算目前目錄下的檔案數和目錄數 

# ls -l * |grep "^-"|wc -l ---- to count files 

# ls -l * |grep "^d"|wc -l ----- to count dir 

如何隻列子目錄? 

ls -F | grep /$ 或者 alias sub = "ls -F | grep /$"(linux) 

ls -l | grep "^d" 或者 ls -lL | grep "^d" (Solaris) 

如何實作取出檔案中特定的行内容 

如果你隻想看檔案的前5行,可以使用head指令, 

如: head -5 /etc/passwd 

如果你想檢視檔案的後10行,可以使用tail指令, 

如: tail -10 /etc/passwd 

你知道怎麼檢視檔案中間一段嗎?你可以使用sed指令 

如: sed -n '5,10p' /etc/passwd 這樣你就可以隻檢視檔案的第5行到第10行。 

如何查找含特定字元串的檔案 

例如查找目前目錄下含有"the string you want find..."字元串的檔案: 

??$find . -type f -exec grep “the string you want find...” {} ; -print 

如何列出目錄樹 

下面的短小的shell程式可以列出目錄樹, 充分利用了sed強大的模式比對能力. 

??目錄樹形式如下: 

??. 

??`----shellp 

??`----updates 

??`----wu-ftpd-2.4 

??| `----doc 

??| | `----examples 

??| `----src 

??| | `----config 

??| | `----makefiles 

??| `----support 

??| | `----man 

??| `----util 

??腳本如下: 

??#!/bin/sh 

??# dtree: Usage: dtree [any directory] 

??dir=${1:-.} 

??(cd $dir; pwd) 

??find $dir -type d -print | sort -f | sed -e "s,^$1,," -e "/^$/d" -e "s,[^/]*/([^/]*)$,`----1," -e "s,[^/]*/,| ,g" 

如何實作取出檔案中特定的列内容 

我們經常會遇到需要取出分字段的檔案的某些特定字段,例如/etc/password就是通過“:”分隔各個字段的。可以通過cut指令來實作。例如,我們希望将系統賬号名儲存到特定的檔案,就可以: 

??cut -d: -f 1 /etc/passwd > /tmp/users 

??-d用來定義分隔符,預設為tab鍵,-f表示需要取得哪個字段。 

??當然也可以通過cut取得檔案中每行中特定的幾個字元,例如: 

??cut -c3-5 /etc/passwd 

??就是輸出/etc/passwd檔案中每行的第三到第五個字元。 

??-c 和 -f 參數可以跟以下子參數: 

??N 第N個字元或字段 

??N- 從第一個字元或字段到檔案結束 

??N-M 從第N個到第M個字元或字段 

??-M 從第一個到第N個字元或字段 

在vim中實作批量加密 

密碼中還是不能帶空格,不管了,能加密就好,先這麼用着。 

============================================================ 

# Encrypt file with vim 

if (test $# -lt 2) then 

echo Usage: decrypt password filename 

vim -e -s -c ":set key=$1" -c ':wq' $2 

echo "$2 encrypted." 

[weeder@SMTH weeder]$ for file in *.txt ; do encrypt test $file ; done 

test2.txt encrypted. 

test4.txt encrypted. 

test9.txt encrypted. 

kick.txt encrypted. 

too_old.txt encrypted. 

too_old_again.txt encrypted. 

bg5.txt encrypted. 

[weeder@SMTH weeder]$ 

$@等特定shell變量的含義 

在shell腳本的實際編寫中,有一些特殊的變量十分有用: 

$# 傳遞到腳本的參數個數 

$* 以一個單字元串顯示所有向腳本傳遞的參數。與位置變量不同,此選項參數可超過9個 

$$ 腳本運作的目前程序ID号 

$! 背景運作的最後一個程序的程序ID号 

$@ 與$#相同,但是使用時加引号,并在引号中傳回每個參數 

$- 顯示shell使用的目前選項,與set指令功能相同 

$? 顯示最後指令的退出狀态。0表示沒有錯誤,其他任何值表明有錯誤。 

如何使程式的執行結果同時定向到螢幕和檔案 

program_name |tee logfile 

這樣程式執行期間的顯示都記錄到logfile同時顯示到标準輸出(螢幕)。 

如何用sendmail給系統所有使用者送信 

首先在aliases檔案裡面建立一個alias: 

alluser: :include:/etc/mail/allusers 

并執行newaliases使之生效,然後在/etc/mail/allusers裡面列出所有使用者,可以使用下面的指令: 

awk -F: '$3 > 100 { print $1 }' /etc/passwd > /etc/mail/allusers 

如何查找某條指令的相關庫檔案 

在制作自己的發行版時經常需要判斷某條指令需要哪些庫檔案的支援,以確定指定的指令在獨立的系統内可以可*的運作。 

在Linux環境下通過ldd指令即可實作,在控制台執行: 

ldd /bin/ls 

即可得到/bin/ls指令的相關庫檔案清單。 

如何使用host指令獲得更多資訊 

Host能夠用來查詢域名,然而它可以得到更多的資訊。host -t mx linux.com可以查詢出Linux.com的MX記錄,以及處理Mail的Host的名字。Host -l linux.com會傳回所有注冊在linux.com下的域名。host -a linux.com則會顯示這個主機的所有域名資訊。 

如何停止終端多個程序 

以下是腳本: 

??echo "系統目前使用者" 

??echo "---------------" 

??who | awk '{print $2}' 

??echo "輸入要殺死終端的終端号:" 

??read $TTY 

??kill -9 ${K}=`ps -t $TTY | grep [0-9] | awk '{print $1}'`

繼續閱讀