1. 描述,shell是unix/linux下強勁的腳本工具,對提高我們的工作效率很有好處,這是學習過程中的一些筆記,(整理的很垃圾,汗~~)。C++實驗室(http://www.ctag.cn)原創,轉載請保留。
2. shell簡介(2005-11-22 morning)
a) 3種主流shell:bourne shell, c shell, korn shell
b) 查看所有shell:/etc/shell
c) 系統啓動->init進程->/bin/login->設置HOME,SHELL,USER環境變量及PATH
d) shell從login中繼承大量的環境變量,io流及進程特性
e) umask值一般爲0022,如創建目錄缺省權限爲777,創建後減去0022爲755
f) u用戶,g組,go其他組,a所有
g) 如cd的命令是嵌入到shell中的
3. 正則表達式
a) 例子(vi中): 1,$ s//<[Tt]om/>/David/g g是全程操作標識
b) ^,$行首位脫字符
c) .,*匹配1個,或0個以上字符
d) []匹配一組字符中一個
e) [x-y]匹配範圍中一個
f) [^]匹配不再組內的字符
g) /轉義
h) /<,/>,單詞定界符,單詞的查找和一般的字符串查找不同
i) /(../)標籤
j) x/{m,n/}重複的x
k) 例子(以下均在vi中):
i. /o*ve 匹配0個以上o開頭緊接ve字符串
ii. /ove[a-z] ove緊接一個a到z的字符串
iii. /ove[^a-zA-Z0-9]/ ove緊接如標點的字符串
iv. //<f.*th/>/ f開頭,跟0個或多個任意字符(.*)th結尾的字符串
v. 1,$ s//([Oo]ccur/)ence//1rence/ 替換O/occurence爲O/occurrence
vi. s //(square/) and /(fair/) //2 and /1/ 調換square和fair位置
4. grep家族;好處是不用啓動編輯器,比ex和vi快
a) 元字符:^,$,.,*,[],[^],/<,/>,/(../),x/{m,n/}
b) grep重要選項:c顯示行號,h不顯示文件名,i忽略大小寫,l只顯示文件名,n顯示行號,v顯示不匹配的,w搜索單詞
c) grep ‘root’ /etc/passwd,返回值在$?變量,成功爲0,未找到爲1,失敗爲2
d) 例子:grep abc d*
e) grep ‘[^0-9]’ datafile
f) grep ‘/<north’ datafile 以north開頭的單詞,/<是詞首定位符號
g) grep ‘/<north/>’ datafile
h) ls –l | grep ‘^d’ 所有文件夾顯示
i) grep –n ‘south’ datafile
j) grep –I ‘pat’ datafile
k) grep –v ‘aaa’ datafile > temp; mv temp datafile 刪除含aaa的行
l) grep –c ‘west’ datafile
m) egrep ‘aaa|bbb’ datafile 搜索含aaa或bbb行
5. sed
a) sed是一個精簡的非交互式編輯器,沒有破壞性。
b) 原理:將文件讀取一行,放到模式空間(一個緩衝區),處理,然後輸出到屏幕,再讀取下一行,重複之
c) 格式:sed ‘command’ filename
d) 命令:a/追加,c/替換,d刪除,i/插入,h拷貝到緩衝區,H替換緩衝區,g取出緩衝替換當前,G取出緩衝追加當前,p打印,n讀取下一行,q結束,r讀取文件,!不匹配的行,s替換,g全程操作,p打印,w寫入,x交換,y替換字符
e) sed選項:-e多項編輯,-f指定文件,-n取消缺省輸出
f) sed返回值,$?值:成功爲0,失敗其他
g) 元字符:和grep相同
h) 例子:
i) sed ‘1,3d’ file 刪除1到3行並輸出
j) sed ‘/Tom/d’ file 刪除含tom的行
k) sed ‘/Tom/!d’ file 刪除不含tom的行
l) sed ‘/north/p’ file 含north的行打印2遍
m) sed –n ‘/north/p’ file 含north的行打印1遍
n) sed ‘3d’ file 刪除第3行
o) sed ‘3,$d’ file
p) sed ‘$d’ file
q) sed ‘/north/d’ file
r) sed ‘s/west/north/g’ file 替換
s) sed –n ‘s/west/north/g’ file 只打印替換的項
t) sed ‘s/[0-9][0-9]$/&.5/’ file 以2個數字結尾的加上.5
u) sed –n ‘s/aaa/bbb/gp’ file 全程替換並打印
v) sed –n ‘/west/,/east/p’ file 打印west開始,直到有east的行
w) sed –n ‘5,/^north/p’ file 從5行打印直到有north開頭的行
x) sed ‘/west/,/east/s/$/**AAAA**/’ file
y) sed –e ‘1,3d’ –e ‘s/aaa/bbb/’ file
z) sed ‘/aaaa/r file2’ file1 找到aaaa就讀file2
aa) sed –n ‘/aaaa/w file2’ file1 匹配aaaa的行寫到file2
bb) sed ‘/aaaa/a//bbbb’ file 再aaaa行後追加bbbb新行(可接多行)
cc) sed ‘/aaaa/i//bbbb’ file 插入新行再前面行
dd) sed ‘/east/{n; s/aaaa/bbbb/;}’ file 找到east的行,在下一行匹配aaaa爲bbbb
ee) sed ‘1,3y/ abcdefghijklmnopqrstuvwxyz/ ABCDEFGHIJKLMNOPQRSTUVXYZ/’ file
ff) 1到3行的小寫字母改爲大寫
gg) sed ‘5q’ file 打印5行就撤
hh) sed ‘/aaaa/{s/aaaa/bbbb/;q;}’ file 換完就撤
ii) sed –e ‘/aaaa/h’ –e ‘$G’ file aaa行緩存並最後打印
jj) sed –e ‘/aaaa/h’ –e ‘$g’ file
kk) sed腳本例子:
ll) 例1
#sed example1
/aaaa/a/
dsafdsafdsafdsafsd/
safdsafsdafdsafds/
fdsafdsafdsafdsafs
/bbbb/c/
***********
fdsafdsafdsafds
***********
li/
fdsafdsafdsafdsfds/
---------
$d
mm) 例2
/aaaa/,/bbbb/,{
/^ *$/d
/cccc/{h;d;}
}
/eeee/g
s/TB /(hhhh/)/iiii /1/
6. awk
a) awk用途:處理數據和生成報告的編程語言
b) 命令格式:awk ‘pattern’ filename
awk ‘{action}’ filename
awk ‘pattern {action}’ filename
command | awk ‘pattern’
command | awk ‘{action}’
command | awk ‘pattern {action}’
c) print打印,printf格式化打印
d) awk實例:
e) awk ‘/aaaa/’ file
f) awk ‘{print $1}’ file $1表示字段1,$0表示整個記錄
g) awk ‘/aaaa/{print $1, $2}’ file
h) df | awk ‘$4 > 75000’
i) rusers | awk ‘/root$/{print $1}’
j) date | awk ‘{print “month: $2 “/nyear: “, $6}’
k) awk ‘/aaaa/{print “/t/t have a nict day,” $1, $2 “/!”}’ file
l) echo “unix” | awk ‘{printf “%-15s/n”, $1}’
m) awk ‘{printf “the name is: %-15s id is %8d/n”, $1, $3}’ file
print自動換行,printf手動換行加上/n,%-15s左對齊
n) awk文件:/^root/{print “hello, world”}
{print $1, $2, $3}
調用:awk –f awkfile file1
o) $0整個記錄,NR當前記錄號,NF當前記錄的字段數
p) 字段分隔符的一個例子:
q) nawk –f ‘[ :/t]’ ‘{print $1, $2, $3}’ file1
r) 正則支持同egrep
s) ~匹配記錄字段,如:
t) awk ‘$1 ~ /[bB]ill/’ file1
u) !~不匹配,如:awk ‘$1 !~ /aaa$/’ file1 顯示不以aaa結尾的記錄
7. awk編程結構
a) 表達式支持
|
表達式 |
含義 |
|
< |
|
|
<= |
|
|
== |
|
|
!= |
|
|
>= |
|
|
> |
|
|
~ |
匹配正則 |
|
!` |
不匹配正則 |
|
a?b:c |
If a is true, return b, else return c |
|
&& |
邏輯與 |
|
|| |
邏輯或 |
|
! |
邏輯非 |
b) 實例:
c) awk ‘$3 == 3456’ file
d) awk ‘$3 > 5000{print $1}’ file
e) awk ‘$2 ~ /aaaa/’ file
f) awk ‘$2 !~ /aaaa/’ file
g) awk ‘{max=($1 > $2)?$1:$2; print max}’ file1
h) awk ‘$3 * $4 > 500’ file 如果3,4字段乘積大於400則打印整個記錄
i) awk ‘$3 == 100 || $4 > 50’ file
j) awk ‘!($2 <100 && $3<20)’ file
k) awk ‘/aaaa/,/bbbb/’ file 範圍模式
8. awk編程,本章有些複雜,只是看懂了,懶得作筆記,^_^,(2005-11-23)
9. bourne shell概念
a) 啓動:initàgettyà/bin/loginà初始化環境àshell(/bin/sh)
b) shell過程:執行/etc/profileà/~/.profileà接收用戶命令
c) /~/.profile(linux爲.bash_profile)常用於定製&修改shell環境,啓動程序或數據庫等
d) 常用的環境變量:
|
變量 |
描述 |
|
PS1 |
主提示符 |
|
PS2 |
次提示符 |
|
PATH |
|
|
$? |
返回值(unix慣例爲0) |
|
$! |
最後一個作業進程id |
e) hash命令:路徑hash表控制,hash –r清空hash表
f) dot命令執行shell腳本,如:. Myscript
g) 命令編組:例子(ls; pwd; date) > file1
h) 元字符:/轉義,&後臺處理,;分隔命令,$替換變量,?匹配單字符,[abc]匹配其中一個字符,[!abc] 匹配非其中字符,*匹配0或多個字符
i) 環境變量:export導出變量可用於子shell,set所有環境變量(局部和全局),env只顯示全局,unset復位局部或全局變量,readonly保護變量
j) 展開修飾符:${variable:-word}無則代入值,${variable:=word}無則代入並設置值到變量,${variable:+word}有則代入值,${variable:?word}有則代入無則退出腳本
k) 位置參量:
|
變量 |
描述 |
|
$0 |
Shell腳本名 |
|
$1-$9 |
1到9個位置的參量 |
|
$# |
參數個數 |
|
$* |
所有參數 |
l) 函數:function_name(){commands; commands;}注意最後分號
m) io重定向
|
變量 |
描述 |
|
< |
|
|
> |
|
|
>> |
追加 |
|
2> |
錯誤重定向 |
|
2>&1 |
錯誤重定向輸出 |
n) here文檔與重定向輸入:cat << FINISH
>*****************
>*****************
>*****************
>FINISH
o) shell編程格式:第一行#!/bin/sh指定shell
p) echo 自動換行
q) 算術運算:+-*/%
r) 修飾符“:?”檢查$1是否有值,無則打印指定信息並退出,例子:
s) name=${1:?”requires an argument} 在shell腳本中使用
t) *@意義,如:set ‘aaa bbb’ ccc ddd
for i in “$@” 解釋爲3個參數,無引號解釋爲4個參數
u) st命令或[](說明:方括號和等號兩側要求空格)
v) 測試運算符:-z sring字符串長度爲0;-n string字符串長度不爲0
-d filename目錄存在;-f filename文件存在
=字符串相等;!=不等
w) exit退出shell腳本
x) 流程控制:if/else/then/elif/
case/in/value/;;/esac/
for/in/do/done
while [command] do commands done
until [command] do commands done
shift左移位置參量
set設置位置參量
continue循環下一個, break退出循環
y) 例子:for person in ‘cat user_table_file’
do
mail $person < letter_file
echo $person was sent a letter
done
echo “all mail send ok”
z) 例子:while true; do
read aaa
if [“$aaa” = y –o “$aaa” = Y ]
then
break
if
done
aa) shell判斷優先級:內置命令à函數à可執行程序
bb) 函數不能向子shell輸出
cc) 陷阱trap和變量一樣,函數中有陷阱會被整個shell共享
dd) 經典陷阱例子:trap ‘rm tmp*; exit 1’ 1 2 15掛起或信號則刪除臨時文件
trap ‘trap 2’ 2按2次ctrl+c則殺掉進程
ee) getopts處理命令行選項
ff) shell內置命令:
gg) break,continue,eval,exec,exit,hash,export,kill,login,pwd,read,readonly,return,set,shift,stop pid,suspend,times,trap,type,umask,unset,wait,umask
hh) history顯示歷史
10. bash shell
a) bash啓動:àinit進程(PID=1)
à派生getty進程(打開終端端口,提供stdin,stdout,stderr,登陸符)
à執行/bin/login:輸入口令,加密並驗證,設置出世環境,
啓動用戶登陸的shell(即/bin/bash)
àbash過程:執行/etc/profile,執行用戶的.bash_profile,
執行用戶的.bashrc,執行/etc/bashrc(.bashrc每個僞終端都會執行)
à.bash_logout註銷(登出shell時執行)
b) 一個進程的環境包括:變量,打開的文件,目錄,信號
c) 設置PATH環境變量在.bash_profile文件中,系統及的函數和別名在/etc/bashrc中設置,如PS1和PS2
d) mesg命令可控制其他程序寫終端,默認爲y;stty設置tty(set tty)
e) set –o列出shell選項;如:set –o history打開歷史記錄;set +o history關閉
f) 更多的shell選項用shopt命令,shopt –s打開,shopt –u關閉
g) 主次提示符:PS1,PS2(可以參考上面的說明)例如:大寫w換小寫顯示全路徑
h) hash命令,見上面描述(hash –r;hash vi)
i) source和dot命令,後者是前者的別名
j) 命令處理順序:別名à關鍵字(if/while/util)à函數à內置命令à可執行體和腳本
k) type命令查找命令的類型是內置命令還是函數或可執行體
l) enable列出所有的內置命令
m) 退出狀態:$?,unix習慣爲0
n) 多條命令(ls; pwd; date) > file1
o) 作業控制:ctrl+z調入後臺,jobs顯示所有作業,fg %1調入前臺
p) 別名:alias ls=’ls –colorztty’,刪除別名用unalias
q) 目錄棧:pushd,popd,dirs
r) 元字符:?,*,[abc],[!abc],$,;,&等,例子:
ls *; ls f{a,b,c}
s) 定義變量aaa=value或declare aaa=value
t) 顯示或導出環境變量用export,(刪除用unset)比較重要的環境變量:
HOME,LANG,LC_ALL,PS1,PS2,PWD,PATH等
u) bash支持的printf如同c語言
v) 變量展開修飾符:兼容9節(bourne shell)的i小節,另外支持
{variable:offset}, {variable:offset:length}
w) 子串的變量擴展:
x) ${變量%模式} 變量尾部最小匹配,刪除匹配
y) ${變量%%模式} 變量尾部最大匹配,刪除匹配
z) ${變量#模式} 變量頭部最小匹配,刪除匹配
aa) ${變量##模式} 變量頭部最大匹配,刪除匹配
bb) ${#變量}
cc) 位置參量,引用:兼容bourne shell,略
dd) 算術運算:格式$[expression]或$((expression))
ee) 函數,io重定向(增加>&表示stdout和stderr),exec兼容bourne shell
ff) here文檔兼容bourne shell,set設置shell選項和shopt兼容bourne shell
gg) 內置命令大部分兼容bourne shell,enable顯示所有內置命令
11. bash shell編程(2005-11-24)基本上兼容bourne shell,新支持:
[]字符串測試或文件測試,[[]]邏輯測試;其他略
12. unix常用命令:
|
函數 |
描述 |
|
at |
|
|
awk |
|
|
basename |
|
|
bc |
|
|
cal |
|
|
cat |
|
|
chmod |
|
|
chown |
|
|
clear |
|
|
cmp |
|
|
compress/uncompress |
|
|
cp |
|
|
cut |
|
|
date |
|
|
diff |
unix比較格式 |
|
du |
|
|
echo |
|
|
expr |
|
|
grep/egrep/fgrep |
|
|
file |
|
|
find |
|
|
finger |
|
|
fmt |
|
|
fold |
|
|
ftp |
|
|
getopts |
|
|
group |
|
|
id |
|
|
logname |
|
|
lp/lpr |
|
|
lpq |
|
|
ls |
|
|
mesg |
|
|
mkdir |
|
|
more |
|
|
mv |
|
|
newgrp |
|
|
nice |
|
|
nohup |
|
|
od |
|
|
pack/unpack |
|
|
passwd |
|
|
paste |
|
|
ps |
|
|
pwd |
|
|
rcp |
|
|
rlogin |
|
|
rm |
|
|
rmdir |
|
|
rsh |
|
|
rwho |
|
|
sed |
|
|
size |
|
|
sleep |
|
|
sort |
|
|
split |
split –1000 file |
|
stty/tty |
|
|
su |
|
|
sum/md5sum |
|
|
tail |
|
|
tar |
|
|
telnet |
|
|
test |
|
|
time |
|
|
umask |
|
|
uname |
|
|
wc |
|
|
which |
|
|
whereis |
|
|
who |
|
|
write |
|
13. 2005-11-24上午 深圳南山科技園