linux命令行和shell編程大全 學(xué)習(xí)筆記

【所有相關(guān)命令的基本語(yǔ)法可以通過(guò)man查看,善用man

第三章:基本的bash shell命令

1:關(guān)于bash 手冊(cè)

通過(guò)man可以調(diào)出bash手冊(cè)抹恳,包含了一些幫助信息振劳。

【man -k關(guān)鍵字】不記得命令名的時(shí)候可以這樣使用

Linux手冊(cè)頁(yè)的內(nèi)容區(qū)域知牌,CAT(1)也就是括號(hào)中的數(shù)字,一共有九個(gè)內(nèi)容區(qū)域


2:文件系統(tǒng)

Linux文件存儲(chǔ)在單個(gè)目錄結(jié)構(gòu)中站超,這個(gè)目錄稱為【虛擬目錄】荸恕;

安裝的第一塊硬盤稱為跟驅(qū)動(dòng)器,Linux會(huì)在根驅(qū)動(dòng)器上創(chuàng)建一些特別的目錄顷编,稱之為【掛載點(diǎn)戚炫,(掛載點(diǎn)是虛擬目錄中用于分配額外存儲(chǔ)設(shè)備的目錄)】

了解一些Linux常見(jiàn)頂層目錄,常見(jiàn)的目錄名基于【文件系統(tǒng)層級(jí)標(biāo)準(zhǔn)filesystem hierarchy standard FHS】


ls輸出的列表按照字母升序排列的媳纬,并且是按照列排列的双肤,支持過(guò)濾器施掏,請(qǐng)了解通配符

-i可以查看inode編號(hào)

ll輸出的相關(guān)說(shuō)明:

【文件類型,文件權(quán)限茅糜,硬鏈接總數(shù)七芭,文件屬主用戶名,文件屬組組名蔑赘,文件大欣瓴怠(單位是字節(jié)),文件上次修改時(shí)間缩赛,文件名】

【-F】標(biāo)識(shí)文件類型耙箍,目錄還是文件等等bi

【-h】大小易讀


touch創(chuàng)建一個(gè)空文件,如果已經(jīng)存在一個(gè)文件名為file1酥馍,touch file1后只會(huì)更改文件的修改時(shí)間辩昆,不會(huì)修改內(nèi)容,只想改變文件訪問(wèn)時(shí)間旨袒,指定 -a 參數(shù)汁针,此時(shí)使用【ls -l --time=atime 文件名】就可以看到文件的訪問(wèn)時(shí)間


【cp source destination】文件的復(fù)制,目的地是目錄時(shí)最好加上【/】,【-i】可以發(fā)出詢問(wèn)是否進(jìn)行覆蓋砚尽。cp -r dir ... 或者 cp -r dir/ ...都會(huì)包括目錄名進(jìn)行復(fù)制施无,只想復(fù)制內(nèi)容可以在目錄名下是用*


鏈接文件:【鏈接是目錄中指向真實(shí)位置的占位符】

·符號(hào)鏈接:一個(gè)實(shí)實(shí)在在的文件,指向虛擬目錄中的某一個(gè)文件必孤。為一個(gè)文件創(chuàng)建符號(hào)鏈接猾骡,該文件必須存在。創(chuàng)建方式【ln -s file sl_file】

·硬鏈接:只能對(duì)處于同一存儲(chǔ)媒體的文件創(chuàng)建硬鏈接敷搪。本質(zhì)上和源文件是同一個(gè)文件卓练。指向同一個(gè)iNode,所以刪除源文件后還是可以通過(guò)硬鏈接訪問(wèn)源文件购啄。無(wú)法對(duì)目錄生成硬鏈接。硬鏈接不會(huì)占用磁盤空間嘱么。

不要為軟鏈接文件創(chuàng)建軟鏈接


【mv oldname newname】進(jìn)行文件改名狮含,并且只會(huì)影響文件名,不改變iNode編號(hào)和時(shí)間戳曼振。

也可以用來(lái)移動(dòng)文件的位置几迄。


【rm options filename】刪除文件


【mkdir dirname】創(chuàng)建目錄,創(chuàng)建多級(jí)目錄使用參數(shù)【-p】


rmdir默認(rèn)只能刪除空目錄冰评,可以使用rm -r 刪除目錄



file用來(lái)查看文件的類型映胁,可以在訪問(wèn)之前稍微了解下文件,尤其是二進(jìn)制文件時(shí)甲雅,貿(mào)然直接訪問(wèn)可能會(huì)使終端仿真器掛起


查看文件的幾個(gè)命令

cat -n顯示行號(hào)解孙,-b有文本的才顯示行號(hào)坑填。

more支持分頁(yè)顯示文件,回車或者空格逐行移動(dòng)弛姜,只支持基本移動(dòng)脐瑰,更多高級(jí)功能需要使用less

less

tail查看結(jié)尾的文本,默認(rèn)最后10行廷臼,【-n 行數(shù)】控制顯示倒數(shù)多少行苍在,也可以直接【-行數(shù)】≤蹋【-f】參數(shù)可以在其他進(jìn)程使用文件時(shí)查看文件的內(nèi)容寂恬。進(jìn)行實(shí)時(shí)監(jiān)控

head查看文本的開(kāi)頭,默認(rèn)顯示開(kāi)頭10行莱没。


第四章:更多地bash shell命令

1:監(jiān)測(cè)進(jìn)程程序

ps探查進(jìn)程,參數(shù)很多初肉,【-e】顯示當(dāng)前系統(tǒng)正在運(yùn)行的進(jìn)程,【-f進(jìn)程信息的擴(kuò)展輸出】郊愧,BSD格式的參數(shù)l可以顯示更為詳細(xì)的進(jìn)程狀態(tài)朴译。進(jìn)程狀態(tài)STAT,R表示正在運(yùn)行,S表示睡眠属铁,Z表示僵化眠寿,進(jìn)程已經(jīng)結(jié)束但父進(jìn)程不存在,T代表停止焦蘑,第二個(gè)參數(shù)<:運(yùn)行在高優(yōu)先級(jí)上盯拱,N:運(yùn)行在低優(yōu)先級(jí)上,L:進(jìn)程所有頁(yè)面鎖定在內(nèi)存中例嘱,s:進(jìn)程為控制進(jìn)程狡逢,l:進(jìn)程是多線程的,+:進(jìn)程運(yùn)行在前臺(tái)

【--forest可以顯示進(jìn)程層級(jí)關(guān)系】


top進(jìn)行實(shí)時(shí)監(jiān)測(cè)拼卵,第一部分輸出系統(tǒng)概況奢浑。分別是:

第一行輸出當(dāng)前時(shí)間,系統(tǒng)運(yùn)行時(shí)間腋腮,登錄用戶數(shù)雀彼,以及系統(tǒng)平均負(fù)載,平均負(fù)載三個(gè)值分別為最近1分鐘即寡,5分鐘和15分鐘徊哑。

第二行顯示進(jìn)程概要信息,第三行顯示CPU概要信息聪富,第四行顯示物理內(nèi)存信息莺丑,第五行顯示交換空間信息。

PID:進(jìn)程的id墩蔓,USER:進(jìn)程屬主的名字梢莽,PR:進(jìn)程優(yōu)先級(jí)萧豆,NI:進(jìn)程謙讓程度

VIRT:進(jìn)程占用虛擬內(nèi)存總量 RES:進(jìn)程占用物理內(nèi)存總量

SHR:進(jìn)程和其他進(jìn)程共享的內(nèi)存總量

S:進(jìn)程狀態(tài)(D表示可中斷的休眠,R運(yùn)行蟹漓,S休眠炕横,T跟蹤或者停止,Z僵化)

%CPU:進(jìn)程使用的CPU時(shí)間比例

%MEM:進(jìn)程使用內(nèi)存占可用內(nèi)存的比例

TIME+:進(jìn)程啟動(dòng)到目前為止CPU時(shí)間總量

COMMAND:進(jìn)程啟動(dòng)的程序名


結(jié)束進(jìn)程葡粒,進(jìn)程之間的通信是通過(guò)信號(hào)來(lái)進(jìn)行的份殿。Linux進(jìn)程信號(hào):

1~HUP~掛起 2~INT~中斷 3~QUIT~結(jié)束運(yùn)行 9~KILL~無(wú)條件終止

11~SEGV~段錯(cuò)誤 15~TERM~盡可能終止 17~STOP~無(wú)條件停止運(yùn)行,但不終止

18~TSTP~停止或者暫停嗽交,但繼續(xù)在后臺(tái)運(yùn)行

19~CONT~在STOP或者TSTP之后恢復(fù)執(zhí)行


向運(yùn)行中的進(jìn)程發(fā)出進(jìn)程信號(hào)有兩個(gè)命令【發(fā)出進(jìn)程信號(hào)必須是進(jìn)程的屬主或者root用戶】

