Vi常用命令(查看原圖)
Shell基本命令
clear 清屏
cd – 後退
cd $MYPATH 進入指定目錄(環境變量已設)
ls –l 列出文件
ls –al 列出所有文件,包含隱藏文件
whoami 查看自己用戶名
cd mydir 進入目錄
cd my* 進入目錄
tar cvf ddd.tar abc.* def ghi 壓縮文件(可以多個)
tar xvf ddd.tar 解壓縮
rm –rf mydir 刪除目錄,不帶確認
grep abc *.pc 文件內容中查找abc
grep –c abc *.txt 查找內容abc,並統計
grep –i abc *.txt 查找內容abc,大小寫不敏感
set|grep TL_ABC 在環境變量中過濾TL_ABC
diff abc.txt /usera/def.txt 比較文件
find . –name 「abc*」 目錄中查找文件
cp –p abc.txt /mydir/abc_d.txt 拷貝
ps –ef|grep UserA 列出某用戶的進程
shellABC.sh > abc.log 覆蓋輸出
shellABC.sh >> abc.log 追加輸出
exit 退出
su –userABC 切換用戶
last 查看最近登錄的用戶
Esc+K 重複上次輸入的命令(多次k向上翻)
編輯上次的命令: Esc+i 插入 Esc+x 刪除 h 向左 l 向右
ipcs –oq|grep 5000 查看消息隊列
make 自動查找目錄下的makefile並編譯
man sighold 查看該函數定義 man socket
cat abc.txt 查看文件
more abc.txt 分頁查看文件
vi abc.txt 編輯文件
netstat –i 查看網卡
netstat –r 查看路由
alias pss=』ps –ef|grep abc』 設置快捷shell名pss,常用在.profile中
which pss ,或which cc 查cc所在的目錄
PS1=』$PWD>』;export PS1 顯示當前目錄,而不是$ (常用在.profile中)
set –o vi 常用在Esc顯示^K的情況下
cp /dev/null abc.log 清空文件 (大文件常常vi打不開(:%d),直接用此命令)
. .profile 修改$HOME的.profile文件後不用重新登陸,用此命令立刻生效
set|grep ABC, 查看環境變量,或用env
who|wc –l 統計在線人數
pwd 查看當前目錄
ipcs –oq 查看消息隊列是否擁堵
tail –f abc.log 跟蹤文件末尾
chmod +x find_me.sh 加執行權限
netstat –an|grep 52 查看包含52的埠網絡狀態
netstat –an|grep LISTEN 查看偵聽埠網絡狀態
ls –l|grep 『^d』 列出目錄
ls –l|grep 『^[^d]』 列出非目錄
grep userABC /etc/services 查看DB2埠等信息
grep userABC /etc/passwd 查看$HOME所在目錄
dbx –a 99878 調試attach到PID(有關dbx調試命令見其他)
Shell進階命令
sudo !! 以 root 的身份執行上一條命令
ctrl r 在命令歷史中查找
history 查看命令歷史
!88 運行命令歷史中的編號為88的命令
^old^new 替換前一條命令裡的部分字符串並重新執行上一條命令
du -s * | sort -n -r 當前目錄裡的文件和文件夾按大小排序排列
> file.txt 創建一個空文件,比 touch 短
top -p pid 監控某個進程的CPU和內存消耗情況,ps aux獲得PID,或者 ps -p pid -o %cpu,%mem,cmd
netstat -tulpn 顯示偵聽的埠
netstat -anop 顯示偵聽的埠和偵聽在這個埠號的進程
tail -f /path/to/file.log sed '/^Finished: SUCCESS$/ q' 當 file.log 裡出現 Finished: SUCCESS 時候就退出 tail,這個命令用於實時監控並過濾 log 是否出現了某條記錄。
ssh user@server bash < /path/to/local/script.sh 在遠程機器上運行一段腳本。這條命令最大的好處就是不用把腳本拷到遠程機器上。
lsof –i 實時查看本機網絡服務的活動狀態。
腳本例子:(列印環境變量)
env>env.log
while read line
do
var=』echo $line|awk –F=』{print $1}』』
value=』echo $line|awk –F=』{print $2}』』
echo $var 「-」$value
done<env.log
rm –f env.log
腳本例子:(停止進程, 帶一個參數,用法ShellName.sh DEF)
for i in 『ps –ef|grep ABC|grep $1|awk 『{print $2}』』
do
echo 「delete PID $i」
kill -9 $i
done
Vi命令
:wq保存退出 :q! 強制退出
Kjhl 上下左右
i 進入插入模式, r 進入替代模式
A 到行尾並Append,
a 進入Append輸入模式
O 在本行上新增一行
o在本行下新增一行
:%d 刪除所有文本
:sh 執行外部shell
:389 跳到389行, :1 跳至文件頭 shift+g,跳至頁尾
:set nu 列印行號
Ctrl+f 向下翻頁, Ctrl+b 向上翻頁
^ 移動至行首 $ 移動至行末
/ 向下查找,? 向上查找 (繼續按則查找下一個)
// 重複上次查找
Esc 退出編輯或插入模式
X 刪除後一個,x 刪除前一個
:1,%s/abc/def/g 替換abc為def
:1,$s/^M//g (轉換控制字符^M, 用Ctrl+V, Ctrl+M輸入)
dd刪除一行
J 刪除一行帶回車
Yy 複製一行, p粘貼
Shell與Sed常用用法
--
文件abc:
TL_FMT_CHG_SHM_KEY=7100;export TL_FMT_CHG_SHM_KEY
TL_MSQ_SHM_KEY=7200;export TL_MSQ_SHM_KEY
TL_TXN_SRV_SHM_KEY=7300;export TL_TXN_SRV_SHM_KEY
需要取出等號前面的:awk -F= '{print $1}' abc
需要取出TL_FMT_CHG_SHM_KEY等號後面的7100這個值:(原理是取出等號和分號之間的數據)
awk -F\; '{print $1}' abc|grep TL_FMT_CHG_SHM_KEY|awk -F= '{print $2}'
$ a=5; b=7; c=2
$ echo $(( a+b*c ))
19
$ echo $(( (a+b)/c ))
6
$ echo $(( (a*b)%c))
1
a=5; ((a++)) 可將 $a 重定義為 6
a=5; ((a--)) 則為 a=4
a=5; b=7; ((a < b)) 會得到 0 (true) 的返回值。
常見的用於 (( )) 的測試符號有如下這些:
<:小於
>:大於
<=:小於或等於
>=:大於或等於
==:等於
!=:不等於
2.()的用法
命令替代
語法:
$(command)
例子:
$pwd
/home/user2
$ curdir=$(pwd)
$ echo $curdir
/home/user2
$ cd /tmp
$ pwd
$ cd $curdir
$ pwd
/home/user2
以下的賦值語句:
$ curdir=$(pwd) 或 $ curdir=`pwd`
pwd 的輸出被賦給變量 curdir。
使用- n參數顯示實際在哪一行:
代碼:
[sam@chenwy sam]$ grep -n '^$' myfile
if [ "`/usr/ucb/whoami`" != "root" ]; then
echo "You must be root to run this script!"
exit 1
fi
if [ "${msg}" = "" ] ;then
echo "msg is null"
fi
shell Awk & Sed 正則表達式 強文:
___________________________________
1 >>inputfile
2 i=`cat inputfile|sed ...`
3 if [ $i =2 ]
then
...
fi
4 rm -f inputfile
___________________________________
\ 屏蔽特殊字符
^ 匹配開始位置。
$ 匹配結束位置。
* 匹配前面的子表達式零次或多次。
. 匹配一個位置(例如.$表示最後一個字符)
+ 匹配前面的子表達式一次或多次。
? 匹配前面的子表達式零次或一次。
{n} n是一個非負整數。匹配確定的 n 次。
{n,} n是一個非負整數。至少匹配n 次。
{n,m} m和n均為非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。
[xyz] 匹配所包含的任意一個字符。
[^xyz] 匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。
[a-z] 匹配指定範圍內的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 範圍內的任意小寫字母字符。
[^a-z] 匹配任何不在指定範圍內的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 範圍內的任意字符。
[^$] 對空行
[^.*$] 對匹配行中任意字符串
^.$ 對包括6個字符的行
^.$ 對僅有一個字符的行
^\.[0-9][0-9] 對以一個句點和兩個數字開始的行
[a-zA-Z] 對任意單字符
[0-9]\{2\}-[0-9]\{2\}-[0-9]\{4\} 對日期格式dd-mm-yyyy
[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}對IP位址格式nnn.nnn.nnn.nnn
\d 匹配一個數字字符。等價於 [0-9]。
\D 匹配一個非數字字符。等價於 [^0-9]。
\f 匹配一個換頁符。等價於 \x0c 和 \cL。
\n 匹配一個換行符。等價於 \x0a 和 \cJ。
\r 匹配一個回車符。等價於 \x0d 和 \cM。
\s 匹配任何空白字符,包括空格、制表符、換頁符等等。等價於 [ \f\n\r\t\v]。
\S 匹配任何非空白字符。等價於 [^ \f\n\r\t\v]。
\t 匹配一個制表符。等價於 \x09 和 \cI。
\v 匹配一個垂直制表符。等價於 \x0b 和 \cK。
\w 匹配包括下劃線的任何單詞字符。等價於'[A-Za-z0-9_]'。
\W 匹配任何非單詞字符。等價於 '[^A-Za-z0-9_]'。
Example:列出文件的1-4行;
$cat ifile|sed -n '1,4p' # method 1
$sed -n '1,4p' ifile # method 2
$sed '8,12!d' ifile # method 3
$cat ifile|sed -n '1,4p;40p;45,50p' (列出文件的1-4行,40,45-50行;)
Example:列出包含sf56的行;
$cat ifile|sed -n '/sf56/p'
Example:列出包含sf|56的行(|不是轉義字符);
$cat ifile|sed -n '/sf56/p'
Example:列出以 1. 開頭的行(.為轉義字符);
$cat inputfile|sed -n '/^1\./p'
Example:列出以 1. 開頭的行(.為轉義字符),且刪除該行的最後一個字符;
$cat ifile|sed -n '/^1\./p'|sed 's/.$//'
Example:列出刪除1-3行後的所有行;
$cat ifile|sed '1,3d'
Example:列出刪除第一行的文件;
$cat ifile|sed '$d'
Example:列出刪除最後兩行的文件;
$cat ifile|sed 'N;$!P;$!D;$d'
Example:列出刪除最後10行的文件;
$cat ifile|sed -e :a -e '$d;N;2,10ba' -e 'P;D' # method 1
$cat ifile|sed -n -e :a -e '1,10!{P;N;D;};N;ba' # method 2
Example:列出刪除第3行到最後一行的文件;
$cat ifile|sed '3,$d'
Example:刪除每行開頭的空格或tab符號;
$cat inputfile|sed 's/^[ \t]*//' # see note on '\t' at end of file
Example:刪除每行末尾的空格或tab符號;
$cat inputfile|sed 's/[ \t]*$//' # see note on '\t' at end of file
Example:刪除每行開頭和末尾的空格或tab符號;
$cat inputfile|sed 's/^[ \t]*//;s/[ \t]*$//'
Example:文件中有一行是MYPARAM=123,取得123這個參數值;
$cat ifile|sed '/^MYPARAM= */!d; s///;q'
Example:全局替換sf56為5566;
$cat ifile|sed 's/sf56/5566/g'
Example:列出以4結尾的行;
$cat inputfile|sed -n '/4$/p'
Example:列出以 1-9. 開頭的行;
$cat inputfile|sed -n '/^[1-9]\./p'
Example:列出最後一行;
(print the last line of a file (emulates "tail -1")
$cat inputfile|sed '$!d' # method 1
$cat inputfile|sed -n '$p' # method 2
Example:列出包含sf56或4523的行;
$cat ifile|sed -e '/sf56/b' -e '/4523/b' -e d
Example:替換,全局替換,替換第幾處...
# substitute (find and replace) "foo" with "bar" on each line
sed 's/foo/bar/' # replaces only 1st instance in a line
sed 's/foo/bar/4' # replaces only 4th instance in a line
sed 's/foo/bar/g' # replaces ALL instances in a line
sed 's/\(.*\)foo\(.*foo\)/\1bar\2/' # replace the next-to-last case
sed 's/\(.*\)foo/\1bar/' # replace only the last case
# substitute "foo" with "bar" ONLY for lines which contain "baz"
sed '/baz/s/foo/bar/g'
# substitute "foo" with "bar" EXCEPT for lines which contain "baz"
sed '/baz/!s/foo/bar/g'
Example:將DOS控制字符^M替換掉;
# IN UNIX ENVIRONMENT: convert DOS newlines (CR/LF) to Unix format)
sed 's/^M$//' # in bash/tcsh, press Ctrl-V then Ctrl-M
sed 's/.$//' # assumes that all lines end with CR/LF
sed 's/\x0D$//' # gsed 3.02.80, but top script is easier
# IN UNIX ENVIRONMENT: convert Unix newlines (LF) to DOS format
sed "s/$/`echo -e \\\r`/" # command line under ksh
sed 's/$'"/`echo \\\r`/" # command line under bash
sed "s/$/`echo \\\r`/" # command line under zsh
sed 's/$/\r/' # gsed 3.02.80
# IN DOS ENVIRONMENT: convert Unix newlines (LF) to DOS format
sed "s/$//" # method 1
sed -n p # method 2
# IN DOS ENVIRONMENT: convert DOS newlines (CR/LF) to Unix format
# Cannot be done with DOS versions of sed. Use "tr" instead.
tr -d \r <infile >outfile # GNU tr version 1.22 or higher
Example:刪除文件中的所有空行和由空格組成的行;
$cat ifile|sed '/^$/d'|sed '/^[[:space:]]*$/d' # method 1
$cat ifile|sed -e '/^$/d' -e '/^[[:space:]]*$/d' # method 2
Example:文件中原來有一行hellohellohello,現在每個hello分一行,共3行;
$cat ifile|sed 's/hello/hello@/g'|tr '@' '\n'
(先將hello替換為hello@,然後用tr將@替換為轉義符換行\n;)
Example:變成每5個字符換一行;
$cat ifile|sed 's/\(.\{5,5\}\)/\1@/g' | tr '@' '\n'
[]的用法在sed中表示取[]字符組中的一個字符,而[]中的第一位若是"^",則表示不取後面的任何一個字符。
那麼 [^ /]* 就表示匹配這樣的格式:"由不是空格或"/"的一個或多個字符組成的串.
\([^ /]*\) : 這裡\(.\)的格式,這種格式用在需要替換的源串中,表示用這種符號括注的部分要sed記住,
而且sed會給這個部分自動起個名字叫\1,如果在源串中還有這樣的標記,就依次命名為\2,\3.。
這\1要sed記住什麼呢?是括號裡到\前面的"[^ /]*",這是說"由不是空格或/的一個或多個字符組成的串"。
sed -e的寫法可以使sed連續執行多套命令,例如在一行裡面進行多重替換;
Example:替換".../...=="為"|--...",然後替換".../"為"|",
注意第二步為替換任意多的"由不是空格或/的一個或多個字符組成的串"和"/"替換為僅"|";
$cat ifile|sed -e 's/[^ /]*\/\([^ /]*\) ==/|--\1/g' -e 's/[^ /]*\//| /g'
原來文件:
. /bin == (1kb)
. /bin/sbin/chenFile == (1kb)
. /bin/sbin/shell/dfdf == (1kb)
運行後顯示:
. |--bin (1kb)
. | | |--chenFile (1kb)
. | | | |--dfdf (1kb)
Example:查找當前目錄下的所有子目錄,並顯示其大小;(顯示效果對第一第二列進行調整);
sort -f是要把輸出的結果排序,按字母順序排序,便於使用的人察看。使用-f可以讓sh排序時對大小寫不敏感。
$find . -type d -print | du | awk '{print $2, "== ("$1/2"kb)"}' |sort -f
原來du顯示:
4640 ./cc/sh_frt_unix/src
1136 ./cc/sh_frt_unix/tmp
195352 ./cc/sh_frt_unix
運行後顯示:
./cc/sh_frt_unix/src == (2320kb)
./cc/sh_frt_unix/tmp == (568kb)
./cc/sh_frt_unix == (97676kb)
Example:以上兩個shell結合
$find . -type d -print | du | awk '{print $2, "== ("$1/2"kb)"}' |sort -f|sed -e 's/[^ /]*\/\([^ /]*\) ==/|--\1/g' -e 's/[^ /]*\//| /g'
Example:判斷目錄是否存在;
if [ ! -d $HOME/cc ];then
echo "dir not exist\n"
mkdir -p cc
else
echo "dir exist\n"
fi
*************用正則表達式進行字符串處理(對shell變量)********************
#列出文件中包含sf56的一行,假設結果是1.adfdsf56345345
$i=`cat ifile|sed -n '/sf56/p'`
#從變量i的最左邊開始刪除字符,直到第一個「f」:結果是dsf56345345
$j=${i#*f}
$echo $j
$echo {i##*/} 從變量i的最左邊開始刪除字符,直到最後一個「/」
$echo ${i#*.} 從變量i的最左邊開始刪除字符,直到第一個「.」
$echo ${i##*.} 從變量i的最左邊開始刪除字符,直到最後一個「.」
$echo ${i%/*} 從右部開始拿掉字符,直到遇到(從右部數起的)第一個「/」
$echo ${i%%/*} 從右部開始拿掉字符,直到遇到(從右部數起的)最後一個「/」
$echo ${i%.*} 從右部開始拿掉字符,直到遇到(從右部數起的)第一個「.」
$echo ${i%%.*} 從右部開始拿掉字符,直到遇到(從右部數起的)最後一個「.」
$echo ${i#????} 去掉前面4個字符
$echo ${i%????} 去掉後面4個字符
$echo ${i#*[0-9]} 去掉前面所有的數字字符
$echo ${i#1.a} 去掉前面的字符"1.a"
$str=20041012
$echo $str|cut -c 1-4 取前面4個字符;
$echo $str|cut -c 5-7 取5-7個字符; (---Sed是基於行處理的,而進一步處理用cut--)
$i=`cat ifile|sed '/abc/='` #獲得abc所在行的行號;
$cat ifile|sed -n '1,3p' #顯示1-3行;
$cat ifile|sed -n '/abc/p' #顯示包含abc的行;
$cat ifile|sed '5,$d' #刪除5-最後一行;
$cat ifile|sed '/abc/d' #刪除包含abc的行;
$cat ifile|sed 's/^.//g' #刪除第一個字符;
$cat ifile|sed 's/.$//g' #刪除最後一個字符;
$cat ifile|sed 's/abc/ABC/g' #全局替換;
**** 一個自動ftp的shell **************************************
F="myftp"
#如果提供了參數則上傳參數文件,否則上傳所有文件;
toputfile=${1:-*}
echo "open 144.4.0.202 21" > $F
echo "user dpdb_trs dpdb_trs" >> $F
#二進位傳輸;
echo "bin" >> $F
echo "cd cc/sbin" >> $F
echo "mput $toputfile" >> $F
echo "bye" >> $F
ftp -i -in < $F
rm -rf $F
**************************************************************
*******一個定時Job的寫法(by crontab)**************************
Backup.sh文件:
# Delete job;
crontab -r
#Add job;
crontab backup_cron
#List now job;
crontab -l
backup_cron文件:
#執行某個Shell at everyday 2:00 am
0 2 * * * /$HOME/my_unix/sbin/backup.sh
#執行某個Shell at every 1st of month
0 2 1 * * /$HOME/myt_unix/sbin/backup_cleanMon34.sh
**************************************************************
if [ 某條件 ]; then
some statement
fi
有的腳本用
if [[ 某條件 ]]; then
smoe statement
fi
---[[]]支持通配符,不同的shell會支持不一樣的.bounse shell 應該不支持[[ ]],ksh [[ ]]應該支持
一般情況下,$var 與 ${var} 並沒有啥不一樣。
但是用 ${ } 會比較精確的界定變量名稱的範圍,比方說:
$ A=B
$ echo $AB
原本是打算先將 $A 的結果替換出來,然後再補一個 B 字母於其後,
但在命令行上,真正的結果卻是只會提換變量名稱為 AB 的值出來。若使用 ${ } 就沒問題了。
UNIX | SED
+----
cat | sed ':'
cat -s | sed '/./,/^$/!d'
tac | sed '1!G;h;$!d'
grep | sed '/patt/!d'
grep -v | sed '/patt/d'
head | sed '10q'
head -1 | sed 'q'
tail | sed -e ':a' -e '$q;N;11,$D;ba'
tail -1 | sed '$!d'
tail -f | sed -u '/./!d'
cut -c 10 | sed 's/\(.\)\{10\}.*/\1/'
cut -d: -f4 | sed 's/\(\([^:]*\):\)\{4\}.*/\2/'
tr A-Z a-z | sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'
tr a-z A-Z | sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'
tr -s ' ' | sed 's/ \+/ /g'
tr -d '\012' | sed 'H;$!d;g;s/\n//g'
wc -l | sed -n '$='
uniq | sed 'N;/^\(.*\)\n\1$/!P;D'
rev | sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'
basename | sed 's,.*/,,'
dirname | sed 's,[^/]*$,,'
xargs | sed -e ':a' -e '$!N;s/\n/ /;ta'
paste -sd: | sed -e ':a' -e '$!N;s/\n/:/;ta'
cat -n | sed '=' | sed '$!N;s/\n/ /'
grep -n | sed -n '/patt/{=;p;}' | sed '$!N;s/\n/:/'
2 嘗試在at裡面套at,
$at 9.00am tomorrow -f /usr/abc/abc.sh
3 at -l
atrm job 3
4 nohup abc.sh >>abc.log 2>&1 & (後臺運行並重定向)
7 if [ $1 =0 ]
then
...
elif [ $1 = 1 ]
then
....
else
....
fi
8 if [ ! -w "abc.txt" ];then
echo "can't write"
fi #test if can write
9 if [ ! -d /abc/def ];then
10 if [ -z $APP_DIR ] || [ "$APP_DIR" = "" ];then
echo "environment variable not set"
export APP_DIR=/dev/abc;
fi
11 du -s 顯示每個目錄佔用硬碟大小,結果為塊,如128,表示128塊,每塊512位元組;
df -k 顯示磁碟佔用情況;
12 head -2 ifile 顯示文件的前兩行;
13 cp -r 拷貝目錄以及子目錄;
14 rm -rf 刪除目錄以及文件;
Shell腳本例子:
自動Ping遠端地址:
###############################################
### myping ###
### author:Mainz ###
### 2004.11.29 ###
### line.txt – ServerName 192.168.26.15 ###
###############################################
loop=1
while read LINE
do
echo "${loop}. `echo ${LINE}|awk '{print $1}'`"
ping -q -c 1 -w 2 `echo ${LINE}|awk '{print $2}'` 2 > /dev/null
if [ $? = 0 ];then
echo "---OK"
else
echo "--- XX"
fi
loop=`expr ${loop} + 1`
done < line.txt