linux學習筆記

基礎命令

主要的命令和快捷鍵

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

Cfor循環(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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市盅粪,隨后出現(xiàn)的幾起案子钓葫,更是在濱河造成了極大的恐慌,老刑警劉巖票顾,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件础浮,死亡現(xiàn)場離奇詭異,居然都是意外死亡奠骄,警方通過查閱死者的電腦和手機豆同,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來含鳞,“玉大人影锈,你說我怎么就攤上這事〔醣粒” “怎么了鸭廷?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長潜必。 經(jīng)常有香客問我靴姿,道長,這世上最難降的妖魔是什么磁滚? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任佛吓,我火速辦了婚禮宵晚,結果婚禮上,老公的妹妹穿的比我還像新娘维雇。我一直安慰自己淤刃,他們只是感情好,可當我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布吱型。 她就那樣靜靜地躺著逸贾,像睡著了一般漱竖。 火紅的嫁衣襯著肌膚如雪擎厢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天锄码,我揣著相機與錄音触徐,去河邊找鬼咪鲜。 笑死,一個胖子當著我的面吹牛撞鹉,可吹牛的內容都是我干的疟丙。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼鸟雏,長吁一口氣:“原來是場噩夢啊……” “哼享郊!你這毒婦竟也來了?” 一聲冷哼從身側響起孝鹊,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤炊琉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后又活,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體温自,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年皇钞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片松捉。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡夹界,死狀恐怖,靈堂內的尸體忽然破棺而出隘世,到底是詐尸還是另有隱情可柿,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布丙者,位于F島的核電站复斥,受9級特大地震影響,放射性物質發(fā)生泄漏械媒。R本人自食惡果不足惜目锭,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一评汰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧痢虹,春花似錦被去、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至丰捷,卻和暖如春坯墨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背病往。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工捣染, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人荣恐。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓液斜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親叠穆。 傳聞我的和親對象是個殘疾皇子少漆,可洞房花燭夜當晚...
    茶點故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內容