kill 只能通過(guò)PID給進(jìn)程發(fā)送信號(hào)P卿嘲,【-s】指定特定的信號(hào),kill -s HUP PID

killall支持通過(guò)進(jìn)程名結(jié)束進(jìn)程


2:監(jiān)測(cè)磁盤空間

1):掛載存儲(chǔ)媒體

mount夫壁,默認(rèn)輸出當(dāng)前系統(tǒng)上掛載的設(shè)備列表拾枣,提供的信息是:媒體的設(shè)備文件名,虛擬目錄掛載點(diǎn)盒让,文件系統(tǒng)類型梅肤,訪問(wèn)狀態(tài)

手動(dòng)掛載設(shè)備需要root權(quán)限。mount -t type device directory

type表示設(shè)備的文件系統(tǒng)類型邑茄,pc常用的有:vfat~windows長(zhǎng)文件系統(tǒng)姨蝴,ntfs~windows高級(jí)文件系統(tǒng),iso9660~標(biāo)準(zhǔn)CD-ROM文件系統(tǒng)

卸載存儲(chǔ)媒體

umount [dir|device]


2)查看磁盤信息

df輸出相關(guān)說(shuō)明

設(shè)備文件位置肺缕,能容納多少個(gè)1kB大小的塊左医,已經(jīng)用了多少個(gè)1kB的塊,還有多少個(gè)塊可用同木,已用空間占用的比例浮梢,設(shè)備掛載到了哪個(gè)掛載點(diǎn)上。

【-h】會(huì)使輸出信息易于閱讀

顯示的是Linux系統(tǒng)認(rèn)為的當(dāng)前值彤路,有可能運(yùn)行的進(jìn)程對(duì)文件做了一些改動(dòng)秕硝,但是沒(méi)有釋放文件,這個(gè)值是不會(huì)算進(jìn)閑置空間的


du,直接輸出為當(dāng)前目錄的相關(guān)信息洲尊。左邊表示占用的磁盤塊數(shù)缝裤,常用的參數(shù):

-c:顯示所有已經(jīng)列出文件總大小

-h:易讀

-s:顯示每個(gè)輸出參數(shù)的總計(jì)

-a:不僅僅是顯示目錄


3:處理數(shù)據(jù)文件

[if !supportLists]1)[endif]排序數(shù)據(jù)

sort默認(rèn)按照會(huì)話指定的默認(rèn)語(yǔ)言的排序規(guī)則進(jìn)行排序,【-n】識(shí)別數(shù)字進(jìn)行排序

【-M】識(shí)別三字符的月份颊郎,按照月份進(jìn)行排序

【-t】指定分隔字符

【-k】指定排序的字段

【-r】倒序排列

sort -t ‘:’?-k 3 -n /etc/passwd


[if !supportLists]2)[endif]搜索數(shù)據(jù)

grep options pattern file

【-v】反向搜索(輸出不匹配的記錄)

【-n】匹配的行所在的行號(hào)

【-c】顯示多少行含有匹配的模式

【-e】指定匹配模式 grep -e t -e f file,輸出file中所有包含t或者f的行

支持正則表達(dá)式

更多的搜索工具還有egrep,fgrep等

[if !supportLists]3)[endif]:壓縮數(shù)據(jù)

gzip為L(zhǎng)inux上最流行的壓縮工具

gzip用來(lái)壓縮文件,gzcat查看壓縮過(guò)的文本文件的內(nèi)容霎苗,gunzip解壓文件


[if !supportLists]4)[endif]:歸檔數(shù)據(jù)

tar

常見(jiàn)功能選項(xiàng)

-c:創(chuàng)建一個(gè)新的歸檔文件

-t:列出歸檔文件的內(nèi)容

-x:從tar歸檔文件中提取文件

常見(jiàn)命令選項(xiàng)

-f file:輸出結(jié)果到文件或者設(shè)備

-v:處理文件時(shí)顯示文件

-z:輸出重定向給gzip進(jìn)行壓縮


第五章:理解shell

【(command姆吭;command;command唁盏;...)】這是一個(gè)進(jìn)程列表内狸,會(huì)生成一個(gè)子shell

$BASH_SUBSHELL用來(lái)保存當(dāng)前的shell是什么shell检眯,0是父shell

另一種進(jìn)程列表創(chuàng)建方法是{command;}昆淡,這個(gè)并不會(huì)生成一個(gè)子shell


后臺(tái)模式

命令后使用&進(jìn)入后臺(tái)執(zhí)行

jobs會(huì)顯示所有的后臺(tái)進(jìn)程锰瘸,【-l】參數(shù)會(huì)顯示更多的信息

將進(jìn)程列表置于后臺(tái)模式,既可以在子shell中進(jìn)行繁重的處理工作昂灵,也不會(huì)讓子shell的I/O受制于終端


協(xié)程

協(xié)程同時(shí)處理兩件事情避凝,在后臺(tái)生成一個(gè)子shell并且在這個(gè)子shell中執(zhí)行命令

使用【coproc command】 進(jìn)行協(xié)程處理

將協(xié)程和可生成子shell的進(jìn)程列表一起使用,可以產(chǎn)生嵌套子shell


[if !supportLists]1)[endif]:外部命令

也被稱為文件系統(tǒng)命令眨补,通常位于【/bin,/usr/bin,/sbin,/usr/sbin】

外部命令執(zhí)行時(shí)管削,會(huì)創(chuàng)建出一個(gè)子進(jìn)程,這種操作稱之為“衍生(forking)”

正因?yàn)槿绱顺怕荩獠棵钸€是有些許代價(jià)的


2):內(nèi)建命令

內(nèi)建命令不需要使用子進(jìn)程來(lái)執(zhí)行

查看一個(gè)命令是否是內(nèi)建命令使用:type command

type -a command顯示命令的多種類型含思,如echo和pwd既有內(nèi)建命令也有外部命令

【!甘晤!能夠執(zhí)行上一條指令】

【含潘!編號(hào)】可以執(zhí)行歷史記錄中的相應(yīng)編號(hào)的命令

命令歷史記錄先保存在內(nèi)存中,shell退出時(shí)才會(huì)寫進(jìn)用戶目錄下的隱藏文件.bash_history.

將歷史命令記錄強(qiáng)制寫入文件需要使用【-a】




alias命令別名

【-p】查看當(dāng)前可用的別名

創(chuàng)建別名【alias newname=’commandschakan’】

命令別名屬于內(nèi)部命令线婚,一個(gè)別名只在它所被定義的shell進(jìn)程中有效

取消別名unalias name


本章小結(jié):能夠創(chuàng)建子進(jìn)程的命令:外部命令

能夠創(chuàng)建子shell的方法:執(zhí)行相關(guān)shell程序遏弱,如bash,tcsh,...酌伊;使用進(jìn)程列表腾窝,使用協(xié)程


第六章:使用Linux環(huán)境變量

環(huán)境變量分為兩類:局部環(huán)境變量和全局環(huán)境變量;全局環(huán)境變量對(duì)于shell會(huì)話和所有生成的子shell都是可見(jiàn)的居砖,局部環(huán)境變量只對(duì)創(chuàng)建他們的shell可見(jiàn)虹脯。

【全局環(huán)境變量對(duì)那些所創(chuàng)建的子shell獲取父shell信息的程序來(lái)說(shuō)非常有用】


1):全局環(huán)境變量

查看:【printenv】或者【env】查看特定的環(huán)境變量使用前者,如printenv JAVA_HOME

使用【echo $varName】也可以顯示變量值


【set】顯示為某個(gè)特定進(jìn)程設(shè)置的所有環(huán)境變量奏候,包括局部變量循集,全局變量,和用戶自定義變量蔗草。沒(méi)有特殊的命令可以顯示局部環(huán)境變量


創(chuàng)建自定義全局環(huán)境變量【export】

【修改子shell中全局環(huán)境變量并不會(huì)影響父shell中該變量的值咒彤,即使使用export也不行】

刪除環(huán)境變量【unset varName】

【一般;關(guān)于$的使用:如果要用到變量咒精,需要使用镶柱;操作變量,不需要使用】

同樣模叙,子shell中刪除一個(gè)環(huán)境變量父shell中依然不受影響

父shell中的局部變量子shell中也無(wú)法使用


2):path環(huán)境變量

可以臨時(shí)修改path變量歇拆;PATH=....


3):定位系統(tǒng)環(huán)境變量

啟動(dòng)bash shell的三種方式

登錄時(shí)作為默認(rèn)登錄shell

作為非登錄shell的交互式shell

作為運(yùn)行腳本的非交互shell


作為默認(rèn)登錄shell啟動(dòng)時(shí),登錄shell會(huì)從五個(gè)不同的啟動(dòng)文件中讀取故觅;分別是

