shell學習筆記【原創】

1.       描述,shellunix/linux下強勁的腳本工具,對提高我們的工作效率很有好處,這是學習過程中的一些筆記,(整理的很垃圾,汗~~)。C++實驗室(http://www.ctag.cn)原創,轉載請保留。

2.       shell簡介(2005-11-22 morning)

a)         3種主流shellbourne shell, c shell, korn shell

b)        查看所有shell/etc/shell

c)        系統啓動->init進程->/bin/login->設置HOME,SHELL,USER環境變量及PATH

d)        shelllogin中繼承大量的環境變量,io流及進程特性

e)         umask值一般爲0022,如創建目錄缺省權限爲777,創建後減去0022755

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緊接一個az的字符串

                      iii.              /ove[^a-zA-Z0-9]/      ove緊接如標點的字符串

                     iv.              //<f.*th/>/         f開頭,跟0個或多個任意字符(.*)th結尾的字符串

                       v.              1,$ s//([Oo]ccur/)ence//1rence/   替換O/occurenceO/occurrence

                     vi.              s //(square/) and /(fair/) //2 and /1/     調換squarefair位置

4.       grep家族;好處是不用啓動編輯器,比exvi

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                     搜索含aaabbb

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                               刪除13行並輸出

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的行,在下一行匹配aaaabbbb

ee)      sed ‘1,3y/ abcdefghijklmnopqrstuvwxyz/ ABCDEFGHIJKLMNOPQRSTUVXYZ/’ file

ff)       13行的小寫字母改爲大寫

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                        如果34字段乘積大於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導出變量可用於子shellset所有環境變量(局部和全局),env只顯示全局,unset復位局部或全局變量,readonly保護變量

j)          展開修飾符:${variable:-word}無則代入值,${variable:=word}無則代入並設置值到變量,${variable:+word}有則代入值,${variable:?word}有則代入無則退出腳本

k)        位置參量:

 

變量

描述

 

$0

Shell腳本名

 

$1-$9

19個位置的參量

 

$#

參數個數

 

$*

所有參數

 

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’ 22ctrlc則殺掉進程

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進程(打開終端端口,提供stdinstdoutstderr,登陸符)

  à執行/bin/login:輸入口令,加密並驗證,設置出世環境,

啓動用戶登陸的shell(即/bin/bash

                              àbash過程:執行/etc/profile,執行用戶的.bash_profile

執行用戶的.bashrc,執行/etc/bashrc.bashrc每個僞終端都會執行)

                              à.bash_logout註銷(登出shell時執行)

b)        一個進程的環境包括:變量,打開的文件,目錄,信號

c)        設置PATH環境變量在.bash_profile文件中,系統及的函數和別名在/etc/bashrc中設置,如PS1PS2

d)        mesg命令可控制其他程序寫終端,默認爲ystty設置ttyset 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 –rhash vi

i)          sourcedot命令,後者是前者的別名

j)          命令處理順序:別名à關鍵字(if/while/utilà函數à內置命令à可執行體和腳本

k)        type命令查找命令的類型是內置命令還是函數或可執行體

l)          enable列出所有的內置命令

m)      退出狀態:$?unix習慣爲0

n)        多條命令(ls; pwd; date) > file1

o)        作業控制:ctrlz調入後臺,jobs顯示所有作業,fg %1調入前臺

p)        別名:alias ls=’ls –colorztty’,刪除別名用unalias

q)        目錄棧:pushdpopddirs

r)         元字符:?,*,[abc],[!abc],$,;,&等,例子:

ls *; ls f{a,b,c}

s)         定義變量aaavaluedeclare 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重定向(增加>&表示stdoutstderr),exec兼容bourne shell

ff)       here文檔兼容bourne shellset設置shell選項和shopt兼容bourne shell

gg)     內置命令大部分兼容bourne shellenable顯示所有內置命令

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上午 深圳南山科技園

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章