【所有相關(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