/etc/profile

$HOME/.bash_profile

$HOME/.bashrc

$HOME/.bash_login

$HOME/.profile


交互式shell進(jìn)程啟動(dòng)時(shí)厂庇,比如在命令行下執(zhí)行bash,就會(huì)啟動(dòng)一個(gè)交互式shell输吏,只會(huì)檢查$HOME/.bashrc文件


非交互式shell時(shí)权旷,例如運(yùn)行shell腳本,這個(gè)時(shí)候會(huì)檢查BASH_ENV這個(gè)環(huán)境變量贯溅。


4):關(guān)于環(huán)境變量持久化

【直接在/etc/profile中修改變量不是一個(gè)好主意拄氯,因?yàn)闀?huì)隨著發(fā)行版的升級(jí)而更新從而導(dǎo)致自己修改的變量設(shè)置失效】

好的方法是在/etc/profile.d下創(chuàng)建一個(gè).sh結(jié)尾的文件,將所有的新的或者修改過(guò)的全局變量設(shè)置放在這個(gè)文件中.


5):數(shù)組變量

varName=(varValue0 varValue1 varValue2),將變量值放在小括號(hào)中,中間使用空格隔開(kāi)

數(shù)組下標(biāo)從0開(kāi)始,如echo ${varName[1]}將輸出varValue1,顯示整個(gè)數(shù)組,索引使用[*]


第七章:Linux的安全性

1):用戶控制,主要通過(guò)兩個(gè)文件

/etc/passwd文件,各個(gè)字段的信息如下

登錄用戶名;用戶密碼;用戶賬戶UID,用戶賬戶GID,用戶賬戶文本描述,用戶HOME目錄位置,用戶默認(rèn)shell

/etc/shadow

登錄名,加密后的密碼,自上次修改密碼之后過(guò)去的天數(shù)密碼,多少天后才能更改密碼,多少天后必須更改密碼,密碼過(guò)期前提前多少天提醒用戶更改密碼,密碼過(guò)期多少天后禁用賬戶,賬戶被禁用日期,預(yù)留字段.


2):添加新用戶

useradd,可以一次性創(chuàng)建新用戶賬戶以及設(shè)置用戶home目錄

如:[useradd -u 544 -d /usr/testuser1? -g users -m? testuser1 ]建立一個(gè)新用戶賬戶testuser1,并設(shè)置UID為544盗迟,主目錄為/usr/testuser1坤邪,屬于users組

[-D]可以查看創(chuàng)建用戶時(shí)的一些默認(rèn)值

-m創(chuàng)建用戶的home目錄

-p指定用戶密碼


3):刪除用戶

userdel,默認(rèn)只會(huì)刪除/etc/passwd文件中的用戶信息,并不會(huì)刪除系統(tǒng)中屬于這個(gè)賬戶的任何文件

[-r]可以刪除用戶目錄,但是可能會(huì)有一些問(wèn)題,在刪除用戶主目錄時(shí)請(qǐng)一定慎重


[關(guān)于改變文件屬主屬組

chown user:group ?file

chgrp group file

]

4):修改用戶

usermod:修改用戶賬戶的字段

[-g]修改默認(rèn)的登錄組

[-l]修改登錄名

[-L]鎖定賬戶,用戶將無(wú)法登錄

[-p]修改賬戶密碼

[-U]解除鎖定zifu


passwd user root用戶用來(lái)修改別人的密碼,用戶自己只能修改自己的密碼

chpasswd可以為大量用戶修改密碼,能夠從標(biāo)準(zhǔn)輸入讀取登錄名密碼對(duì)(冒號(hào)分隔),進(jìn)行相應(yīng)的設(shè)置

注意,如果一個(gè)用戶在/etc/passwd文件中指定某個(gè)組為默認(rèn)用戶組時(shí),這個(gè)時(shí)候用戶賬戶不會(huì)作為該組成員再次出現(xiàn)在/etc/group中

groupadd groupname可以增加一個(gè)新組

添加用戶到一個(gè)組中可以使用usermod ?-g groupname username,注意,-g表示指定的組將會(huì)成為整個(gè)用戶的默認(rèn)組,如果使用-G,則不會(huì)影響用戶的默認(rèn)組


5):理解文件權(quán)限

- 文件

d 目錄

l 鏈接

c 字符型設(shè)備

b 塊設(shè)備

n 網(wǎng)絡(luò)設(shè)備

ll顯示的鏈接數(shù)是指對(duì)inode的硬鏈接數(shù)目

用戶創(chuàng)建文件的默認(rèn)權(quán)限可以由umask進(jìn)行設(shè)置,命令行輸入umask會(huì)顯示當(dāng)前用戶創(chuàng)建文件的umask,注意,umask的值是對(duì)象的全權(quán)限減掉的那個(gè)值,目錄的全權(quán)限是777,文件的全權(quán)限是666;

umask xxx可以設(shè)置新的umask值


chmod改變文件權(quán)限 -R參數(shù)可以進(jìn)行遞歸修改

u 用戶

g 組

o 其他

a 上述所有


第七章:Linux的文件系統(tǒng)









第九章:熟悉常用的編輯器

vim,emacs,kde,gnome

vim常用的命令

hjkl:左下上右

ctrl+F下一屏

Ctrl+B上一屏

gg第一行

G 最后一行


冒號(hào)后可以使用的命令

q! 強(qiáng)制退出,取消所有對(duì)緩沖區(qū)數(shù)據(jù)的修改

w filename 保存到文件名

wq 將緩沖區(qū)數(shù)據(jù)保存到文件中并且退出


編輯數(shù)據(jù)時(shí)使用的命令

x 刪除當(dāng)前光標(biāo)所在位置的字符

dd 刪除當(dāng)前光標(biāo)所在的行

dw 刪除當(dāng)前光標(biāo)所在位置的單詞

d$ 刪除當(dāng)前光標(biāo)所在位置到行尾的內(nèi)容

J 刪除當(dāng)前光標(biāo)所在行行尾的換行符

u 撤銷前一個(gè)編輯命令,如刪除,插入等

a 在當(dāng)前光標(biāo)后追加數(shù)據(jù)

A 在當(dāng)前光標(biāo)所在行的行尾追加數(shù)據(jù)

r char 用char替換當(dāng)前光標(biāo)所在位置的單個(gè)字符

R text 用text覆蓋當(dāng)前光標(biāo)所在位置的數(shù)據(jù),直至按下esc


注意:有些命令允許在前面加上數(shù)字,表示重復(fù)執(zhí)行命令的次數(shù)

剪切實(shí)際上就是刪除之后在拿回來(lái),實(shí)際上刪除的數(shù)據(jù)會(huì)保存在一個(gè)單獨(dú)的寄存器中,使用p可以取出寄存器中的內(nèi)容,實(shí)際上就完成了粘貼.

yw表示復(fù)制一個(gè)單詞

y$表示復(fù)制到行尾

同樣使用p取出


查找和替換

普通模式下按下斜線

輸入想要查找的內(nèi)容,n切換下一個(gè)


替換

:s/old/new/跳到第一次出現(xiàn)的地方并且使用new替換

:s/old/new/g 替換所有的old

:n.ms/old/new/g 替換行號(hào)n和m之間的所有old

:%s/old/new/g 替換整個(gè)文件中的所有old

:%s/old/new/gc 替換整個(gè)文件中的所有old,但是每次替換會(huì)需要確認(rèn)


第二部分:shell腳本編程基礎(chǔ)

第十章:構(gòu)建基本腳本

雙引號(hào)中可以使用轉(zhuǎn)義,可以解析變量

shell中自定義用戶變量區(qū)分大小寫

變量等號(hào)和值之間不能出現(xiàn)空格

在shell腳本整個(gè)生命周期變量都會(huì)保持他們的值,在腳本完成時(shí)刪除

反引號(hào)允許將命令的執(zhí)行結(jié)果賦值給變量


1):重定向

>輸出重定向,會(huì)覆蓋重定向文件中的原來(lái)數(shù)據(jù)

>>追加重定向,會(huì)在重定向文件的末尾追加數(shù)據(jù)

<輸入重定向

<<內(nèi)聯(lián)輸入重定向,需要制定一個(gè)分隔符,之后會(huì)提示一直輸入字符,直到輸入分隔符


2):管道操作符

|管道的兩個(gè)命令不是一個(gè)一個(gè)地運(yùn)行,而是同時(shí)運(yùn)行,在系統(tǒng)內(nèi)部將他們連接起來(lái).在的第一個(gè)命令產(chǎn)生輸出的同時(shí),輸出會(huì)被立即送到第二個(gè)命令,不會(huì)用到任何中間文件或者緩沖區(qū)域


3):對(duì)數(shù)字進(jìn)行操作

$[math expression]可以進(jìn)行數(shù)學(xué)運(yùn)算

