linux shell编程控制结构:expr、let、for、while、until、shift、if、case、break、continue、函数、select 学习笔记
SHELL編程一UNIX和Shell工具簡介
什么是shell?
shell只是一個程序,它在系統(tǒng)中沒有特權。因此,有多個不同風格shell共同存在原因——Bourne Shell,Korn Shell,C Shell。
在shell輸入命令,先分析用戶鍵入的每個命令,然后為執(zhí)行程序作初始化。
Shell有自己的內(nèi)部程序設計語言,這種語言是解釋型的,shell用這種語言解釋命令行的每一條語句,然后執(zhí)行。
C等編譯型語言,一般是先編譯成可執(zhí)行文件再執(zhí)行。
1)正規(guī)表達式
. 匹配任意字符
ed files, ed 編輯命令
^contents 匹配行首符號
contents$ 匹配文件尾
[...] 匹配[]內(nèi)的字符之一
* 配額0個或多個任意字符
\{...\}:x\{...\}匹配精確數(shù)目的字符串
...: 保存匹配的字符串
2)cut
cut -cN file
cut -dchar -fN file
??? char是分割符
N 從第1 個開始數(shù)的第N 個字節(jié)、字符或域
???? N- 從第N 個開始到所在行結束的所有字符、字節(jié)或域
???? N-M 從第N 個開始到第M 個之間(包括第M 個)的所有字符、字節(jié)或域
???? -M 從第1 個開始到第M 個之間(包括第M 個)的所有字符、字節(jié)或域
3)paste命令
paste file1 file2 file3 ,將三個文件的內(nèi)容連接起來,直接在對應的每一行后連接而不是在第一個文件末尾連接
paste -d‘char’ file1,file2
?????? -d是 可選參數(shù),文件連接的時候的默認分隔符是制表符,我們可以用-d來設定我們想要的字符,其中char的單引號最好是有,沒大部分情況也是行的。
paste -d'char' -s file,-s告訴paste把同一個文件file的行用char連在一起
4)sed 用來編輯數(shù)據(jù)的程序,指的是流編輯器,與ed的區(qū)別是其不能用于交互
?sed 's/char1/char2/d' file,將file里面的每一個char1替換成char2,只有s的話只會將每行的第一個char2替換,加上g會將所有的char2替換
?sed -n '1,2p' file,選項-n表示沒有顯式要求的話不顯示任意一行,顯式指定用p命令來實現(xiàn),該命令表示輸出file的1-2行
?sed -n '/char/p' file,顯示包含單詞char的行
?sed ‘1,2d’file,刪除file文件的1-2行
5)tr 過濾器tr用于轉(zhuǎn)換來自標準輸入的字符
?tr from-chars to-chars,from-chars 和to-chars都是一個或多個字符,輸入的任意在from-chars的字符轉(zhuǎn)換成to-chars中的字符
?tr a b < file, 將file中的a全部轉(zhuǎn)成b
?tr '[a-z]' '[A-Z]' < file, 小寫都換成大寫
?tr -s ':' ' ' < file,假設有連續(xù)的多個:,假如沒有-s,那么出來的結果將會是壓縮成一個' '。
?tr -d ':' < file ,刪除輸入流中的:
6)grep 可以搜索一個或多個文件中特定的字符串模式
?grep char files
?grep -v char file 顯示不包含char的行
?grep -l char * ,顯示包含char的文件名
?grep -n char file, 顯示行號
7)sort? 對輸入文件的每一行排序,默認升序
?-u 去掉重復行
?-r 降序排列
?-o,輸出重定向,跟>很像,區(qū)別在于-o可以重定向為同一個文件,而>不行
?-n,按算術方法排序
8)uniq 查找并消除連續(xù)重復行
?uniq file1
?uniq file1 file2
?uniq file -d,輸出連續(xù)重復的行
?uniq file -c,輸出每行出現(xiàn)的次數(shù)
一、基礎知識
Shell提供一個到UNIX系統(tǒng)的接口,它收集用戶輸入并根據(jù)輸入執(zhí)行程序,并顯示程序的輸出。有時被叫做命令解釋器。
1、命令:簡單命令、復雜命令(帶參數(shù))、復合命令(分號隔開,如:who; ll)。
2、Shell類型:Bourne Shell(包括sh, ksh, bash)和C Shell(包括csh, tcsh)。
3、模式:交互式和非交互式。
?????? 交互式啟動:$/bin/sh 退出:exit
?????? 非交互式啟動:$/bin/sh filename
4、初始化文件 /etc/profile
?????? 使用的終端類型:TERM=vt100
?????? 定位命令列表:PATH=/bin:/usr/bin
?????? 定位命令幫助列表:MANPATH=/usr/man:/usr/share/man
5、執(zhí)行 chmod a+x ./logins 例,內(nèi)容為:
?????? #!/bin/sh?????????????? 位于第一行,而在其他行時#開頭為注
?????? who;ls;
6、文件操作:
?????? ls –aF;???? cat filename;??????? wc filename; cp -i source destination;???????
mv –i source destination;?????? rm files;
7、目錄操作:
?????? pwd;????? cd directory;????????? mkdir directory;??????????? cp - r source destination;??????
?????? mv source destination;????????? rmdir;??????????? rm –r;
8、文件屬性操作:
?????? 符號鏈(相當于快捷方式或別名)創(chuàng)建:ln –s source destination
?????? 管道
?????? chmod expression files; (r,w,x,o; 4讀,2寫,1執(zhí)行)???????????
chown改變一個文件的所有權;? chown options user:group files
chgrp options group files
9、進程
?????? 前臺進程,后臺進程。啟動后臺進程在命令后面添加&。
?????? 前移后:ctrl+z. 后移前:fg. 使后臺進程持續(xù)運行:nohup
?????? jobs(顯示懸掛的及正在后臺運行的進程)???????? ps(正在運行的所有進程)??????????? kill
SHELL編程二
二、編程
1、變量
?????? 定義:name=value (使用帶空格的值時加引號)
?????? 訪問:$name
?例:FRUIT=apple??? $echo $FRUIT(結果為apple)?????? $echo FRUIT(結果為FRUIT)
Bourne Shell只支持標量,Korn Shell中支持數(shù)組。
數(shù)組創(chuàng)建: name[index]=value????????? 數(shù)組訪問:${name[index]}
只讀變量:readonly name
刪除變量:unset name
局部變量(只在當前SHELL實例中存在),環(huán)境變量(SHELL任何子進程都能使用),SHELL變量(正確運行所必需,如PWD,PATH,HOME等)。
導出環(huán)境變量:export name
2、替換
(1)文件名替換通配符:*(匹配0個或多個)、?(匹配1個存在的任何字符)、[characters]。
匹配給出的字符,例ls test[0123456789].sql或ls test[0-9].sql 。匹配所有以字母或數(shù)字結尾的文件:ls *[a-z A-Z 0-9]。
否定一個集合:如列出所有除a開頭的文件,ls [!a]*。
?????? (2)變量替換:
?????? ${parameter:-word}????? 若parameter為空或未設置,則用word代替,parameter值不變
?????? ${parameter:=word}????? 若parameter為空或未設置,則parameter設為值word
?????? ${parameter:?message}???????? 若parameter為空或未設置,則message作為標準錯誤打印
?????? ${parameter:+word}????? 若parameter設置了,則用word代替,parameter值不變
?????? (3)命令和算術替換
????????????? 例:DATE=’date’??????????????? UP=’date; uptime’
???????????????????? foo:$((5+3)/2)
3、引用:關掉一個字符的特殊意義。
?????? 三種方式:/(關掉某個),’(關掉全部),”(關掉部份)。
?????? 例:echo Hello /; world??????? 輸出 Hello ; world
????????????? echo ‘<125.**>;(update)’???? 輸出<125.**>;(update)
????????????? 雙引號未關掉:$用于參數(shù)替換,后引號 ’用于命令替換,”, /。
4、流控制
?????? (1)if語法:if? list1
??????????????????????????? then??????? list2
??????????????????????????? elif????????? list3
??????????????????????????? then?????? list4
??????????????????????????? else???????? list5
??????????????????????????? fi
???????????????????? 其中elif和else可選。
?????? 例:#!/bin/sh
????????????? Fruit=apple
????????????? F=b
????????????? if $Fruit>$F;
????????????? then echo $Fruit
????????????? else echo $F
????????????? fi
?????? 使用test:test expression,可用文件測試、字符串比較、數(shù)字比較。
?????? (2)case語法:case? word? in
????????????????????????????????????????? pattern1)??????? list1? ;;
????????????????????????????????????????? Pattern2)??????? list2? ;;
?????????????????????????????????? esac
?????????????????????????????????? 其中;;類似于break。
????????????? 例:#!/bin/sh
???????????????????? Fruit=apple
???????????????????? case “$Fruit” in
?????????????????????????????????? apple) echo “I like apple.” ;;
?????????????????????????????????? banana) echo “banana” ;;
???????????????????? esac
???????????????????? 運行后輸出I like apple.
?????? 條件可以運前之前學習的進行組合出復雜表達式。
5、循環(huán)
?????? (1)while語法:while command
?????????????????????????????????? do? list
?????????????????????????????????? done
?????? 例:輸出1~10。
#!/bin/sh
????????????? x=1
????????????? while [ $x –le 10 ]
????????????? do
??????????????????????????? echo $x
??????????????????????????? x=$(($x+1))
????????????? done
????????????? 還可以進行嵌套。
?????? (2)until語法:until command
?????????????????????????????????? do?? list
?????????????????????????????????? done
?????? (3)for語法:for name in word1 word2…wordN
????????????????????????????? do????? list
????????????????????????????? done
例:輸出1~10。
#!/bin/sh
????????????? x=1
????????????? for x? in 1 2 3 4 5 6 7 8 9 10
????????????? do
??????????????????????????? echo $x
????????????? done
?????? (4)select語法:select name in word1 word2…wordN
????????????????????????????????? do??? list
????????????????????????????????? done
?
(5)break和continue。
6、參數(shù)(有些地方不明白)
?????? 處理參數(shù)和選項采用如下方法:使用case語句手工處理參數(shù)和選項,使用getopts處理選項。
?????? (1)特殊變量
?
7、輸入輸出
?????? 1)向終端輸出:echo、printf(格式化輸出,位于/usr/bin中)
?
?????? 2)輸出重定向:
“>”(把輸出的內(nèi)容重定向到指定的文件中)
“>>”(把輸出的內(nèi)容追加到指定的文件尾部)
tee(同時重定向到屏幕和文件)??????? :command | tee file
3)輸入重定向
Command < file,例:Mail?kony.sun@gmail.com?< File_Exam
Command << delimiter
Document
Delimiter
4)讀取用戶輸入
read name?? 直到用戶輸入回車為止。
5)管道
6)重定向到同一個文件
例:ll >file1 >&file2
8、函數(shù)
??? 1)創(chuàng)建和使用
??? name( ) { list; } 例如:ls1( ) { ls –l; }
??????????????????????? cd( ) { chdir ${1:-$HOME }; PSI=” ’pwd’ $” ; export PSI; }
??? 激活:$name
?
??? 2)函數(shù)間協(xié)同工作并共享數(shù)據(jù)
???? 略,P138
9、文本過濾器
??? 1)最常用的有:head, tail, grep, sort, uniq, tr。
??? 2)head格式:head [ -n lines ] files ,其中[ -n lines ]不寫默認查看前10行,帶的話指定前n行。
?????? 組合使用,例檢索5個最常訪問的文件:ls –l ut /home/public_html | head -5
??? 3)tail格式:tail [ -n lines ] files ,其中[ -n lines ]不寫默認查看后10行,帶的話指定后n行。
??? 4)grep格式:grep word file ,例:grep creat test2.sql test.sql
???????????????? grep -i word file ,不考慮大小寫。
????????????????
???????????????? grep -v word file/dir ,不包括該單詞的。
???????????????? grep -n word file ,一起寫出行號。
???????????????? grep -l word dir ,只列出包含它的文件名。
??? 5)tr:將一個集合中的所有字符改變成別一個集合中的字符,也可用于刪除字符集。
????????? tr? ‘set1’? ‘set2’
??? 6)sort:為輸入文件占的行進行分類。
????????? 例統(tǒng)計一個單詞使用了多少次。
?
??? 7)uniq:打印出文件中所有的唯一行。若某行多次,只打一個。
??????????? uniq filename
10、使用正規(guī)表達式過濾文本
1)command ‘script’ filenames
command是awk或sed,script是可以被awk或sed理解的命令清單,filenames表示命令所作用的文件清單。
2)正規(guī)表達式基本構造塊包括:
普通字符:大小寫字母、數(shù)字、字符。
元字符:.、*、[chars]、^、$、/。例:/a.c/匹配如a+c, a-c, abc行。
3)使用sed
/p打印,/d刪除,/s/pattern1/pattern2將2代替1。
例:$sed ‘/0/.[0-9][0-9]$/p’ fruit_prices.txt ,告訴sed打印所有匹配模式/0/.[0-9][0-9]$的行。
11、使用awk過濾文本
編程語言。(見詳解)
12、各種工具
1)eval命令:第二次處理命令行時使用。
2):命令:返回一個完成代碼0,用于指示命令成功完成。
3)type命令:告訴用戶一個指定命令的全路徑。
4)sleep命令:暫停給定秒數(shù),sleep n
5)find命令:檢索,find start-dir options actions,例find / -nme alpha –print
6)xargs命令:從標準輸入接收單詞并將其提供給給定命令作為參數(shù),cat filelist | xargs rm。
7)expr命令:執(zhí)行簡單整數(shù)算術運算,$expr 8/3
8)bc命令:不局限于整數(shù)的算術工具。
9)remsh/rsh/rcmd/remote命令:遠程Shell
SHELL編程三高級主題
1、信號處理
??? 1)信號位于C語言頭文件signal.h中。
2、調(diào)試
3、使用函數(shù)解決問題
1)創(chuàng)建庫
創(chuàng)建Shell函數(shù)庫就像創(chuàng)建Shell腳本,主要區(qū)別是庫只包含函數(shù),而腳本包含函數(shù)和主代碼。
2)使用庫中包含的函數(shù):.file
3)常見函數(shù):printERROR, printWARNING, pringUSAGE, promptRESPONSE, getSpaceFree, getSpaceUsed, getPID, getUID, toUpper, toLower, isSpaceAvailable, isUserRoot。
4、使用Shell腳本解決問題
5、腳本可移植性
1)判斷unix版本:uname
?? 操作系統(tǒng)發(fā)行版本號:uname –rs
?? 硬件類型:uname –m
??? 主機名:uname –n
2)提高可移植性技巧:條件執(zhí)行和抽取。
6、Shell編程疑難解答
shell編程實例:
1、expr計算整數(shù)變量值
格式 :expr arg
例子:計算(2+3)×4的值
1、分步計算,即先計算2+3,再對其和乘4
s=`expr 2 + 3`
expr $s \* 4
2、一步完成計算:
expr? `expr 2 + 3 `? \* 4?
–說明:?
運算符號和參數(shù)之間要有空格分開;?
通配符號(*),在作為乘法運算符時要用\、“”、‘’符號修飾?
–:expr 3 \* 2???????? expr 3 “*” 2?????? expr 3 ‘*’ 2?
?`(反引號)與鍵盤上的~同一個鍵上的符號?
?
[fsy@localhost ~]$ s=`expr 2 + 3`
[fsy@localhost ~]$ echo $s
5
[fsy@localhost ~]$ expr $s \* 4
20
[fsy@localhost ~]$ expr `expr 2 + 3` \* 4
20
[fsy@localhost ~]$ expr 2 \* 3
6
[fsy@localhost ~]$ expr 2 "*" 3
6
[fsy@localhost ~]$ expr 2 '*' 3
6
[fsy@localhost ~]$ expr 2 * 3
expr: 語法錯誤
[fsy@localhost ~]$?
?
2、let命令
格式:let arg1 [arg2 ......]
說明:
與expr命令相比,let命令更簡潔直觀?
?[ ]表示可以有多個參數(shù),arg n (n=1,2…)?
?運算符與操作數(shù)據(jù)之間不必用空格分開,但表達式與表達式之間必須要用空格分開?
當運算符中有<、>、&、|等符號時,同樣需要用引號(單引號、雙引號)或者斜杠來修飾運算符
–例子:計算(2+3)×4的值
[fsy@localhost ~]$ let s=(2+3)*4
[fsy@localhost ~]$ echo $s
20
[fsy@localhost ~]$
3、for語句——坑爹的開始...... 和其他語言的for不同!
對一組參數(shù)進行一個操作?
語法格式:
?
for 變量 in 列表?
do?
命令行(通常用到循環(huán)變量)?
done?
說明:?
–“列表”為存儲了一系列值的列表,隨著循環(huán)的進行,變量從列表中的第一個值依次取到最后一個值;
–do和done之間的命令通常為根據(jù)變量進行處理的一系列命令,這些命令每次循環(huán)都執(zhí)行一次;
–如果“ in 列表”部分省略掉,Bash則認為是“in $@”,即執(zhí)行該程序時通過命令行傳給程序的所有參數(shù)的列表。
例1、自定義列表
#!/bin/bash
for var in one two three four five
??????? do
??????????????? echo ------
??????????????? echo '$var is' $var
??????? done
?
運行輸出:
------
$var is one
------
$var is two
------
$var is three
------
$var is four
------
$var is five
例2、以命令返回值作為列表
#!/bin/bash
for var in `ls`
??????? do
??????????????? echo -----
??????????????? echo $var
??????? done
???????????
運行輸出:
-----
abb
-----
abc
-----
a.out
-----
a.sh
-----
b.sh
-----
hello.c
-----
scripts
-----
例3、命令行參數(shù)指定為列表中的數(shù)值
#!/bin/bash
for var
??????? do
??????????????? echo "It's $var"
??????? done
運行輸出:
[fsy@localhost ~]$ sh c.sh a b c d
It's a
It's b
It's c
It's d
4、while語句
語法格式:
while????? 表達式??
do?
命令行?
done?
說明:?
–while循環(huán)中,只要條件為真,就執(zhí)行do和done之間的循環(huán)命令;
–避免生成死循環(huán)。?
?
例如:
#!/bin/bash
num=1
while [ $num -le 10 ]
do
echo -e "\t the num is $num"
let num=num+1
done
運行輸出:
?the num is 1
?the num is 2
?the num is 3
?the num is 4
?the num is 5
?the num is 6
?the num is 7
?the num is 8
?the num is 9
?the num is 10
?
5、until語句
語法格式:
unitil????? 表達式??
??? do?
命令行?
??? done?
說明:?
–until循環(huán)中,只要條件不為真,就執(zhí)行do和done之間的循環(huán)命令,或者說,在until循環(huán)中,一直執(zhí)行do和done之間的循環(huán)命令,直到條件為真;
–避免生成死循環(huán)。
例:計算1到10的和
#!/bin/bash
sum=0
num=10
until test $num -eq 0
??????? do
??????????????? sum=`expr $sum + $num`
??????????????? num=`expr $num - 1`
??????? done
echo "sum = $sum"
運行輸出
?
sum = 55
6、shift語句
shift語句:將變量的值依次向左傳遞,并形成一組新的參數(shù)值
–例:位置變量當前值為:1=file1 2= file2 3=file3
–??????? 執(zhí)行一次shift后為:1=file2 2=file3
還可以在shift命令中指定位置變量轉(zhuǎn)移的次數(shù)?
–shift n?
?
例:
#!/bin/bash
while [ -n "$*" ]
??????? do
??????????????? echo $1 $2 $3 $4 $5 $6
??????????????? shift
??????? done
運行輸出
[fsy@localhost scripts]$ sh b.sh 1 2 3 4 5 6 7
1 2 3 4 5 6
2 3 4 5 6 7
3 4 5 6 7
4 5 6 7
5 6 7
6 7
7
7、if語句
if 語句的一般形式 :
if?? 條件表達式?
then? #當條件為真時執(zhí)行以下語句?
???????? 命令列表?
else #當條件為假時執(zhí)行以下語句?
???????? 命令列表?
fi?
? if的測試部分利用test命令實現(xiàn),也可以利用一般命令執(zhí)行成功與否來判斷。如果命令正常結束,返回值為0,條件測試為真; 否則返回值不為0,條件測試為假
例:
#!/bin/bash
if test -f "$1"
??????? then
??????? echo "$1 is an ordinary file"
else
??????? echo "$1 is not an ordinary file"
fi
運行輸出:
[fsy@localhost scripts]$ sh c.sh abb
abb is not an ordinary file
[fsy@localhost scripts]$ sh c.sh a.sh
a.sh is an ordinary file
[fsy@localhost scripts]$
8、case語句
?? 取值后面必須為單詞in,每一個模式必須以右括號結束。取值可以為變量或常數(shù)。取值檢測匹配的每一個模式,一旦模式匹配,其間所有命令開始執(zhí)行直至;;。執(zhí)行完匹配模式相應命令后不再繼續(xù)其他模式。如果無一匹配模式,使用*號捕獲該值,再接受其他輸入。
?
[注]?
1.模式字符串中可以使用通配符?
2.如果一個模式字符串中包含多個模式,那么各模式之間應以豎線(|)隔開,表各模式是“或”的關系,即只要給定字符串與其中一個模式相配,就會執(zhí)行其后的命令列表。
3.各模式字符串應是唯一的,不應重復出現(xiàn),并且要合理安排它們的出現(xiàn)順序,例如,不應將“*”作為頭一個模式字符串,因為“*”可以與任何字符串匹配,若第一個出現(xiàn),就不會再檢查其他模式了。
4.case語句以關鍵字case開頭,以關鍵字esac結束。?
5.case的退出(返回)值是整個結構中最后執(zhí)行的命令的退出值。若沒有執(zhí)行任何命令,則退出值為0.
?
例:
#!/bin/bash
case $1 in
1)
??????? echo " you choice is 1";;
2)
??????? echo " your choice is 2";;
*)
??????? echo " your choice is others";;
esac
運行輸出:
[fsy@localhost scripts]$ sh d.sh 1
?you choice is 1
[fsy@localhost scripts]$ sh d.sh 2
?your choice is 2
[fsy@localhost scripts]$ sh d.sh 3
?your choice is others
9、break與continue
–1、break:用于立即終止當前循環(huán)的執(zhí)行,break命令可以使用戶從循環(huán)體中退出來。
–語法:break[n] ,其中,n表示要跳出幾層循環(huán),默認值為1?
–2、continue:跳過循環(huán)體中在其之后的語句,會返回到本循環(huán)層的開頭,進行下一次循環(huán)。
–語法:continue[n],其中,n表示從包含continue語句的最內(nèi)層循環(huán)體向外跳到第幾層循環(huán),默認值為1,循環(huán)層數(shù)是由內(nèi)向外編號。
?
10、函數(shù)
? 函數(shù):由函數(shù)標題和函數(shù)體兩部分組成。標題是函數(shù)名。函數(shù)體是函數(shù)內(nèi)在的命令集合。標題名稱必須唯一。變量均為全局變量,沒有局部變量。
格式:?
?[function] 函數(shù)名()???????????? 或?? [function]函數(shù)名() {
???????????????? {???????????????????????????????????????????????????????? 命令1
????????????????? 命令1????????????????????????????????????????????????? …
??????????????????? …?????????????????????????????????????????????????????? }
????????????????? }?
例:
#!/bin/bash
num=1
hello()
{
??????? echo "hello boy~ It's our $num meeting"
??????? let num=num+1
}
hello
hello
hello
運行輸出
hello boy~ It's our 1 meeting
hello boy~ It's our 2 meeting
hello boy~ It's our 3 meeting
?
11、select語句
格式:
select 變量 in 列表?
do?
命令行(通常用到循環(huán)變量)?
done?
?
??? 制作一個選擇表,在列表中選擇一個選項執(zhí)行命令行。如果選擇的變量不在列表序列中,則返回一個空值。需要用break退出循環(huán)。
?
例子:
#!/bin/bash
echo "a is 5 ,b is 3. Please select your method: "
a=5
b=3
select var in "a+b" "a-b" "a*b" "a/b"
do
??????? break
done
case $var in
"a+b")
??????? echo 'a+b= '`expr $a + $b`;;
"a-b")
??????? echo 'a-b= '`expr $a - $b`;;
"a*b")
??????? echo 'a*b= '`expr $a \* $b`;;
"a/b")
??????? echo 'a/b= '`expr $a / $b`;;
*)
??????? echo "input error"
esac
運行輸出:
[fsy@localhost scripts]$ sh e.sh
a is 5 ,b is 3. Please select your method:?
1) a+b
2) a-b
3) a*b
4) a/b
#? 1
a+b= 8
?
?
?????? 本篇博客出自? 阿修羅道,轉(zhuǎn)載請注明出處:http://blog.csdn.net/fansongy/article/details/6724228
?這里說的“瑞士軍刀”是指那些簡單的一句命令就能完成其它高級語言一大片代碼才能完成的工作。
? ?下面的這些內(nèi)容是Quora網(wǎng)站上Joshua Levy網(wǎng)友的總結:
-
通過sort/uniq獲取文件內(nèi)容的交集、合集和不同之處:假設有a、b兩個文本文件,文件本身已經(jīng)去除了重復內(nèi)容。下面是效率最高的方法,可以處理任何體積的文件,甚至幾個G的文件。(Sort對內(nèi)存沒有要求,但也許你需要用 -T 參數(shù)。)可以試著比較一下,你可以看看如果用Java來處理磁盤上文件的合并,需要用多少行代碼。
? ?cat a b | sort | uniq > c ? # c 是a和b的合集
? ?cat a b | sort | uniq -d > c ? # c 是a和b的交集
? ?cat a b b | sort | uniq -u > c ? # c 是a和b的不同
-
匯總一個文本內(nèi)容里第三列數(shù)字的和(這個方法要比用Python來做快3倍并只需1/3的代碼量):
? ?awk ‘{ x += $3 } END { print x }’ myfile
-
如果你想查看一個目錄樹里的文件的體積和修改日期,用下面的方法,相當于你挨個目錄做”ls -l”,而且輸出的形式比你用”ls -lR”更可讀:
? ?find . -type f -ls
-
使用xargs命令。這個命令非常的強大。注意每行上你可以控制多少個東西的執(zhí)行。如果你不確定它是正確的執(zhí)行,先使用xargs echo。同樣,-I{} 也非常有用。例子:
? ?find . -name \*.py | xargs grep some_function
? ?cat hosts | xargs -I{} ssh root@{} hostname
-
假設你有一個文本文件,比如一個web服務器日志,在某些行上有一些值,比如URL中的acct_id參數(shù)。如果你想統(tǒng)計每個acct_id的所有請求記錄:
? ?cat access.log | egrep -o ‘a(chǎn)cct_id=[0-9]+’ | cut -d= -f2 | sort | uniq -c | sort -rn
總結
以上是生活随笔為你收集整理的linux shell编程控制结构:expr、let、for、while、until、shift、if、case、break、continue、函数、select 学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux Shell实例精讲学习笔记
- 下一篇: linux send与recv函数详解