基礎命令
主要的命令和快捷鍵
Linux系統(tǒng)命令由三部分組成:cmd + [options]+[operations]
查看和修改ip地址ifconfig和ifconfig eth0 +ip地址
cal日歷
date時間date +%Y%m%d輸出日期的數(shù)字格式,如20160420
bc計算器
who用戶名字
whoami用戶
lsb_release -a查看系統(tǒng)的版本號
uname -a查看系統(tǒng)的內核版本號
history歷史命令記錄
得到root權限su root
修改root密碼sudo passwd root
關機poweroff或者shutdown now
man幫助命令
ls查看目錄里面文件(或者用tree函數(shù))
ls -al其中-l參數(shù)表示要求ls命令列出每個文件的詳細信息,-a參數(shù)則要求ls命令還要同時列出隱藏文件投蝉,-i可以顯示文件的inode即id。
關于ls -l結果解釋:drwx-wx-wx,10個字符,第一個字符表示文件的類型匀归,然后每三個字符一組碧查,r代表可讀取權限运敢,w代表可寫入權限,x代表可執(zhí)行權限忠售,若無權限則用-代替传惠。2~4個字符代表該文件所有者user的權限,5~7個字符代表給文件所有組的權限稻扬,8~10個字符代表給其他用戶(others)擁有的權限卦方。
改變文件的權限:chmod
給某文件添加用戶讀權限:chmod u+r somefile
給某文件刪除用戶讀權限:chmod u-r somefile
給某文件添加用戶寫權限:chmod u+w somefile
給某文件刪除用戶寫權限:chmod u-w somefile
給某文件添加用戶執(zhí)行權限:chmod u+x somefile
給某文件刪除用戶執(zhí)行權限:chmod u-x somefile
添加用戶對某文件的讀寫執(zhí)行權限:chmod u+rwx somefile
刪除用戶對某文件的讀寫執(zhí)行權限:chmod u-rwx somefile
給某文件設定用戶擁有讀寫執(zhí)行權限:chmod u=rwx somefile
#若想給某文件加上可執(zhí)行權限:chmod +x somefile
cd一鍵返回用戶主目錄
cd ~等同于cd命令
cd -返回上一次來源的目錄
cd ..返回上級目錄
pwd用戶的當前目錄
./用戶的當前目錄
../用戶的父級目錄
ctrl+u清空當前命令行中輸入的命令
ctrl+shift++號使得teminal終端字體變大
ctrl++號使得teminal終端字體變小
shift+pageup\pagedown在命令行的終端進行翻頁
exit退出命令行窗口
touch+文件名可以創(chuàng)建一個文件touch a.txt b.txt c.txt同時創(chuàng)建多個文件
rm+文件名可以刪除文件rm a.txt b.txt c.txt同時刪除多個文件
mkdir+目錄名可以在當前目錄下創(chuàng)建一個目錄mkdir dir1 dir2 dir3 ...,同時創(chuàng)建多個子目錄
mkdir -p a/b/c創(chuàng)建層級目錄使用-p選項
rmdir+目錄名刪除空目錄(此目錄下無任何文件或目錄)?????? rmdir dir1 dir2 dir3同時刪除多個子目錄
通配符*匹配任意長度、任意字符
rm *.txt刪除所有的txt文檔rm e.*
強制刪除非空的子目錄:? mkdir -p a/b/c/d/e???????? rm -rf a
Linux系統(tǒng)中沒有回收站泰佳,刪除后不可逆
文件的拷貝cp?????? cp src.c src.c.bak備份src.c為src.c.bak
cp src.c a/src.bak將文件src.c拷貝到a目錄下并且修改名字為src.bak
cp src.c a/拷貝不修改名字
文件的移動mv可以實現(xiàn)文件或目錄的移動或改名字
文件的重命名mv???????? mv src.c.bak src.c修改名字mv a abc修改目錄名字為abc
注:源和目標一般在同一級目錄下是修改名字盼砍,在不同的目錄下是進行移動
3個文本編輯器gedit\ed\nano
cat打印某目錄下的某文件內容絕對路徑打印cat /etc/apt/sources.list
gedit文本編輯器,類似于windows里面的txt文本逝她,其中帶有~號的文件為臨時的存儲文本
nano ctrl+o為保持浇坐,ctrl+x為退出
tac和cat命令差不多,主要為逆向打印
head默認為文件的前面十行參數(shù)為-n
tail默認為文件的尾部十行參數(shù)為-n
more對文件進行按百分比打印按空格鍵翻頁
less
tar文件打包命令-c創(chuàng)建一個包-v現(xiàn)實包處理的過程-f必須黔宛,無任何含義
tar -cvf ab.tar aa.c shan.e創(chuàng)建一個包
tar -xvf ab.tar解壓一個包
tar -tvf ab.tar查看一個包里面的內容
tar -xvf ab.tar shan.e只解壓包里面的shan.e的文件
tar -xvf ab.tar -C kk/將解壓包里面的文件解壓到kk文件夾中
對文件進行壓縮
gzip代碼:gzip aa.tar壓縮后aa.tar沒了近刘,得到aa.tar.gz
bzip2代碼:bzip2 aa.tar得到aa.tar.bz2
tar代碼:tar -zcvf ac.tar.gz aa.tar新建一個壓縮包名字為ac.tar.gz
tar -jcvf aa.tar.bz2 ac.tar新建一個壓縮包名字為aa.tar.bz2
解壓命令
gunzip代碼:gunzip aa.tar.gz
bunzip2??????????? bunzip2 aa.tar.bz2
tar????????????????????? tar -zxvf aa.tar.gz? ??tar -jxvf aa.tar.bz2??? tar -ztvf aa.tar.bz2
其中-zxvf為tar命令解壓.gz文件-jxvf為tar命令解壓bz2文件
注:gzip和bzip2以及tar不能通過同樣的后綴名進行解壓,必須是經(jīng)過相同的壓縮方式得到的壓縮包,每種壓縮的算法不一樣.
which可以定位可執(zhí)行文件所在目錄which ls??????? which pwd
whereis命令定位文件所在目錄1.二進制的-b???? 2.源文件-s???? 3.幫助文檔-m
locate基于數(shù)據(jù)庫通過名字查找文件最新的文件可能查不到跌宛,需要手動更新數(shù)據(jù)庫酗宋,用命令sudo updatedb更新數(shù)據(jù)庫無論當前目錄在哪里都可以查找文件或者文件夾locate aa.tar
file查看文件的類型
find通過文件名查找文件find+查找目錄+查找內容
find PATH -name FILENAME
find ./ -name 'a*'在當前目錄下查找以a為開頭的文件
find ~/ -name 'a*'在用戶主目錄下查找以a為開頭的文件
三種方式安裝軟件
1.源代碼安裝
2.包安裝.deb包dpkg -i xxx.deb??? sudo dpkg -i包名字
.rpm包rpm -i??? xxx.rpm? sudo rpm -i包名字
3.apt在線安裝sudo apt-get install aptitude -y安裝aptitude軟件
服務器有?sudo? aptitude search軟件名
本機安裝過疆拘?sudo? aptitude show軟件名
本機安裝蜕猫?sudo?? aptitude??? install軟件名
卸載軟件?sudo? aptitude remove軟件名
重新安裝哎迄?sudo aptitude reinstall軟件名
安裝tree軟件(一款樹狀結構顯示文件夾內容的軟件)安裝sudo aptitude install tree
sources.list里面記錄aptitude可以訪問apt服務器地址
sudo aptitude update更新sources.list
關于sources.list的更多源回右,百度搜索ubuntu 15.10 source.list cn99 lup
軟/硬鏈接
軟鏈接類似windows的快捷方式刪除了主文件快捷方式無用了軟鏈接文件->文件名->磁盤存儲區(qū)域
ln -s源文件名生成軟鏈接名ln -s /etc/apt x將路徑名字賦給x
硬鏈接多個文件名對應同一區(qū)域磁盤扇區(qū)塊相當于復制cp
硬鏈接有兩個限制,1.不允許給目錄創(chuàng)建鏈接2.不同分區(qū)上的兩個文件之間不能建立硬鏈接
ln源文件名生成硬鏈接文件名
vim編輯器
vi testvi編輯文件
按i可進入vim的編輯模式
按o鍵進入下一行
寫完了按ESC鍵
k鍵向上漱挚,j鍵向下翔烁,h鍵向左,l鍵向右
Ubuntu自帶版本的vi編輯器為vim-tiny缺少左右光標鍵和語法高亮的設置
安裝完整版的vim編輯器sudo aptitude install vim安裝完成
剛剛進入vi旨涝,vi處于一般操作模式蹬屹,不可寫入文字,只能進行一些操作白华,稱為操作模式
在操作模式下可以進行1)移動光標2)拷貝慨默、刪除、粘貼
按下字母i進入編輯模式弧腥,i在光標前插入字符厦取,a在光標后插入字符按字母o鍵切換到下一行
k鍵向上,j鍵向下管搪,h鍵向左虾攻,l鍵向右
保存文檔,按ESC退回操作模式更鲁,再按冒號霎箍,進入末行命令模式
w為保存,q為退出岁经,q!為舍棄朋沮,
gcc -o app ***.c
./app執(zhí)行C語言文件
vim編輯器文件另存為:首先需要按ESC鍵回到命令模式;然后輸入命令:w filename缀壤,文件不存在會自動新建文件。用法示例:另存為文件為zhidao.txt??? :w zhidao.txt文件默認保存在當前工作路徑纠亚。
同一文件內文本復制與粘貼的操作
在操作模式下塘慕,按o為光標下一行插入一行,按shift+o為向上插入一行蒂胞;
按yy為復制光標所在的行图呢,按nyy為光標所在行起復制n行;
按dd為剪切光標所在的行,按ndd為光標所在行起剪切n行蛤织;
按p為光標所在行下面粘貼赴叹,按shift+p為光標所在行上面粘貼;
vi編輯器中指蚜,操作模式時按v鍵進入反選模式乞巧,從當前光標進入反選,然后對選中的文字進行操作摊鸡。
在操作模式下绽媒,按x為刪除字符;
在操作模式下免猾,按r是辕,為替換模式,替換某個字符猎提;
set nu為顯示行號
set nonu為不顯示行號获三;
syntax on為顯示語法高亮;
syntax off為關閉語法高亮;
多個文本之間的內容拷貝
一、在末行命令中打入e +另一個文件名編輯文件锨苏,然后用nyy命令進行拷貝疙教,然后在切換,用p命令
二蚓炬、在末行命令中打入sp+另一個文件名進入分屏松逊,然后利用yy和p命令進行拷貝和粘貼,ctrl+ww為兩個窗口光標切換
三肯夏、在末行命令中打入vsp+另一個文件名進入分屏经宏,然后利用yy和p命令進行拷貝和粘貼,ctrl+ww為兩個窗口光標切換
末行命令:wqall為全部存盤退出
vim編輯器中的查找
在操作模式中打入/+需要搜索的內容驯击,按n可以切換下一個烁兰,N切換上一個
在幫助手冊manul中/+搜索的內容
/為從當前光標向后搜索,?是從當前光標先前搜索徊都;
vim編輯器中的替換
在操作模式下打入:起點沪斟,終點s/被替換的字符串/替換成的字符串/g
其中起點和終點是行號
例如:2,9s/int/float/g
全文替換為%s/float/int/g
按u是撤銷操作
%s/float/int/gc對每一個需要替換的字符都要進行確認;
管道函數(shù)
Linux中管道函數(shù)用|來連接兩個命令暇矫,它可以把一個命令的輸出內容當做下一個命令的輸入內容主之,兩個命令之間只需要使用管道符連接即可。
grep
grep [ivnc] '需要匹配的字符'文件名
-i不區(qū)分大小寫
-c統(tǒng)計包含匹配的行數(shù)
-n輸出行號
-v反向匹配李根,不包含含有匹配字符的行
grep函數(shù)默認區(qū)分大小寫槽奕,如需要忽略大小寫,選項-i
sort
sort [-ntkr]文件名
-n采取數(shù)字排序
-t指定分隔符
-k指定第幾列
-r反向排序
對輸出內容直接排序時房轿,默認按照每行的第一個字母進行排序
例子:cat sort.txt | sort -r粤攒,按照第一列進行排序
cat sort.txt | sort -t ":" -k 2按照第二列進行排序所森,用:分隔符分裂,但是按照名字排序
cat sort.txt | sort -rnt ":" -k 2
按照第二列數(shù)字大小進行逆向排序夯接,分隔符為":"
sort -t ":" -k 2 -n sort.txt
uniq
刪除重復內容
uniq [-ic]
-i忽略大小寫
-c計算重復行數(shù)
注意:uniq一般和sort的連用焕济,因為uniq只會比較相鄰的行,所以必須先排序然后再刪除重復的行
例如:sort -n uniq.txt | uniq -c
cut
使用cut截取文本
cut -f指定的列-d "分隔符"
例如:cut -f1,6-7 -d':'
想要打印每行第1-5個字符盔几,以及7-10個字符晴弃,使用命令:
cut -c1-5,7-10 passwd
tr
做文本轉換
主要作用在于文本轉換或者刪除
-c用字符串1中字符集的補集替換此字符集,要求字符集為ASCII问欠。
-d刪除字符串1中所有輸入字符肝匆。
-s刪除所有重復出現(xiàn)字符序列,只保留第一個顺献;即將重復出現(xiàn)字符串壓縮為一個字符串旗国。
例如,將小寫字母轉換為大寫字母命令:cat passwd | tr '[a-z]' '[A-Z]'
刪除冒號命令,使用:
cat passwd | tr -d ':'
將文件file中出現(xiàn)的"abc"替換為"xyz"
cat file | tr "abc" "xyz" > new_file
把文件中的數(shù)字0-9替換為a-j
# cat file | tr [0-9] [a-j] > new_file
paste
函數(shù)用于連接兩個文件
paste a.txt b.txt
-d指定在合并文件時行間的分隔符
實現(xiàn)文本合并cat a.txt b.txt >new
split
分割文件
#按照行進行分割注整,-l參數(shù)制定每500行為一個小文件
split -l 500 big_file.txt small_file_
#分割完成后能曾,當前目錄下會生成很多小文件
如果文件是二進制的,則只能按照文件大小分割
ll –h big_bin
split –b 64m big_bin small_bin
echo命令
echo為打印某條指令
正則化表達式與通配符
"."符號
點符號用于匹配除換行符之外的任意一個字符肿轨。例如寿冕,r.t可以匹配rot,rut椒袍,但是不能匹配root驼唱。
例:grep 'r..t' /etc/passwd
"*"符號
"*"符號用于匹配前一個字符0次或者任意多次,比如ab*驹暑,可以匹配a玫恳、b、abb等优俘。"*"號經(jīng)常和"."號一起使用京办,比如”.*”代表任意長度的不包含換行的字符。
例如:”r.*t”代表查找包含字母r帆焕,后面緊跟任意長度的字符惭婿,再跟一個字母t的行。
“\{n,m\}”符號
雖然”*”可用于重復匹配前一個字符叶雹,但卻不能精確的控制匹配的重復次數(shù)财饥,使用“\{n,m\}”符號則能達到要求。
“\{n\}”符號匹配前面的字符n次折晦,“\{n,\}”匹配前面的字符至少n次以上(含n次)佑力。
“\{n,m\}”匹配前面的字符n到m次。
“^”符號
這個符號用于匹配開頭字符的行
例如:grep ‘^root’ /etc/passwd
“$”符號
用于匹配結尾字符的行
例如:grep ‘^r.*h$’ /etc/passwd
符號“^$”則代表改行為空
“[ ]”符號
用于匹配方括號內出現(xiàn)的任一字符筋遭。用符號“-”作限定
例如:[A-Za-z]匹配所有的字母,[^A-D]代表取反即除了字母A-D以外的字母,例如:“^1[38][0-9]\{9\}”代表手機號碼
“\”符號
為轉義符漓滔。比如[ \- ]此時”\-”代表“-”编饺,再如想打入一個點,則\.*代表匹配任意長度的點號响驴。
“\<”符號和“\>”
這兩個符號分別用于界定單詞的左邊界和右邊界透且。
比如“\”則用于匹配以”hello”結尾的單詞。
“\<\>”則用于精確匹配任意一個字符串豁鲤。
例如:grep “\”
\n為換行符秽誊,\r為一個回車符,\t為一個制表符琳骡,\f為一個換頁符锅论,\s為任何空白字符,\S為任何非空白字符楣号。
擴展的正則表達式
在使用這些擴展符號前需要使用命令egrep最易。
“?”符號
“?”符號用于匹配前一個字符0次或1次,所以”ro?t”僅能匹配rot或者rt.
“+”符號
“+”符號用于匹配前一個字符1次以上炫狱,所以”ro+t”就可以匹配rot藻懒、root.
“|”符號
“|”符號是”或”的意思药薯,即多種可能的羅列
例如:^0[0-9]\{2\}-[0-9]\{8\} | ^0[0-9]\{3\}-[0-9]\{8\}
“|”符號
“()”符號通常和”|”符號連用替裆,用于枚舉一系列可替換的字符形入。
例如021-88888888和0511 88888888可以使用代碼:^0[0-9]\{2,3\}(-| )[0-9]\{8\}
再如:h(ar|oo|ol)d可以匹配hard, hold或hood
特殊的POSIX字符桩匪,示例如下:
grep支持一類特殊的POSIX字符:
[:alnum:]文字數(shù)字字符
[:alpha:]文字字符
[:digit:]數(shù)字字符
[:graph:]非空字符(非空格配深、控制字符)
[:lower:]小寫字符
[:cntrl:]控制字符
[:print:]非空字符(包括空格)
[:punct:]標點符號
[:space:]所有空白字符(新行邦泄,空格昧穿,制表符)
[:upper:]大寫字符
[:xdigit:]十六進制數(shù)字(0-9,a-f,A-F)
例如:搜索以數(shù)字開頭的行:grep ^[[:digit:]] zzbds.txt
注意:需要多加上一層中括號
通配符
“*”符號
“*”符號代表0個或多個字符厕妖。比如*.doc代表所有以.doc結尾的文件第美。A*.doc代表以字母A開頭的doc文件蝶锋。
“?”符號
“什往?”符號代表的是任意的一個字符扳缕,例如A?.doc代表的是以字母A開頭,文件名第二個字母為任意字母的doc文件别威。
“{}”符號
可以匹配所有括號內包含的以逗號隔開的字符躯舔。
例如:ls –l {A,B,C}.doc和命令ls –l [A-C].doc列出所有以字母A,B,C開頭.doc結尾的文件
嵌套功能:ls –l {[A-Z]*.doc,[0-9]??.txt}
“^”符號和“!”符號
這兩個符號往往和”[]”一起使用,當出現(xiàn)在”[]”中的時候省古,代表取反粥庄。
文本處理工具sed
sed處理文本時是以行為單位的,每處理完一行就立即打印出來豺妓,然后再處理下一行惜互,直至全文處理結束布讹。sed可做的編輯動作包括刪除、查找替換训堆、添加描验、插入、從其他文件中讀入數(shù)據(jù)等坑鱼。
sed命令使用的場景包括以下:
常規(guī)編輯器編輯困難的文本膘流。
太過于龐大的文本,使用常規(guī)編輯器難以勝任(比如vi一個幾百兆的文件)
有規(guī)律的修改文本鲁沥,加快文本的處理速度
sed修改文件流的方式如下:sed [options] ‘command’ file
# ‘command’命令均為vi編輯器中的命令
# sed命令默認不修改原文件呼股,如果希望保存修改后的文件則需要用重定向’>’
#使用-e參數(shù)和分號連接多編輯命令
例如:sed –e ‘s/this/That/g’ –e ‘s/line/LINE/g’ sed.txt或者sed ‘s/this/That/g’ ; ‘s/line/LINE/g’ sed.txt
刪除
sed ‘1d’ sed.txt >save.txt #刪除第一行
sed ‘1,3d’ sed.txt #刪除1到3行
sed ‘1,$d’ sed.txt #刪除1到最后一行
sed ‘$d’ sed.txt? #刪除最后一行
sed ‘5!d’ sed.txt? #只保留第五行
sed ‘/Empty/d’ sed.txt #刪除所有包含Empty的行
sed ‘/^$/d’ sed.txt #刪除空行
查找替換
使用s命令可將查找到的匹配文本內容替換為新的文本。
sed ‘s/line/LINE/’ sed.txt? #將line替換為LINE,每行默認替換一個
sed ‘s/line/LINE/2’ sed.txt? #將line替換為LINE,每行默認替換兩個
sed ‘s/line/LINE/g’ sed.txt? #將line替換為LINE,全部替換
sed ‘s/^this/That/’ sed.txt? #只替換開頭的this為That
#命令中間不能有空格
字符轉換
使用y命令可進行字符轉換画恰,其作用為將一系列字符逐個的變換為另外一系列字符彭谁,基本用法如下:
sed ‘y/OLD/NEW/’ file? #將全文中字母O替換為N,字母L替換為E阐枣,字母D替換為W.
插入文本
使用i或者a命令插入文本马靠,其中i代表在匹配行之前插入,而a代表在匹配行之后插入.
sed ‘2 i Insert’ sed.txt? #在第二行之前插入文本
sed ‘2 a Insert’ sed.txt? #在第二行之后插入文本
sed ‘/Second/ i \Insert’? #在匹配行之前插入文本
讀入文本
使用命令r可以從其他文件中讀取文本蔼两,并插入匹配行之后.
sed ‘/^$/r? /etc/passwd’ sed.txt? #將/etc/passwd中的內容讀取到sed.txt空行之后
打印
使用p命令可進行打印甩鳄,這里使用sed命令時一定要加參數(shù)-n,表示不打印沒關系的行额划。
例:sed –n ‘1p’ sed.txt? #只打印第一行
#sed實際處理了第二行妙啃,其他幾行由于沒有匹配所以并未真正處理。
再如:sed –n ‘s/the/THE/gp’ sed.txt #只打印實際處理過的行俊戳,簡化了輸出揖赴,第二行the全部轉換為THE
寫文件
sed本身默認并不改寫原文件,而只是對緩沖區(qū)的文本做了修改并輸出到屏幕抑胎。所以想保存文件燥滑,除了使用重定向或-i,還可以使用w命令將結果保存到外部指定文件阿逃。
例如:sed –n ‘1,2 w output’ sed.txt #這里沒有任何的輸出铭拧,因為輸出被重定向到文件output
#將sed.txt文件中1,2行寫入文件output中
sed腳本
將動作靜態(tài)化的寫到某個文件中,然后調用sed命令并使用-f參數(shù)指定該文件恃锉。
vi sed.rules
s/this/THAT/g
/^$/d
sed sed.rules sed.txt
高級替換
替換匹配行的下一行搀菩,使用n命令
例如:sed ‘/^${n;s/line/LINE/g}’ sed.txt
文本處理工具awk
awk是基于列的處理工具,它的工作方式是按行讀取文本并視為一條記錄破托,每條記錄以字段分割成若干字段肪跋,然后輸出各字段的值。awk認為文件都是結構化的土砂,也就是說都是由單詞和各種空白字符組成的州既,“空白字符”包括空格谜洽、tab、連續(xù)的空格和tab等易桃。每個非空白的部分叫做域褥琐,從左到右依次是第一個域,第二個域晤郑。$1,$2表示第一域第二個域贸宏,$0表示全部域造寝。
打印指定的域
#打印第一個和第四個列awk ‘{print $1,$4}’ awk.txt
#打印全部內容awk ‘{print $0}’ awk.txt
指定打印的分隔符
默認情況下awk是使用空白字符作為分隔符的,但是也可以通過-F參數(shù)指定分隔符來區(qū)分不同的域(類似于cut命令).
注意:必須得使用單引號不能使用雙引號.
例如:awk –F’.’ ‘{print $1,$2}’ awk.txt
打印每行的列數(shù)內部變量NF參數(shù)
awk ‘{print NF}’ awk.txt? #打印每行的列數(shù)吭练,指定不同的分隔符會有不同結果
打印固定域
在NF前加上$符號诫龙,則代表最后一列,這樣不管有多少列鲫咽,只要使用$NF就能打印出最后一行签赃。倒數(shù)第二行為$(NF-1)
例如:awk ‘{print $NF}’ awk.txt awk ‘{print $(NF-1)}’ awk.txt
截取字符串
使用substr函數(shù)對指定域截取字符串
substr(指定域,第一個開始字符的位置分尸,第二個結束的位置)
#其中第二個結束的位置可以為空锦聊,這樣默認輸出到該域的最后一個字符
例如:cat awk.txt | awk ‘{print substr($1,6,2)}’ #輸出第一個域從第六個字符開始長度為2的字段
內部變量length
使用內部變量length可以確定字符串的長度
例如:cat awk.txt | awk ‘{print length}’
使用awk求列和
例如: cat awk.txt | awk ‘BEGIN{total=0}{total+=$3}END{print total}’ #求年齡的和
cat awk.txt | awk ‘BEGIN{total=0}{total+=$3}END{print total/NR}’ #求年齡的平均值
NR為內部變量,表示已經(jīng)讀取的記錄數(shù)
Shell編程
第一個例子:
vi HelloWorld.sh
輸入:#箩绍!/bin/bash
#this is a comment
echo ‘HelloWorld!’
:wq保存退出
運行:在當前目錄下bash HelloWorld.sh
或者改變文件的執(zhí)行權限孔庭,chmod +x HelloWorld,然后打入./HelloWorld運行
Shell的內建命令
1.如何確定內建命令:type
判斷一個命令是否是內建命令使用type函數(shù)
例如:type cd
:cd is a Shell builtin
2.執(zhí)行程序:”.”
使用點號執(zhí)行沒有加權限的腳本可以正常運行
. ./HelloWorld.sh? #兩個點之間需要加一個空格材蛛,否則../代表當前目錄的上一層目錄
3.別名alias
alias可用于創(chuàng)建命令的別名圆到,若直接輸入該命令且不帶任何參數(shù),則列出當前用戶使用了別名的命令卑吭。
創(chuàng)建命令的別名如下:
alias myShutdown =’shutdown –h now’
該命令只能在當前的Shell環(huán)境有效芽淡,重新登錄則消失《股停可將該條目寫到用戶目錄的.bashrc文件中
4.刪除別名:unalias
unalias ll
5.任務前后臺切換:bg,fg,jobs
6.改變目錄:cd
7.聲明變量declare,typeset
8.打印字符:echo
echo用于打印字符挣菲,典型用法是使用echo命令并跟上使用雙引括號的內容,-n命令可以使得不打印換行符河绽。
9.跳出循環(huán)break
10.控制循環(huán):continue
13.退出shell:exit
14.環(huán)境變量聲明export
例如:export var=1
16.整數(shù)運算:let
17.當前目錄顯示:pwd
18.聲明局部變量:local
19.從標準輸入讀取一行到變量:read
20.定義函數(shù)返回值:return
21.向左移動位置函數(shù):shift
變量賦值和取值
變量名=變量名
注意1:變量名和變量名之間用等號緊緊相連己单,之間沒有任何的空格
注意2:當變量中有空格時必須用引號括起,否則會出現(xiàn)錯誤
變量的取值只需要在變量前加上$符號即可耙饰,嚴謹?shù)膶懛ㄊ?{}
注意3:當變量值引用的是其他變量纹笼,則必須使用雙引號,因為單引號會阻止shell解釋特殊字符$苟跪,例如john=1;name=”$john”,echo $name結果為1
取消變量unset
例如:name=john; echo $name ;unset name注意:unset+變量名不需要$符號
取消函數(shù):
unset_funciont(){echo “Hello World!”
}
unset unset_function
特殊參數(shù)
位置參數(shù):腳本本身為$0,第一個參數(shù)為$1廷痘,第二個參數(shù)為$2蔓涧,第三個為$3,以此類推笋额。當參數(shù)大于9時元暴,需要用括號${}將其括起來標識;$#表示腳本參數(shù)的個數(shù)總和兄猩,$@或者$*表示腳本的所有參數(shù)茉盏。$?永遠是上一個命令的返回值。
數(shù)組
數(shù)組的定義:declare –a Array; Array[0]=0;Array[1]=1;Array[2]=”HelloWorld”
數(shù)組還可以在創(chuàng)建的同時賦值declare –a Name=(‘john’ ‘sue’);Name[2]=’Wang’
或者直接不使用declare關鍵字:Name=(‘john’ ‘sue’)
注意:輸入數(shù)據(jù)時候一定要用空格將其分開枢冤,逗號不行鸠姨。
還可以給特定的元素賦值。Score=([3]=3 [5]=5 [7]=7)
數(shù)組操作:
1.最簡單的操作就是數(shù)組取值淹真,其格式為:${數(shù)組名[索引]}
例如:echo ${Array[0]}
指定索引只能列舉單個元素讶迁,要是想一次性取出所有元素的值,可以采取兩種方式:
echo ${Array[@]}或者echo${Array[*]}
注意:echo ${Array[@]}得到的是以空格隔開的元素值核蘸,而echo ${Array[*]}得到的是一整個字符串巍糯。
2.數(shù)組的長度,即元素的個數(shù)
利用@或者*字符客扎,可以將數(shù)組擴展成列表祟峦,然后使用#號來獲取數(shù)組元素的個數(shù)。
例如:echo ${#Array[@]}或者echo ${#Array[*]}
3.數(shù)組截扰斑搿:可以截取某個元素的一部分搀愧,對象可以是真?zhèn)€數(shù)組或者某個元素。
#取出數(shù)組的第一疆偿、二個元素
echo ${Array[@]:1:2}
#取出第二個元素從0個字符開始連續(xù)5個字符
echo ${Array[2]:0:5}
4.連接數(shù)組:將若干個數(shù)組進行拼接操作
Conn=(${Array[@]} ${Name[@]})
5.替換元素:將數(shù)組內某個元素的值替換成其他值咱筛。
${數(shù)組名[@或#]/查找字符/替換字符}
Array=(${Array[*]/HelloWorld/HelloJohn})
echo ${Array[*]}
6.取消數(shù)組或者元素:和取消變量一樣,取消一個數(shù)組的方式也是用unset命令杆故。
unset Array[1] #取消第二個元素
unset Array? #取消數(shù)組
只讀變量
只讀變量又稱為常量迅箩,是通過readonly內建命令創(chuàng)建的變量。這種變量在聲明時候就要求賦值处铛,并且之后無法更改饲趋,這和之前講到的使用declare –r聲明只讀變量的效果是一樣的。
# readonly RO=100
RO=200? #會報錯
轉義符和引用
shell中的轉義符是反斜線”\”撤蟆,使用轉義符的目的是使轉義符后面的字符單純的作為字符出現(xiàn)奕塑。
例如,想要打印字符$Array家肯,使用命令echo $Array龄砰,由于變量Array并未賦值,故打印的是空的,此處應該加上轉義符换棚,即echo \$Array式镐,結果顯示$Array
常見的特殊符號
引用
引用是指將字符串用某種括號括起來,以防止特殊字符被解析為其他意思固蚤。
1.部分引用
部分引用是指用雙引號括起來的引用娘汞。在這種引用方式中,$符號夕玩、`引號你弦,轉義符(\)這三種特殊字符依然會被解析為特殊的意義。
例如:var=”A?? B?? C”
如果輸入echo $var风秤,則輸出的內容只保留了每個字母間一個空格
如果想要完全的按照格式保留原來的變量鳖目,打入echo “$var”
2.全引用
全引用是指用單引號括起來的引用。單引號中的任何字符都只當做是普通字符(除了單引號本身缤弦,也就是說單引號中間無法在包含單引號,即便轉義符轉義單引號也不行)彻磁。
例如:echo ‘$var’如果想輸出變量$var碍沐,則需要使用雙引號。
命令替換
命令替換是指將命令的標準輸出作為值賦給某個變量衷蜓。
使用的方式有兩種累提。
1.使用反引號` , `命令`
2.使用$(),$(命令)
注意:如果被引用的命令輸出的內容包括多行磁浇,此時若不通過雙引號引用的方式輸出變量斋陪,則輸出的內容中將會刪除換行符,文件名之間會使用系統(tǒng)默認的空來填充置吓,即輸出的內容只占一行无虚。
例如:var=$(ls -l); echo $var; echo “$var”
運算符
shell中的運算符主要有比較運算符(用于整數(shù)比較)、字符串運算符(用于字符串測試)衍锚、文件操作運算符(用于文件測試)友题、邏輯運算符、算數(shù)運算符戴质、位運算符度宦、自增自減少運算符。
使用$[]做運算
x=1;y=2;echo $[x+y];
使用bc做運算
在Linux下使用bc的最簡單的方式是直接輸入命令bc告匠。
#bc默認情況下并不顯示小數(shù)部分戈抄,需要設置顯示的小數(shù)位數(shù),scale=3設置為三位小數(shù)輸出后专。
比較運算:2>1 ?? 2<1???????? 1==1?????? 1&&2???? 1&&0???? 1||0???????? 1||2???????? !0
例如:希望一次性處理多個計算
cat cal.bc
12*34;34/12;scale=3;34/12;a=1;b=2;a+b
cat cal.bc | bc
echo ‘scale=100;sqrt(3)’ |bc
有時候需要在shell程序里面直接調用bc計算表達式划鸽,并將結果復制給變量以參與后面的計算或者判斷。這里給出了一個求和的例子:
#!/bin/bash
num1=10
num2=15
total=$(echo “num1+num2”|bc)
echo $total
shell中的特殊字符
通配符
常見的通配符有*行贪、漾稀?和[]括起來的字符序列模闲。
引號
引號包括單引號和雙引號,單引號又叫做“全引用”或“強引用”崭捍;雙引號又稱為“部分引用”或者“弱引用”尸折,所有用雙引號括起來的字符除了美元符號、反斜線殷蛇、反引號依然保留用途外实夹,其他的字符都作為普通字符處理;而所有的單引號括起來的部分都作為普通字符處理粒梦,但是要注意單引號中間不能再出現(xiàn)單引號亮航,否則shell會無法判別到底哪里是單引號的氣質位置。
注釋符
shell使用#作為注釋符匀们。但是如果#號后面出現(xiàn)!缴淋,則不會作為注釋符。
反引號
反引號用于命令替換泄朴,和$()的作用相同重抖,表示返回當前命令的執(zhí)行結果并賦值給變量。
測試和判斷
使用$?來進行判斷祖灰。
判斷為真則返回0钟沛,為假則返回非0。
測試結構
第一種方式:test expression
第二種方式:使用[ expression ]局扶,[]中間有兩個空格
判斷一個文件是否存在恨统,例如:
test –e /var/messages
echo $?
字符串測試
shell中的字符串比較主要有等于、不等于三妈、大于畜埋、小于、是否為空等測試沈跨。
字符串測試
說明
-z “string”
字符串string為空時返回真由捎,否則為假
-n “string”
字符串string非空時返回真,否則為假
“string1”=” string2”
字符串string1和string2相同時返回為真饿凛,否則為假
“string1”!=” string2”
字符串string1和string2不同時返回為真狞玛,否則為假
“string1”>” string2”
按照字典排序,字符串string1排在string2之前返回為真涧窒,否則為假
“string1”<” string2”
按照字典排序心肪,字符串string1排在string2之后返回為真,否則為假
例如:str1=””?????? str2=”hello”??? test –z “$str1”??????? [ “$str1”=”$str2” ]? [ “$str1”\>”$str2” ]
如果不想使用轉義符纠吴,則可以使用[[]]括起來表達式
整數(shù)比較
比較兩個整數(shù)的大小關系
測試成立返回0硬鞍,否則則返回非0數(shù)值。
測試方法一:test “num1” num_operator “num2”
測試方法二:[ “num1” num_operator “num2” ]
其中num_operator是整數(shù)測試符常見的整數(shù)測試符如下:
整數(shù)比較
說明
“num1” –eq “num2”
如果兩個值相等則返回真,否則返回假固该。equal
“num1” –gt “num2”
如果大于則返回真锅减,否則返回假。great than
“num1” –lt “num2”
如果小于則返回真伐坏,否則返回假怔匣。less than
“num1” –ge “num2”
如果大于等于則返回真,否則返回假桦沉。great equal
“num1” –le “num2”
如果小于等于則返回真每瞒,否則為假。less equal
“num1” –ne “num2”
如果不等于返回真纯露,否則返回假剿骨。not equal
邏輯測試符和邏輯運算符
邏輯測試用于連接多個測試文件,并返回整個表達式埠褪。邏輯測試主要有邏輯非浓利、邏輯與、邏輯或三種钞速。
邏輯測試表如下:
邏輯運算
說明
荞膘!expression
如果expression為真,則測試結果為假
expression1 –a expression2
expression1和expression2同時為真玉工,則測試結果為真,否則為假
expression1 –o expression2
expression1和expression2只要有一個為真淘菩,則結果為真遵班,同時都假則結果為假
[! –e /var/log/messages]和[-e /var/log/messages01]
[! –e /var/log/messages –a –e /var/log/messages01]
或者采用以下的寫法:
! [ -e /var/log/messages ] && [ -e /var/log/messages01 ]? #記得加上空格
if判斷結構
語法結構如下:
if expression; then
command
fi
如果expression測試返回真,則執(zhí)行command潮改。如果要執(zhí)行的不止一條命令狭郑,則不同命令用換行符隔開,如下所示:
if expression;then
command1
command2
…
fi
例子:
#!/bin/bash
echo -n "Please input a score:"
read SCORE
if [ "$SCORE" -lt 60 ];then
echo "C"
fi
if [ "$SCORE" -lt 80 -a "$SCORE" -ge 60 ];then
echo "B"
fi
if [ "$SCORE" -ge 80 ];then
echo "A"
fi
if/else判斷結構
if/else判斷結構語法結構:
if expression;
then??????? command
else???????? command
fi
#!/bin/bash
#讀兩個數(shù)汇在,判斷這兩個數(shù)是否相等
read x y
if [ $x -eq $y ];
then echo "$x=$y"
else echo "$x!=$y"
fi
#多層嵌套
#!/bin//bash
echo –n “Please input a score:”
read SCORE
if [ “$SCORE” –lt 60 ];then
echo “C”
else if [“$SCORE” –lt 80 –a “$SCORE” –ge 60 ];then
echo “B”
else if [“$SCORE” –ge 80 ];then
echo “A”
fi
fi
fi
換種寫法
#!/bin//bash
echo –n “Please input a score:”
read SCORE
if [ “$SCORE” –lt 60 ];then
echo “C”
elif [“$SCORE” –lt 80 –a “$SCORE” –ge 60 ];then
echo “B”
else [“$SCORE” –ge 80 ];then
echo “A”
fi
case判斷結構
用case來做多分支的結構語法結構如下:
case VAR in
var1)?????? command1 ;;
var2)?????? command2 ;;
var3)?????? command3 ;;
…
*)??? command;;
esac
其原理為從上到下依次比較VAR和var1\var2\var3的值是否相等翰萨,如果匹配相等則執(zhí)行后面的命令語句,在無一匹配的情況下匹配最后默認的*糕殉,并執(zhí)行后面的默認命令亩鬼。要注意的是,case判斷結構中的var1\var2\var3等這些值只能是常量或正則表達式阿蝶。
循環(huán)
for循環(huán)語法結構
for var in (list)
do
command
done
#這里的列表是一系列以空格分隔的值雳锋。shell每次從這個列表中取出一個值,然后運行do/done之間的命令羡洁,直到取完列表中的所有的值玷过。
#!/bin/bash
for I in 1 2 3 4 5 6 7 8 9
do
echo $i
done
注意:for循環(huán)里面可以in (list)也可以in ${數(shù)組[*]},之前可以先定義一個列表變量或者數(shù)組變量辛蚊。
#!/bin/bash
fruits=”apple orange banana pear” #此處也可以定義為fruits=(apple orange banana pear)
for fruit in ${fruits}?????????????????????????? #此處應該改為for fruit in ${fruits[*]}
do
echo “$fruit is John’s favourite”
done
echo “No more fruits”
seq命令用于產(chǎn)生一個整數(shù)數(shù)列粤蝎。seq 5 = 1 2 3 4 5
默認從1開始,步長為1
格式為:seq起始數(shù)字步長結束數(shù)字
例子:
#!/bin/bash
sum=0
x=$(seq 1 2 100)
for i in ${x}
do
let “sum+=i”#或者代碼sum=$[sum+i]或者sum=$((sum+i))
done
echo $sum
類C的for循環(huán)
shell支持類C的for循環(huán)袋马,具體結構為:
for((i=1;i<=10;i++))
do
echo –n “$i”? #此處echo加上選項-n是不換行打印
done
echo
while循環(huán)
while循環(huán)的語法結構為:
while expression
do
command
done
首先while將測試expression的返回值初澎,如果返回值為真則執(zhí)行循環(huán)體,返回值為假則不執(zhí)行循環(huán)飞蛹。循環(huán)完后進入下一次循環(huán)之前再次測試谤狡。
#!/bin/bash
count=5
while [ $count –gt 0 ]
do
echo –en “$count\n”
let count=count-1
done
#注意:echo打印函數(shù)默認是每行打印一個元素,-n選項使得不換行卧檐,-e選項激活轉義符\
#注意:[]和[[]]的區(qū)別在于[]中間使用-a –o這種邏輯符號墓懂,而[[]]則使用&& ||這種邏輯連接符號
#注意:運算符號有三種let expression、$[expression]霉囚、$((expression))
echo $?就是輸出上次腳本的退出碼捕仔。如果是0說明上次腳本執(zhí)行成功,如果非0說明上次腳本執(zhí)行失敗盈罐。
例子
#!/bin/bash
sum1=0
sum2=0
i=1
while [ $i -le 100 ]
do
let sum1=sum1+i
if [[ $(($i%2)) -ne 0 ]];then
let sum2=sum2+i
fi
let i=i+1
done
echo -en "sum1=$sum1\nsum2=$sum2\n"
使用while按行讀取文件
cat student.txt
john 30 boy
sue 28 girl
wang 25 boy
xu 23 girl
#!/bin/bash
while read LINE
do
NAME=`echo $LINE |awk '{print $1}'`
AGE=`echo $LINE |awk '{print $2}'`
SEX=`echo $LINE |awk '{print $3}'`
echo "My name is $NAME ,I'm $AGE years old ,I'm a $SEX ."
done < student.txt
until循環(huán)
until循環(huán)的語法結構為:
until expression
do
command
done
例子
#!/bin/bash
sum1=0
sum2=0
i=1
until [ $i -gt 100 ]
do
let sum1=sum1+i
if [[ $(($i%2)) -ne 0 ]];then
let sum2=sum2+i
fi
let i=i+1
done
echo -en "sum1=$sum1\nsum2=$sum2\n"
函數(shù)
shell中函數(shù)的語法結構為:
function FUNCTION_NAME( ){
command1
command2
…
}
#打印Hello的例子
#!/bin/bash
function sayHello(){
echo “Hello”
}
echo “Call function sayHello”
sayHello
#判斷文件是否存在在例子
#!/bin/bash
FILE=/etc/notExistFile
function checkFileExist(){
if [ -f $FILE ];then
return 0
else
return 1
fi
}
echo “Call function checkFileExist”
checkFileExist
if [ $? –eq 0 ];then
echo “$FILE exist”
else
echo “$FILE not exist”
fi
帶參數(shù)的函數(shù)
#!/bin/bash
FILE=/etc/notExistFile
function checkFileExist(){
if [ -f $FILE ];then
return 0
else
return 1
fi
}
echo “Call function checkFileExist”
checkFileExist $1
if [ $? –eq 0 ];then
echo “$FILE exist”
else
echo “$FILE not exist”
fi
#執(zhí)行腳本時候榜跌,輸入bash checkFileExist.sh /etc/passwd后面加上參數(shù)
下面是接受兩個參數(shù)的例子:
#!/bin/bash
function power(){
x=1
y=0
if [[ $2 –gt $y ]];then
for((i=1;i<=2;i++))
do
let “x=x*$1”
done
fi
echo $x
}
power $1 $2
#運行bash power.sh 2 2