注意,bash shell的這種運(yùn)算只會(huì)進(jìn)行整數(shù)運(yùn)算,不能進(jìn)行浮點(diǎn)數(shù)運(yùn)算

bash的浮點(diǎn)解決方案--bash計(jì)算器,即bc

bc可以識(shí)別:數(shù)字,變量,注釋#或者/**/.表達(dá)式,編程語(yǔ)句,函數(shù)

命令行執(zhí)行bc,小數(shù)位數(shù)由bc的內(nèi)建變量scale控制,必須設(shè)置這個(gè)變量值才可以顯示想要的結(jié)果;

退出bc請(qǐng)使用quit


4):如何退出腳本

退出狀態(tài)碼:

0成功結(jié)束

1通用未知錯(cuò)誤

2誤用shell命令

126命令不可執(zhí)行

127沒(méi)找到命令

128無(wú)效退出參數(shù)

128+x信號(hào)x的嚴(yán)重錯(cuò)誤

130命令通過(guò)ctrl+c終止

255退出狀態(tài)碼越界

使用[exit數(shù)字] 自定義退出狀態(tài)碼


第十一章:使用結(jié)構(gòu)化命令

1):if-then語(yǔ)句

if command

then

command

fi

if之后的對(duì)象是個(gè)命令,如果這個(gè)命令成功運(yùn)行(退出碼是0),那么相當(dāng)于判斷為真

注意:if后的命令是會(huì)執(zhí)行的!!!


2):if-then-else語(yǔ)句

if command

then

command

else

command

fi


3):嵌套if,使用elif


4):test命令

test condition如果條件成立,退出返回狀態(tài)碼0,不成立退出返回狀態(tài)碼1

可以判斷三類條件:

數(shù)值比較,字符串比較和文件比較.

if test condititon或者 if [ condition ]注意,方括號(hào)兩端需要有空格


數(shù)值比較:

x -eq yx和y 是否相等

-ge大于或者等于

-gt大于

-le小于或者等于

-lt小于

-ne不等于


字符串比較

=!=<>-n檢測(cè)字符串長(zhǎng)度是否不為0 -z檢測(cè)字符串長(zhǎng)度是否為0

比較相等時(shí),所有的標(biāo)點(diǎn)和大小寫均處于考慮之中

比較大小時(shí),

大于或者小于號(hào)必須進(jìn)行轉(zhuǎn)義,避免和重定向符號(hào)沖突;大于小于順序和sort采用的并不相同,test命令使用的是標(biāo)準(zhǔn)ASCII排序, 但是sort使用的是本地化的設(shè)置


文件比較



-d file檢測(cè)file是否存在并且是一個(gè)目錄

-f file檢測(cè)file是夠存在并且是一個(gè)文件

-e file檢測(cè)file是否存在

-s file檢測(cè)file是否存在并且非空

-r w x file檢測(cè)file是否存在并且可讀可寫可執(zhí)行

-O file檢測(cè)file是否存在并且屬于當(dāng)前用戶

-G file檢測(cè)file是否存在并且默認(rèn)組合當(dāng)前用戶相同

file1 -nt file2檢測(cè)file1是否比f(wàn)ile2新

file1 -ot file2檢測(cè)file1是否比f(wàn)ile2舊


既然使用了test,那么就可以使用邏輯運(yùn)算符&&和||


5):使用雙括號(hào)

((expression))可以進(jìn)行各種運(yùn)算,自增,自減,位運(yùn)算等等

可以用在if語(yǔ)句中


6):使用雙方括號(hào)

[[ expression ]],提供了針對(duì)字符串比較的高級(jí)特性,可以使用模式匹配

可以用在if語(yǔ)句中


7):使用case

case variable in

pattern1|pattern2) commands;;

pattern3) commands;;

*) default commands;;

esac

注意,上面的命令結(jié)束之處是分號(hào)


8):for循環(huán)語(yǔ)句

for var in list

do

commands

done


list中的每個(gè)量之間使用空格隔開(kāi),如果list中某個(gè)值需要空格,請(qǐng)使用雙引號(hào)


[IFS:內(nèi)部字段分隔符,默認(rèn)是空格,制表符和換行.可以修改,IFS=$’\n’,將只會(huì)識(shí)別換行符,請(qǐng)注意,修改之前請(qǐng)備份這個(gè)環(huán)境變量,以便之后進(jìn)行恢復(fù).]


9):while循環(huán)

while test command

do

commands

done

while可以指定多個(gè)測(cè)試命令,只有最后一個(gè)命令的返回碼產(chǎn)生效果


10):until命令

until test condition

do

commands

done


只有test返回的退出狀態(tài)碼是0時(shí)才結(jié)束循環(huán),這一點(diǎn)恰好和while相反


11):break,跳出一個(gè)循環(huán)

break n可以指定跳出哪一層循環(huán),默認(rèn)是1,也就是當(dāng)前循環(huán),2表示跳出外層循環(huán)

12):continue忽略一次循環(huán)體的執(zhí)行,同樣可以指定外部還是內(nèi)部循環(huán)


在done之后使用重定向符號(hào)可以將循環(huán)體中的輸出重定向到指定的文件或者設(shè)備中,而不是直接顯示在屏幕上,同樣,也可以使用管道符號(hào)


第十三章:處理用戶輸入

1):命令行參數(shù)

稱為位置參數(shù),$0表示當(dāng)前運(yùn)行的程序名,basename $0 可以過(guò)濾掉路徑名,只顯示程序的名稱.


幾個(gè)特殊的參數(shù)

$#記錄命令行參數(shù)的個(gè)數(shù)

$*將所有參數(shù)當(dāng)做一個(gè)參數(shù)

$@將所有參數(shù)看做獨(dú)立的參數(shù),可以進(jìn)行遍歷


shift n將參數(shù)向前移動(dòng)n位,也就是前面的參數(shù)會(huì)被后面的參數(shù)取代,參數(shù)長(zhǎng)度變短


2):getopt命令

getopt可以將命令行的輸入?yún)?shù)進(jìn)行標(biāo)準(zhǔn)化,將合并在一起的選項(xiàng)進(jìn)行拆分,參數(shù)和選項(xiàng)之間采用--分隔,使用時(shí),將可能在一合并的選項(xiàng)列出,多個(gè)則中間使用:連接

getopt -q ab:cd -a -b test -cd test1 test2

-a -b test -c -d -- test1 test2

-q表示忽略前面沒(méi)有指定的合并選項(xiàng),使之不會(huì)產(chǎn)生錯(cuò)誤


3):getopts

是對(duì)getopt的功能的擴(kuò)展

getopts optstring variable,例如 getopts :ab:c opt

:表示忽略錯(cuò)誤

解析命令行選項(xiàng)時(shí),會(huì)過(guò)濾其中的-,只會(huì)顯示選項(xiàng)的字母

可以識(shí)別含有空格的參數(shù)

將未定義的選項(xiàng)解析成?


4):通用的Linux選項(xiàng)

-a顯示所有對(duì)象

-c生成一個(gè)計(jì)數(shù)

-d指定一個(gè)目錄

-e擴(kuò)展一個(gè)對(duì)象

-f指定讀入數(shù)據(jù)的文件

-h顯示命令的幫助信息

-i忽略文本大小寫

-l產(chǎn)生輸出的長(zhǎng)格式輸出

-n使用非交互模式

-o指定將所有輸出重定向到的文件

-q安靜模式運(yùn)行

-r遞歸處理目錄和文件

-v生成詳細(xì)輸出

-x排除某個(gè)對(duì)象

-y對(duì)所有問(wèn)題回答yes


5):獲取用戶的輸入

read varName

用戶輸入的內(nèi)容會(huì)保存在varName中

read -p提示字符 varName1 varName2 ...

如果不指定變量,那么會(huì)將數(shù)據(jù)放在特殊環(huán)境變量REPLY中


可以使用[-t]指定計(jì)時(shí)器,在到達(dá)時(shí)間后,指令會(huì)以非零退出狀態(tài)碼退出.

-t之后參數(shù)為整數(shù),表示等待輸入的秒數(shù)

-nl指定接受單個(gè)字符之后退出,無(wú)需enter鍵

-s以隱藏方式進(jìn)行讀取,實(shí)際上是將文本顏色和背景顏色調(diào)節(jié)成一致的

read還可以讀取文件,一次讀一行,利用管道技術(shù)


第十四章:呈現(xiàn)數(shù)據(jù)

1:理解輸入和輸出

Linux中的所有對(duì)象都被認(rèn)為是文件,每次會(huì)話過(guò)程最多可以有九個(gè)文件描述符,bash保留了最早的三個(gè),0,1,2,分別是標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸出,標(biāo)準(zhǔn)錯(cuò)誤

1>標(biāo)準(zhǔn)輸出重定向

2>標(biāo)準(zhǔn)錯(cuò)誤重定向

&>標(biāo)準(zhǔn)輸入和錯(cuò)誤重定向,錯(cuò)誤信息顯示的優(yōu)先級(jí)更高shu

&1重定向到標(biāo)準(zhǔn)輸出的文件描述符,在腳本使用之后,指定腳本,所有出現(xiàn)這個(gè)符號(hào)的都會(huì)重定向到執(zhí)行腳本時(shí)1>指定的文件

如:echo“this is a error message”>&2 (>&中間沒(méi)有空格)為a.sh

執(zhí)行sh a.sh 2> a.txt,那么這行信息將會(huì)到a.txt中

&2同理


2):永久重定向

exec 1>file

接下來(lái)的所有標(biāo)準(zhǔn)輸出全部都會(huì)重定向到指定的文件

同理,重定向輸入 exec 0< file,只要腳本需要輸入,輸入的數(shù)據(jù)都來(lái)自file


2:創(chuàng)建文件描述符

1):創(chuàng)建輸出文件描述符

使用exec進(jìn)行指定,例如 exec 3>test3out,接下來(lái)只要是重定向到3的輸出,都會(huì)重定向到test3out里

2):可以重定向文件描述符

exec 3>&1

exec 1>file

exec 1>&3

相當(dāng)于輸出到3將會(huì)顯示在屏幕上,標(biāo)準(zhǔn)輸出將會(huì)寫入文件,最后復(fù)原

這中間使用到了其他的文件描述符作為中間量


關(guān)閉問(wèn)價(jià)描述符;如[exec 3>&-] 將會(huì)關(guān)閉文件3這個(gè)文件描述符

查看當(dāng)前系統(tǒng)打開(kāi)的所有文件描述符lsof -a -p $$ -d 0,1,2,3,4,...

-p指定進(jìn)程號(hào),-d指定文件描述符


2:阻止命令輸出

當(dāng)腳本運(yùn)行在后臺(tái)時(shí),一般不希望腳本輸出

可以將stderr重定向到/dev/null文件,你這樣腳本的錯(cuò)誤信息將會(huì)被丟棄,因?yàn)閚ull文件不會(huì)保存任何數(shù)據(jù)


3:創(chuàng)建臨時(shí)文件

mktemp創(chuàng)建臨時(shí)文件,一定要在文件名結(jié)尾輸入6個(gè)X,如:mktemp testXXXXXX

[-t]將會(huì)強(qiáng)制在/tmp下創(chuàng)建臨時(shí)文件

[-d]創(chuàng)建臨時(shí)目錄

此命令會(huì)返回創(chuàng)建的文件的全路徑


4:同時(shí)記錄

tee file這個(gè)命令將會(huì)把標(biāo)準(zhǔn)輸入的數(shù)據(jù)發(fā)送到標(biāo)準(zhǔn)輸出和file

[-a]追加模式


第十五章:控制腳本

進(jìn)程信號(hào)重溫

1 SIGHUP掛起

2 SIGINT終止

3 SIGQUIT停止進(jìn)程

9 SIGKILL無(wú)條件終止

15 SIGTERM可能的話終止進(jìn)程

17 SIGSTOP無(wú)條件停止進(jìn)程

18 SIGTSTP停止或者暫停進(jìn)程

19 SIGCONT繼續(xù)運(yùn)行停止的進(jìn)程

bash默認(rèn)會(huì)忽略3和15信號(hào).

1:產(chǎn)生信號(hào)

1):終止進(jìn)程 ctrl+c 生成SIGINT信號(hào),終止信號(hào)

2):暫停進(jìn)程 ctrl+z 生成SIGTSTP信號(hào),停止shell中運(yùn)行的任何進(jìn)程

[停止進(jìn)程會(huì)讓進(jìn)程繼續(xù)保留在內(nèi)存中,并且可以從上次停止的位置繼續(xù)運(yùn)行]


2:捕捉信號(hào)

trap commands signals

如: trap“echo ‘?i can trap the signal ’”SIGINT,在鍵盤ctrl+C時(shí),并不會(huì)終止腳本的運(yùn)行,而是會(huì)執(zhí)行上面指定的語(yǔ)句,打印輸出


移除捕捉信號(hào)trap - EXIT ...


3:后臺(tái)進(jìn)程

執(zhí)行時(shí)在進(jìn)程后面加上&

如果想要在退出終端會(huì)話后后臺(tái)進(jìn)程依然能夠運(yùn)行,使用nohup

nohup command &會(huì)將產(chǎn)生的輸出重定向到腳本同級(jí)目錄下的nohup.out


4:作業(yè)控制

1):查看作業(yè)

jobs查看shell當(dāng)前正在運(yùn)行的作業(yè)

[-l]列出進(jìn)程的pid以及作業(yè)號(hào)

[-n] 只列出上次shell發(fā)出的通知后改變了狀態(tài)的作業(yè)

[-p] 只列出作業(yè)的pid

[-r] 只列出運(yùn)行中的作業(yè)

[-s] 只列出已停止的作業(yè)

輸出中的加號(hào)和減號(hào)表示:加號(hào)會(huì)被當(dāng)做默認(rèn)作業(yè),在使用作業(yè)控制命令時(shí),如果未在命令行指定任何作業(yè)號(hào),該作業(yè)會(huì)被當(dāng)成操作對(duì)象,帶減號(hào)的作業(yè)會(huì)在當(dāng)前默認(rèn)作業(yè)完成處理時(shí)稱為下一個(gè)默認(rèn)作業(yè).任何時(shí)候都只有一個(gè)加號(hào)作業(yè)和一個(gè)減號(hào)作業(yè).


2):重啟停止的作業(yè)

以后臺(tái)模式重啟[bg作業(yè)號(hào)]

前臺(tái)模式啟動(dòng)[fg作業(yè)號(hào)]


5:調(diào)整謙讓度

優(yōu)先級(jí)是個(gè)整數(shù)值,范圍:-20~20,數(shù)字越大,優(yōu)先級(jí)越小

默認(rèn),bash以優(yōu)先級(jí)0啟動(dòng)所有進(jìn)程


nice改變優(yōu)先級(jí)

nice -n -優(yōu)先級(jí)數(shù)字 command

nice會(huì)阻止普通系統(tǒng)用戶增加命令的優(yōu)先級(jí).



renice改變已經(jīng)在運(yùn)行的命令的優(yōu)先級(jí),通過(guò)進(jìn)程pid

renice優(yōu)先級(jí)數(shù)字 -p pid

只能對(duì)屬于你的進(jìn)程執(zhí)行

只能通過(guò)renice降低進(jìn)程的優(yōu)先級(jí),root用戶沒(méi)有限制


6:定時(shí)任務(wù)

at允許指定Linux系統(tǒng)何時(shí)運(yùn)行腳本,at命令會(huì)將作業(yè)提交到隊(duì)列中,at的守護(hù)進(jìn)程atd會(huì)以后臺(tái)模式運(yùn)行.

at [ -f filename ] time

默認(rèn)將標(biāo)準(zhǔn)輸入放到隊(duì)列,-f可以指定文件,time指定運(yùn)行時(shí)間

可識(shí)別的時(shí)間格式:

標(biāo)準(zhǔn)的小時(shí)分鐘格式,如02:44

~AM/~PM指示符,比如02:44~PM

特定可命名的時(shí)間,比如now,noon,midnight,teatime

如果指定了一個(gè)過(guò)去的時(shí)間,會(huì)在第二天該時(shí)間運(yùn)行

還可以指定各種日期格式,或者時(shí)間增量


針對(duì)不同的優(yōu)先級(jí),存在26種不同的作業(yè)隊(duì)列,使用小寫字母a-z進(jìn)行表示,作業(yè)隊(duì)列字母排序越高,作業(yè)運(yùn)行的優(yōu)先級(jí)就越低

[-q]指定作業(yè)的隊(duì)列


atq查看當(dāng)前系統(tǒng)中哪些作業(yè)正在等待


atrm刪除作業(yè)

[atrm作業(yè)號(hào)],只能刪除自己提交的作業(yè)


7:定期執(zhí)行

cron時(shí)間表

cron唯一問(wèn)題是假定系統(tǒng)是7*24小時(shí)運(yùn)行的


8:啟動(dòng)時(shí)運(yùn)行




第三部分:高級(jí)shell腳本編程

第十六章:創(chuàng)建函數(shù)

1:創(chuàng)建函數(shù)

風(fēng)格1

function name {commands}

風(fēng)格2

name(){commands}

2:返回值

bash會(huì)吧函數(shù)當(dāng)做一個(gè)小型腳本,運(yùn)行結(jié)束后會(huì)有一個(gè)退出狀態(tài)碼.,三種方法可以為函數(shù)生成退出狀態(tài)碼.默認(rèn)是函數(shù)中最后一條命令的退出狀態(tài)碼,這是很危險(xiǎn)的.

1):使用return

return可以退出函數(shù)并返回特定的退出狀態(tài)碼.允許指定一個(gè)整數(shù)值定義函數(shù)的退出狀態(tài)碼,但是受到返回狀態(tài)碼限制,返回狀態(tài)碼不能超過(guò)255;


2):將函數(shù)的輸出給變量賦值

a=`fun`,會(huì)將函數(shù)fun中的echo 輸出賦值給a


3:函數(shù)中變量的使用

把函數(shù)當(dāng)做一個(gè)腳本,如何給腳本傳遞參數(shù),就如何給函數(shù)傳遞參數(shù).,必須在使用函數(shù)的當(dāng)時(shí)傳遞參數(shù)

1):函數(shù)中使用的變量類型:全局變量和局部變量

設(shè)置局部變量,使用 [local 變量名]

2):數(shù)組變量

不能把數(shù)組變量直接作為函數(shù)的參數(shù)

可用的方法是將數(shù)組打散作為參數(shù),在函數(shù)內(nèi)部進(jìn)行組合

3)從函數(shù)返回?cái)?shù)組,只要輸出數(shù)組中的所有元素,再用一個(gè)變量接受函數(shù)賦值

4):函數(shù)遞歸


4:創(chuàng)建庫(kù)

創(chuàng)建函數(shù)庫(kù)文件,可以在多個(gè)腳本需要使用該功能時(shí)進(jìn)行調(diào)用

調(diào)用庫(kù)文件時(shí),會(huì)在一個(gè)新的shell中,這就涉及到作用域的問(wèn)題

使用source,會(huì)在當(dāng)前上下文中執(zhí)行,source可以使用[.]代替


5:命令行上創(chuàng)建函數(shù)

一行創(chuàng)建時(shí)必須每個(gè)命令結(jié)束時(shí)候使用分號(hào),多行創(chuàng)建時(shí)不需要


6:在.bashrc文件中定義函數(shù),這樣,每次啟動(dòng)shell時(shí)候都會(huì)加載,不論交互式還是從現(xiàn)有的shell中啟動(dòng)一個(gè)新的shell

(1):直接定義函數(shù)

(2):讀取函數(shù)文件,只要在shell腳本中都可以使用source或者點(diǎn)操作符來(lái)將已有的庫(kù)文件加入到當(dāng)前腳本中

(3):shell會(huì)將定義好的函數(shù)傳給子shell進(jìn)程,這樣這些函數(shù)在該shell會(huì)話的任何shell腳本中都可以使用


第十七章:圖形化桌面上的腳本編程

1:創(chuàng)建文本菜單

可以使用echo輸出一些字符串,作為菜單,然后使用read讀取用戶的輸入,根據(jù)輸入執(zhí)行對(duì)應(yīng)的函數(shù).

2:創(chuàng)建菜單函數(shù)

通常我們會(huì)為還沒(méi)有實(shí)現(xiàn)的函數(shù)創(chuàng)建一個(gè)樁函數(shù)(沒(méi)有任何命令或者只有echo語(yǔ)句說(shuō)明的函數(shù))

一般,可以將菜單布局本身作為一個(gè)函數(shù)來(lái)創(chuàng)建

如: function menu{

clear

echo

echo -e “\t\t sys admin menu”

echo -e “\t1. display disk space”

echo -e “\t2. display logged on ?usage”

echo -e “\t3. display memory usag”

echo -e “\t0. exit program”

echo -en “\t\t ?enter your option”

read -n 1 option

}


創(chuàng)建菜單布局可以使用select命令

select variable in list

do

commands

done

其中,list是菜單中要顯示的字符串


第十八章:初識(shí)sed和gawk

1:文本處理

1):sed編輯器(流編輯器stream editor),數(shù)據(jù)的處理過(guò)程是按照行來(lái)讀取的,對(duì)每一行都采用相同的一套定義的規(guī)則.

[sed options script file]

-e script在處理輸入時(shí),將script中指定的命令添加到運(yùn)行的命令中

-f file處理輸入時(shí),將file中指定的命令添加到運(yùn)行的命令中

-n 不要為每個(gè)命令生成輸出,等待print命令來(lái)輸出

sed命令不會(huì)修改原始文件,只是將修改后的文件顯示在標(biāo)準(zhǔn)輸出上

sed可以同時(shí)指定多個(gè)命令 如sed ?-e ‘s/xxx/xxx/ ;s/xxx/xxx/’file,注意,命令之間必須使用分號(hào)間隔,命令末尾和分號(hào)之間不能有空格.

可以把多個(gè)命令寫在一個(gè)文件中,使用echo -f scriptfile file


2):gawk,原始awk的GNU版本

提供了一種編程語(yǔ)言而不只是編輯器命令,在這種編程語(yǔ)言中,你可以:

定義變量來(lái)保存數(shù)據(jù);

使用算數(shù)和字符串操作符來(lái)處理數(shù)據(jù);

使用結(jié)構(gòu)化編程概念,如if-then語(yǔ)句和循環(huán)為數(shù)據(jù)處理增加邏輯

提取數(shù)據(jù)文件中的數(shù)據(jù)元素并將他們按照另一順序或格式重新放置,生成格式化報(bào)告

[gawk options program file]

-F fs指定行中分隔數(shù)據(jù)字段的字段分隔符

-f file指定讀取程序的文件名

-v var=value 定義gawk程序中的一個(gè)變量及其默認(rèn)值

-mf N 指定要處理的數(shù)據(jù)文件中的最大字段數(shù)

-mr N 指定數(shù)據(jù)文件中最大數(shù)據(jù)行數(shù)

-W keyword 指定gawk的兼容模式或者警告等級(jí)


<1>從命令行讀取程序腳本

程序腳本使用一堆花括號(hào)定義,必須將腳本命令放到兩個(gè)括號(hào)中.gawk命令行假定腳本是單個(gè)文本字符串,必須將腳本放到單引號(hào)中

ctrl+D會(huì)產(chǎn)生一個(gè)EOF字符

<2>使用數(shù)據(jù)字段變量

gawk會(huì)自動(dòng)給每行中每個(gè)數(shù)據(jù)元素分配一個(gè)變量,默認(rèn)情況下,變量分配如下:

$0代表整個(gè)文本行

$n代表第n個(gè)數(shù)據(jù)字段

數(shù)據(jù)字段通過(guò)字段分隔符進(jìn)行劃分.gawk默認(rèn)的字段分隔符是任意空白字符(制表符,空格)

可以執(zhí)行多個(gè)命令,中間使用分號(hào)隔開(kāi),如:gawk ‘{print $1;$2=”hell”}’?data

同樣可以把命令寫入文件再進(jìn)行引用,gawk -f commandfile file

gawk可以設(shè)置變量,使用變量不需要使用美元符

<3>:在處理數(shù)據(jù)之前運(yùn)行腳本

BEGIN會(huì)強(qiáng)制gawk在讀取數(shù)據(jù)之前至執(zhí)行BEGIN后面的第一個(gè)程序腳本,執(zhí)行后直接退出 gawk ‘BEGIN{print “hello”}’

如果要繼續(xù)執(zhí)行處理腳本中的數(shù)據(jù),繼續(xù)使用腳本

gawk ‘BEGIN{xxx}{yyyy}’file ?yyyy就是執(zhí)行數(shù)據(jù)處理的腳本

同樣,END用來(lái)指定其后的一個(gè)腳本是在數(shù)據(jù)處理結(jié)束后需要執(zhí)行的


2:sed編輯器基礎(chǔ)

(1):更多地替換選項(xiàng)

<1>替換標(biāo)記

默認(rèn)的替換只會(huì)替換每行出現(xiàn)的第一個(gè)匹配的字符

使用替換標(biāo)記讓替換命令對(duì)一行中不同地方出現(xiàn)的文本都起作用

4種替換標(biāo)記

數(shù)字,表明新文本將會(huì)替換第幾處模式匹配的地方

g,替換所有已有文本出現(xiàn)的地方

p,顯示替換之后結(jié)果的行,習(xí)慣和-n(安靜模式,不輸出) 一起使用,

w file,將替換的結(jié)果寫到文件中

sed ‘s/pattern/replace/標(biāo)記’?file

<2>替換字符

sed編輯器允許其他字符作為substitute命令中的字符串分隔符:如使用感嘆號(hào)

sed ‘s!pattern!replacement!’?file


(2)使用地址

默認(rèn)sed中的命令會(huì)作用于文本數(shù)據(jù)的所有行,如果只想將命令作用于特定的某些行,需要使用行尋址

兩種形式的行尋址:

行的數(shù)字范圍

文本模式過(guò)濾出某行

兩種形式都使用相同的格式指定地址

[address]command

address {commands}


sed ‘2,3s/pattrn/replace/’file行范圍,只替換指定行的匹配的內(nèi)容

2,$表示從第二行到結(jié)尾行


文本模式過(guò)濾器

/pattern/command

必須使用正斜線將要指定的pattern封起來(lái).命令將只會(huì)作用在匹配的行

如:sed‘/qrs/s/bash/csh/’?/etc/passwd


(2):刪除行

命令d為刪除行的命令,如 sed ‘3d’data刪除第三行

刪除時(shí)需要謹(jǐn)慎,因?yàn)楹芸赡軙?huì)發(fā)生一些不想要的結(jié)果


(3):插入和附加文本

i指定行之前增加一個(gè)新行

a指定行之后增加一個(gè)新行

[不能在單個(gè)命令行上使用這兩條命令,必須指定要將行插入還是附加到另一行]

sed ‘[address]command\’

new line

如: sed‘2i\test line’data將會(huì)在第二行數(shù)據(jù)之前插入指定的行


(4)修改行

格式同增加或者插入相同,命令為 c

如:sed‘3c\a chage line’data將會(huì)改變data的第三行內(nèi)容為 a change line


(5)轉(zhuǎn)換命令

唯一可以處理單個(gè)字符的sed編輯器命令,

[address]y/inchars/outchars/,inchars和outchars的長(zhǎng)度需要一致,因?yàn)閮烧邽樽址灰挥成?/p>

如:sed‘y/th/ht/’?data

不同于s命令,轉(zhuǎn)換會(huì)對(duì)全行每一個(gè)匹配的內(nèi)容進(jìn)行操作


(6)打印

小寫p命令打印文本行

等號(hào)打印行號(hào)

小寫L用來(lái)列出行,將數(shù)據(jù)流中的文本和不可打印的ASCII字符進(jìn)行顯示,對(duì)于不可打印字符,使用它們的八進(jìn)制值錢加一個(gè)反斜線或者標(biāo)準(zhǔn)C風(fēng)格的命名法


3:sed和文件一起工作(利用sed對(duì)文件進(jìn)行寫操作

(1)向文件寫入

[address]w file

無(wú)論采用數(shù)字尋址還是模式尋址都可以

執(zhí)行命令的賬戶需要對(duì)file具有寫權(quán)限,如果file之前不存在,將會(huì)創(chuàng)建

(2)從文件讀取數(shù)據(jù)


r命令允許將一個(gè)獨(dú)立文件中的數(shù)據(jù)插入到數(shù)據(jù)流中.

[address]r file

如sed‘3r data1’data2,將在data2的輸出流第三行之后插入data1中的數(shù)據(jù)


第十九章:正則表達(dá)式

1:什么是正則表達(dá)式?

你所定義的,Linux用來(lái)過(guò)濾文本的模式模板

2:正則表達(dá)式不止一種類型,不同的應(yīng)用程序可能會(huì)使用不同類型的正則表達(dá)式

正則表達(dá)式是用正則表達(dá)式引擎實(shí)現(xiàn)的,正則表達(dá)式引擎是解釋正則表達(dá)式模式并使用這些模式進(jìn)行文本匹配的底層軟件

Linux中兩種流行的正則表達(dá)式引擎

POSIX基本正則表達(dá)式(BRE)引擎

POSIX擴(kuò)展正則表達(dá)式(ERE)引擎

正則表達(dá)式對(duì)大小寫敏感

3:特殊字符

.*[]^${}\+?|()

不能在文本模式中直接使用這些字符,需要進(jìn)行轉(zhuǎn)義才能使用,用于轉(zhuǎn)義的特殊字符是\

.用來(lái)匹配任意的單字符,除了換行符,點(diǎn)字符的位置必須要有字符,否則失效



4:錨字符

^定義了從數(shù)據(jù)流中文本行的行首開(kāi)始的模式,必須將脫字符放在模式最前面

$鎖定行尾,必須用在模式最后面

兩個(gè)錨字符可以組合使用


5:字符組

匹配一組字符,需要用到方括號(hào)來(lái)定義匹配模式[ad]cc,將匹配acc 和 dcc出現(xiàn)的文本行


可以反轉(zhuǎn)字符組的作用,尋找組中不存的字符,在字符組的開(kāi)頭加上脫字符,如[^xx]

使用區(qū)間,[0-9],[a-ch-s]等等


特殊字符組:

[[:alpha:]]匹配任意字母字符,無(wú)論大小寫

[[:alnum:]]匹配任意字母和數(shù)字

[[:blank:]]匹配空格或者制表符

[[:digit:]]匹配0-9之間的數(shù)字

[[:lower:]]匹配小寫字母

[[:print:]]匹配任意可打印字符

[[:punct:]]匹配標(biāo)點(diǎn)符號(hào)

[[:space:]]匹配任意空白字符

[[:upper:]]匹配任意大寫字母

這些特殊字符組可以直接用作sed命令的模式尋址中

*說(shuō)明該字符會(huì)在匹配模式的文本中出現(xiàn)0次或者多次


7:擴(kuò)展正則表達(dá)式

sed編輯器不能識(shí)別擴(kuò)展正則表達(dá)式,gawk可以

下面是在gawk程序腳本中常見(jiàn)的ere模式符號(hào)

?表明前面的字符可以出現(xiàn)0次或者1次

+表明前面的字符至少出現(xiàn)一次

{n,m}指定前面的字符出現(xiàn)的次數(shù)的區(qū)間,使用區(qū)間,需要使用 --re-intrval選項(xiàng)

如gawk --re-interval‘/be{1}t/{print $0}’,匹配含有bet的行

字符組可以和這樣的區(qū)間一起使用.

管道符|, reg1|reg2,如果任何一個(gè)模式匹配了數(shù)據(jù)流文本,文本就通過(guò)了


聚合表達(dá)式(xxx)稱為聚合表達(dá)式,這一整個(gè)可以當(dāng)做一個(gè)正常字符進(jìn)行使用

聚合表達(dá)式可以結(jié)合管道符使用,功能更強(qiáng)大


第二十章:sed進(jìn)階

1:多行處理

sed默認(rèn)是一行一行進(jìn)行處理的,但是有時(shí)候會(huì)出現(xiàn)一個(gè)短語(yǔ)劃分成兩行

用于處理多行文本的特殊命令:

N:將數(shù)據(jù)流的下一行加進(jìn)來(lái)創(chuàng)建一個(gè)多行組進(jìn)行處理

D:刪除多行組中的一行

P:打印多行組中的一行

(1):next命令

單行中的next命令

[通常sed編輯器會(huì)在移動(dòng)到數(shù)據(jù)流中的下一行文本之前在這行上執(zhí)行所有定義好的命令]

例如:一個(gè)五行文本,二四行是空行,現(xiàn)在要?jiǎng)h除第二行,第一行中有字符 head ,可以使用

?sed ‘/head/{n,d}’?data


如果查找這樣一段話:

the first meeting of the linux desktop

user’s group will be held on Tuesday.

All desktop users should attend this meeting.


sed ‘s/desktop user/linux/; N; s/desktop\nuser/linux’?file

可以完成替換功能


(2):多行刪除命令

D只會(huì)刪除模式空間中的第一行,刪除到換行符(包括換行符)

(3)多行打印命令

P只會(huì)打印模式空間中的第一行


2:保持空間

模式空間是一塊活動(dòng)緩沖區(qū),sed執(zhí)行命令時(shí)會(huì)保存sed編輯器要校驗(yàn)的文本,但是它并不是sed編輯器保存文本的唯一空間

sed編輯器利用了另外一塊緩沖區(qū)域,叫做保持空間.

保持空間的命令如下:

h將模式空間復(fù)制到保持空間

H將模式空間附加到保持空間

g將保持空間復(fù)制到模式空間

G將保持空間附加到模式空間

x交換模式空間和保持空間中的內(nèi)容


3:排除命令

!在命令之前添加感嘆號(hào),可以取消一次命令的執(zhí)行


4:改變流

(1):跳轉(zhuǎn)命令b

[address]b [label]

address決定了哪些行的數(shù)據(jù)會(huì)觸發(fā)跳轉(zhuǎn)命令,label定義了要跳轉(zhuǎn)的位置,沒(méi)有l(wèi)abel,就會(huì)跳轉(zhuǎn)到腳本結(jié)尾,也就是不執(zhí)行后面的命令

sed ‘{/first/b jump1;s/x/y/;:jump1;s/k/f/}’file,單匹配到first所在的行時(shí),將會(huì)跳轉(zhuǎn)到那一行,執(zhí)行jump1之后的命令

(2):測(cè)試命令t

基于替換命令的輸出跳轉(zhuǎn)到一個(gè)標(biāo)簽,而不是基于地址跳轉(zhuǎn)到下一個(gè)標(biāo)簽

[address]t [label]

沒(méi)指定標(biāo)簽,測(cè)試成功會(huì)跳轉(zhuǎn)到腳本結(jié)尾jiaoben


5:模式替代

(1):and符號(hào)&,用來(lái)代替替換命令中的匹配模式,會(huì)替換整個(gè)匹配模式

當(dāng)文本中出現(xiàn)了匹配的內(nèi)容時(shí),保持問(wèn)文本中所匹配的原本的單詞

echo "the cat sleeps in the hat" | sed 's/.at/*&*/g'

the *cat* sleeps in the *hat*

(2):替換單獨(dú)的單詞

sed編輯器用圓括號(hào)定義替換模式的子字符串,之后可以用替代模式中的特殊字符引用每個(gè)子字符串.

替代字符[\+數(shù)字],將匹配模式進(jìn)行部分替換


6:腳本中使用sed

(1):使用包裝腳本

就是將sed命令寫在腳本中,這樣就可以不用重復(fù)編寫,這樣的腳本稱為包裝腳本

(2):重定向sed腳本

將sed命令的的輸出賦值給一個(gè)變量,就可以了


7:創(chuàng)建sed實(shí)用腳本

(1)加倍行間距,利用保持空間默認(rèn)有一個(gè)空行

sed ‘$!G’file將在file文件中每一行之間插入一個(gè)空行

(2)對(duì)可能含有空白行的文件加倍行間距

先刪除空白行,再增加空白行

sed ‘/^$/d;$!G’?file]

[sed讀取每一行,對(duì)每一行執(zhí)行一遍命令,在讀取下一行之前,將會(huì)清空模式空間]

(3)給文件中的行進(jìn)行編號(hào)

sed ‘=’?file | sed ‘N;s/\n/ /’將在行號(hào)后面寫上行的內(nèi)容,而不是行號(hào)后換行再顯示

(4)打印末尾若干行

利用滾動(dòng)窗口,也就是一個(gè)循環(huán),不斷地向模式空間中增加數(shù)據(jù)行,超過(guò)一定值將第一行刪除

sed ‘{:start;$q;N,11,$D}’?file

(5)刪除行

刪除數(shù)據(jù)流中不需要的空白行.

<1>:刪除連續(xù)的空白行

/./,/^$/!d實(shí)際上是保留一行內(nèi)容和空行

<2>刪除開(kāi)頭的空白行

/./,$!d

<3>刪除結(jié)尾的空白行

{:ss;/\n *$/{$d;N;b ss}}

(6)刪除html標(biāo)簽

sed ‘s/<[^>]*>//g;/^$/d’?htmlfile


第二十一章:gawk進(jìn)階

1:使用變量

(1)內(nèi)建變量

內(nèi)建變量用來(lái)引用程序數(shù)據(jù)中的一些特殊功能.

<1>:字段和數(shù)據(jù)行分隔符字段

FIELDWIDTHS空格隔開(kāi)的定義了每個(gè)數(shù)據(jù)字段確切寬度的一列數(shù)字

FS輸入字段分隔符 OFS 輸出字段分隔符

RS輸入數(shù)據(jù)行分隔符 ORS 輸出數(shù)據(jù)行分隔符

默認(rèn)FS, OFS為空格

當(dāng)指定FIELDWIDTHs時(shí),gawk就會(huì)忽略FS變量,根據(jù)你設(shè)定的寬度大小進(jìn)行字段的劃分

gawk ‘BEGIN{FIELDWIDTHS=”3 5 2 2”} {print $1.$2.$3.$4}’,


默認(rèn)RS,ORS為換行符,同樣可以進(jìn)行修改

<2>數(shù)據(jù)變量

很多,man gawk可以進(jìn)行查看

ARGC當(dāng)前命令行參數(shù)個(gè)數(shù)

ARGV當(dāng)前命令行參數(shù)數(shù)組

ENVIRON[“sehll環(huán)境變量”]提取shell的環(huán)境變量

NF當(dāng)前數(shù)據(jù)行中的字段總數(shù)

FNR當(dāng)前數(shù)據(jù)文件中數(shù)據(jù)行數(shù)

NR已處理的數(shù)據(jù)行數(shù)

gawk '{print $0,"NF="NF,"NR="NR,"FNR="FNR}' file file

this is first line ?NF=4 NR=1 FNR=1

this is second line ?NF=4 NR=2 FNR=2

this is third line ?NF=4 NR=3 FNR=3

this is forth line NF=4 NR=4 FNR=4

this is fifth line NF=4 NR=5 FNR=5

this is first line ?NF=4 NR=6 FNR=1

this is second line ?NF=4 NR=7 FNR=2

this is third line ?NF=4 NR=8 FNR=3

this is forth line NF=4 NR=9 FNR=4

this is fifth line NF=4 NR=10 FNR=5


(2)自定義變量

<1>給變量賦值

gawk ‘BEGIN{a=”this is a”;print a}’

變量類型自動(dòng)確認(rèn),可以進(jìn)行數(shù)學(xué)計(jì)算

<2>命令行上給變量賦值

可以將腳本代碼寫在文件中,-f指定文件,并且輸入?yún)?shù)

gawk -f script x=x file

值在BEGIN的代碼中不可用,需要在指定腳本之前執(zhí)行-v

gawk -v x=x -f script file


2:處理數(shù)組

gawk采用關(guān)聯(lián)數(shù)組,它的索引值可以是任意文本字符串

(1)定義數(shù)組變量

var[index] = element

如arr[“hello”] = “hello world”

(2)遍歷數(shù)組

for (var ?in ?array)

{

statements

}

注意:var是索引值而不是元素值,并且不是按照順序的

(3)刪除數(shù)組變量

delete array[index]將會(huì)從數(shù)組中刪掉關(guān)聯(lián)索引值和相關(guān)的數(shù)據(jù)元素值


3:使用模式

BEGIN和END就是特殊的模式

(1)正則表達(dá)式

gawk ‘/pattern/{commands}’?file

正則表達(dá)式必須出現(xiàn)在它要控制的程序腳本左花括號(hào)之前

?j???1

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市罚缕,隨后出現(xiàn)的幾起案子艇纺,更是在濱河造成了極大的恐慌,老刑警劉巖邮弹,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件黔衡,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡腌乡,警方通過(guò)查閱死者的電腦和手機(jī)盟劫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)与纽,“玉大人侣签,你說(shuō)我怎么就攤上這事〖庇兀” “怎么了影所?”我有些...
    開(kāi)封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)僚碎。 經(jīng)常有香客問(wèn)我猴娩,道長(zhǎng),這世上最難降的妖魔是什么勺阐? 我笑而不...
    開(kāi)封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任卷中,我火速辦了婚禮,結(jié)果婚禮上渊抽,老公的妹妹穿的比我還像新娘蟆豫。我一直安慰自己,他們只是感情好懒闷,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布十减。 她就那樣靜靜地躺著徙瓶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嫉称。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天灵疮,我揣著相機(jī)與錄音织阅,去河邊找鬼。 笑死震捣,一個(gè)胖子當(dāng)著我的面吹牛荔棉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蒿赢,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼润樱,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了羡棵?” 一聲冷哼從身側(cè)響起壹若,我...
    開(kāi)封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎皂冰,沒(méi)想到半個(gè)月后店展,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡秃流,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年赂蕴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舶胀。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡概说,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嚣伐,到底是詐尸還是另有隱情糖赔,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布纤控,位于F島的核電站挂捻,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏船万。R本人自食惡果不足惜刻撒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望耿导。 院中可真熱鬧声怔,春花似錦、人聲如沸舱呻。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至芥驳,卻和暖如春柿冲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背兆旬。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工假抄, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人丽猬。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓宿饱,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親脚祟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谬以,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,367評(píng)論 0 5
  • 第 2 章 SHELL 基礎(chǔ)知識(shí)2.1 shell腳本我們?cè)谏厦婧?jiǎn)單介紹了一下什么是shell腳本,現(xiàn)在我們來(lái)進(jìn)一...
    LiWei_9e4b閱讀 1,553評(píng)論 0 0
  • 基礎(chǔ)命令 主要的命令和快捷鍵 Linux系統(tǒng)命令由三部分組成:cmd + [options]+[operation...
    485b1aca799e閱讀 1,086評(píng)論 0 0
  • 知識(shí)點(diǎn) sort uniq cut wc sed命令 awk命令 crontab定時(shí)器 sort sort 命令對(duì)...
  • 本文筆記源自這里——[實(shí)驗(yàn)樓]歡迎大家在下面交流其中有問(wèn)題的地方喜歡請(qǐng)點(diǎn)收藏由桌,每日更新(全部已親自實(shí)踐). 一. ...
    東皇Amrzs閱讀 3,963評(píng)論 7 54