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

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

第三章:基本的bash shell命令

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

通過man可以調(diào)出bash手冊,包含了一些幫助信息。

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

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


2:文件系統(tǒng)

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

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

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


ls輸出的列表按照字母升序排列的,并且是按照列排列的,支持過濾器,請了解通配符

-i可以查看inode編號

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

【文件類型,文件權(quán)限,硬鏈接總數(shù),文件屬主用戶名,文件屬組組名,文件大?。▎挝皇亲止?jié)),文件上次修改時間,文件名】

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

【-h】大小易讀


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


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


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

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

·硬鏈接:只能對處于同一存儲媒體的文件創(chuàng)建硬鏈接。本質(zhì)上和源文件是同一個文件。指向同一個iNode,所以刪除源文件后還是可以通過硬鏈接訪問源文件。無法對目錄生成硬鏈接。硬鏈接不會占用磁盤空間。

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


【mv oldname newname】進行文件改名,并且只會影響文件名,不改變iNode編號和時間戳。

也可以用來移動文件的位置。


【rm options filename】刪除文件


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


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



file用來查看文件的類型,可以在訪問之前稍微了解下文件,尤其是二進制文件時,貿(mào)然直接訪問可能會使終端仿真器掛起


查看文件的幾個命令

cat -n顯示行號,-b有文本的才顯示行號。

more支持分頁顯示文件,回車或者空格逐行移動,只支持基本移動,更多高級功能需要使用less

less

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

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


第四章:更多地bash shell命令

1:監(jiān)測進程程序

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

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


top進行實時監(jiān)測,第一部分輸出系統(tǒng)概況。分別是:

第一行輸出當(dāng)前時間,系統(tǒng)運行時間,登錄用戶數(shù),以及系統(tǒng)平均負載,平均負載三個值分別為最近1分鐘,5分鐘和15分鐘。

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

PID:進程的id,USER:進程屬主的名字,PR:進程優(yōu)先級,NI:進程謙讓程度

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

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

S:進程狀態(tài)(D表示可中斷的休眠,R運行,S休眠,T跟蹤或者停止,Z僵化)

%CPU:進程使用的CPU時間比例

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

TIME+:進程啟動到目前為止CPU時間總量

COMMAND:進程啟動的程序名


結(jié)束進程,進程之間的通信是通過信號來進行的。Linux進程信號:

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

11~SEGV~段錯誤 15~TERM~盡可能終止 17~STOP~無條件停止運行,但不終止

18~TSTP~停止或者暫停,但繼續(xù)在后臺運行

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


向運行中的進程發(fā)出進程信號有兩個命令【發(fā)出進程信號必須是進程的屬主或者root用戶】

kill 只能通過PID給進程發(fā)送信號P,【-s】指定特定的信號,kill -s HUP PID

killall支持通過進程名結(jié)束進程


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

1):掛載存儲媒體

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

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

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

卸載存儲媒體

umount [dir|device]


2)查看磁盤信息

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

設(shè)備文件位置,能容納多少個1kB大小的塊,已經(jīng)用了多少個1kB的塊,還有多少個塊可用,已用空間占用的比例,設(shè)備掛載到了哪個掛載點上。

【-h】會使輸出信息易于閱讀

顯示的是Linux系統(tǒng)認(rèn)為的當(dāng)前值,有可能運行的進程對文件做了一些改動,但是沒有釋放文件,這個值是不會算進閑置空間的


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

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

-h:易讀

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

-a:不僅僅是顯示目錄


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

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

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

【-M】識別三字符的月份,按照月份進行排序

【-t】指定分隔字符

【-k】指定排序的字段

【-r】倒序排列

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


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

grep options pattern file

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

【-n】匹配的行所在的行號

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

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

支持正則表達式

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

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

gzip為Linux上最流行的壓縮工具

gzip用來壓縮文件,gzcat查看壓縮過的文本文件的內(nèi)容,gunzip解壓文件


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

tar

常見功能選項

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

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

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

常見命令選項

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

-v:處理文件時顯示文件

-z:輸出重定向給gzip進行壓縮


第五章:理解shell

【(command;command;command;...)】這是一個進程列表,會生成一個子shell

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

另一種進程列表創(chuàng)建方法是{command;},這個并不會生成一個子shell


后臺模式

命令后使用&進入后臺執(zhí)行

jobs會顯示所有的后臺進程,【-l】參數(shù)會顯示更多的信息

將進程列表置于后臺模式,既可以在子shell中進行繁重的處理工作,也不會讓子shell的I/O受制于終端


協(xié)程

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

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

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


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

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

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

正因為如此,外部命令還是有些許代價的


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

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

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

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

【?。∧軌驁?zhí)行上一條指令】

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

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

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




alias命令別名

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

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

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

取消別名unalias name


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

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


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

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

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


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

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

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


【set】顯示為某個特定進程設(shè)置的所有環(huán)境變量,包括局部變量,全局變量,和用戶自定義變量。沒有特殊的命令可以顯示局部環(huán)境變量


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

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

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

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

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

父shell中的局部變量子shell中也無法使用


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

可以臨時修改path變量;PATH=....


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

啟動bash shell的三種方式

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

作為非登錄shell的交互式shell

作為運行腳本的非交互shell


作為默認(rèn)登錄shell啟動時,登錄shell會從五個不同的啟動文件中讀??;分別是

/etc/profile

$HOME/.bash_profile

$HOME/.bashrc

$HOME/.bash_login

$HOME/.profile


交互式shell進程啟動時,比如在命令行下執(zhí)行bash,就會啟動一個交互式shell,只會檢查$HOME/.bashrc文件


非交互式shell時,例如運行shell腳本,這個時候會檢查BASH_ENV這個環(huán)境變量。


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

【直接在/etc/profile中修改變量不是一個好主意,因為會隨著發(fā)行版的升級而更新從而導(dǎo)致自己修改的變量設(shè)置失效】

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


5):數(shù)組變量

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

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


第七章:Linux的安全性

1):用戶控制,主要通過兩個文件

/etc/passwd文件,各個字段的信息如下

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

/etc/shadow

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


2):添加新用戶

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

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

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

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

-p指定用戶密碼


3):刪除用戶

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

[-r]可以刪除用戶目錄,但是可能會有一些問題,在刪除用戶主目錄時請一定慎重


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

chown user:group ?file

chgrp group file

]

4):修改用戶

usermod:修改用戶賬戶的字段

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

[-l]修改登錄名

[-L]鎖定賬戶,用戶將無法登錄

[-p]修改賬戶密碼

[-U]解除鎖定zifu


passwd user root用戶用來修改別人的密碼,用戶自己只能修改自己的密碼

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

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

groupadd groupname可以增加一個新組

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


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

- 文件

d 目錄

l 鏈接

c 字符型設(shè)備

b 塊設(shè)備

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

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

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

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


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

u 用戶

g 組

o 其他

a 上述所有


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









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

vim,emacs,kde,gnome

vim常用的命令

hjkl:左下上右

ctrl+F下一屏

Ctrl+B上一屏

gg第一行

G 最后一行


冒號后可以使用的命令

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

w filename 保存到文件名

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


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

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 撤銷前一個編輯命令,如刪除,插入等

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

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

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

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


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

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

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

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

同樣使用p取出


查找和替換

普通模式下按下斜線

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


替換

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

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

:n.ms/old/new/g 替換行號n和m之間的所有old

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

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


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

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

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

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

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

在shell腳本整個生命周期變量都會保持他們的值,在腳本完成時刪除

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


1):重定向

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

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

<輸入重定向

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


2):管道操作符

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


3):對數(shù)字進行操作

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

注意,bash shell的這種運算只會進行整數(shù)運算,不能進行浮點數(shù)運算

bash的浮點解決方案--bash計算器,即bc

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

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

退出bc請使用quit


4):如何退出腳本

退出狀態(tài)碼:

0成功結(jié)束

1通用未知錯誤

2誤用shell命令

126命令不可執(zhí)行

127沒找到命令

128無效退出參數(shù)

128+x信號x的嚴(yán)重錯誤

130命令通過ctrl+c終止

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

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


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

1):if-then語句

if command

then

command

fi

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

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


2):if-then-else語句

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 ]注意,方括號兩端需要有空格


數(shù)值比較:

x -eq yx和y 是否相等

-ge大于或者等于

-gt大于

-le小于或者等于

-lt小于

-ne不等于


字符串比較

=!=<>-n檢測字符串長度是否不為0 -z檢測字符串長度是否為0

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

比較大小時,

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


文件比較



-d file檢測file是否存在并且是一個目錄

-f file檢測file是夠存在并且是一個文件

-e file檢測file是否存在

-s file檢測file是否存在并且非空

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

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

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

file1 -nt file2檢測file1是否比file2新

file1 -ot file2檢測file1是否比file2舊


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


5):使用雙括號

((expression))可以進行各種運算,自增,自減,位運算等等

可以用在if語句中


6):使用雙方括號

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

可以用在if語句中


7):使用case

case variable in

pattern1|pattern2) commands;;

pattern3) commands;;

*) default commands;;

esac

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


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

for var in list

do

commands

done


list中的每個量之間使用空格隔開,如果list中某個值需要空格,請使用雙引號


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


9):while循環(huán)

while test command

do

commands

done

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


10):until命令

until test condition

do

commands

done


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


11):break,跳出一個循環(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之后使用重定向符號可以將循環(huán)體中的輸出重定向到指定的文件或者設(shè)備中,而不是直接顯示在屏幕上,同樣,也可以使用管道符號


第十三章:處理用戶輸入

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

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


幾個特殊的參數(shù)

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

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

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


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


2):getopt命令

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

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

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

-q表示忽略前面沒有指定的合并選項,使之不會產(chǎn)生錯誤


3):getopts

是對getopt的功能的擴展

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

:表示忽略錯誤

解析命令行選項時,會過濾其中的-,只會顯示選項的字母

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

將未定義的選項解析成?


4):通用的Linux選項

-a顯示所有對象

-c生成一個計數(shù)

-d指定一個目錄

-e擴展一個對象

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

-h顯示命令的幫助信息

-i忽略文本大小寫

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

-n使用非交互模式

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

-q安靜模式運行

-r遞歸處理目錄和文件

-v生成詳細輸出

-x排除某個對象

-y對所有問題回答yes


5):獲取用戶的輸入

read varName

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

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

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


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

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

-nl指定接受單個字符之后退出,無需enter鍵

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

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


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

1:理解輸入和輸出

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

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

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

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

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

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

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

&2同理


2):永久重定向

exec 1>file

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

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


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

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

使用exec進行指定,例如 exec 3>test3out,接下來只要是重定向到3的輸出,都會重定向到test3out里

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

exec 3>&1

exec 1>file

exec 1>&3

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

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


關(guān)閉問價描述符;如[exec 3>&-] 將會關(guān)閉文件3這個文件描述符

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

-p指定進程號,-d指定文件描述符


2:阻止命令輸出

當(dāng)腳本運行在后臺時,一般不希望腳本輸出

可以將stderr重定向到/dev/null文件,你這樣腳本的錯誤信息將會被丟棄,因為null文件不會保存任何數(shù)據(jù)


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

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

[-t]將會強制在/tmp下創(chuàng)建臨時文件

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

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


4:同時記錄

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

[-a]追加模式


第十五章:控制腳本

進程信號重溫

1 SIGHUP掛起

2 SIGINT終止

3 SIGQUIT停止進程

9 SIGKILL無條件終止

15 SIGTERM可能的話終止進程

17 SIGSTOP無條件停止進程

18 SIGTSTP停止或者暫停進程

19 SIGCONT繼續(xù)運行停止的進程

bash默認(rèn)會忽略3和15信號.

1:產(chǎn)生信號

1):終止進程 ctrl+c 生成SIGINT信號,終止信號

2):暫停進程 ctrl+z 生成SIGTSTP信號,停止shell中運行的任何進程

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


2:捕捉信號

trap commands signals

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


移除捕捉信號trap - EXIT ...


3:后臺進程

執(zhí)行時在進程后面加上&

如果想要在退出終端會話后后臺進程依然能夠運行,使用nohup

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


4:作業(yè)控制

1):查看作業(yè)

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

[-l]列出進程的pid以及作業(yè)號

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

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

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

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

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


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

以后臺模式重啟[bg作業(yè)號]

前臺模式啟動[fg作業(yè)號]


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

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

默認(rèn),bash以優(yōu)先級0啟動所有進程


nice改變優(yōu)先級

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

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



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

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

只能對屬于你的進程執(zhí)行

只能通過renice降低進程的優(yōu)先級,root用戶沒有限制


6:定時任務(wù)

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

at [ -f filename ] time

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

可識別的時間格式:

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

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

特定可命名的時間,比如now,noon,midnight,teatime

如果指定了一個過去的時間,會在第二天該時間運行

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


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

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


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


atrm刪除作業(yè)

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


7:定期執(zhí)行

cron時間表

cron唯一問題是假定系統(tǒng)是7*24小時運行的


8:啟動時運行




第三部分:高級shell腳本編程

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

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

風(fēng)格1

function name {commands}

風(fēng)格2

name(){commands}

2:返回值

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

1):使用return

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


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

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


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

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

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

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

2):數(shù)組變量

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

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

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

4):函數(shù)遞歸


4:創(chuàng)建庫

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

調(diào)用庫文件時,會在一個新的shell中,這就涉及到作用域的問題

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


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

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


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

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

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

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


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

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

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

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

通常我們會為還沒有實現(xiàn)的函數(shù)創(chuàng)建一個樁函數(shù)(沒有任何命令或者只有echo語句說明的函數(shù))

一般,可以將菜單布局本身作為一個函數(shù)來創(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是菜單中要顯示的字符串


第十八章:初識sed和gawk

1:文本處理

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

[sed options script file]

-e script在處理輸入時,將script中指定的命令添加到運行的命令中

-f file處理輸入時,將file中指定的命令添加到運行的命令中

-n 不要為每個命令生成輸出,等待print命令來輸出

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

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

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


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

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

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

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

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

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

[gawk options program file]

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

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

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

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

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

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


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

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

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

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

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

$0代表整個文本行

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

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

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

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

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

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

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

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

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

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


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

(1):更多地替換選項

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

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

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

4種替換標(biāo)記

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

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

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

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

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

<2>替換字符

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

sed ‘s!pattern!replacement!’?file


(2)使用地址

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

兩種形式的行尋址:

行的數(shù)字范圍

文本模式過濾出某行

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

[address]command

address {commands}


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

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


文本模式過濾器

/pattern/command

必須使用正斜線將要指定的pattern封起來.命令將只會作用在匹配的行

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


(2):刪除行

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

刪除時需要謹(jǐn)慎,因為很可能會發(fā)生一些不想要的結(jié)果


(3):插入和附加文本

i指定行之前增加一個新行

a指定行之后增加一個新行

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

sed ‘[address]command\’

new line

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


(4)修改行

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

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


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

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

[address]y/inchars/outchars/,inchars和outchars的長度需要一致,因為兩者為字符一一映射

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

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


(6)打印

小寫p命令打印文本行

等號打印行號

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


3:sed和文件一起工作(利用sed對文件進行寫操作

(1)向文件寫入

[address]w file

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

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

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


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

[address]r file

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


第十九章:正則表達式

1:什么是正則表達式?

你所定義的,Linux用來過濾文本的模式模板

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

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

Linux中兩種流行的正則表達式引擎

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

POSIX擴展正則表達式(ERE)引擎

正則表達式對大小寫敏感

3:特殊字符

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

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

.用來匹配任意的單字符,除了換行符,點字符的位置必須要有字符,否則失效



4:錨字符

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

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

兩個錨字符可以組合使用


5:字符組

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


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

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


特殊字符組:

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

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

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

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

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

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

[[:punct:]]匹配標(biāo)點符號

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

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

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

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


7:擴展正則表達式

sed編輯器不能識別擴展正則表達式,gawk可以

下面是在gawk程序腳本中常見的ere模式符號

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

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

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

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

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

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


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

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


第二十章:sed進階

1:多行處理

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

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

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

D:刪除多行組中的一行

P:打印多行組中的一行

(1):next命令

單行中的next命令

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

例如:一個五行文本,二四行是空行,現(xiàn)在要刪除第二行,第一行中有字符 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只會刪除模式空間中的第一行,刪除到換行符(包括換行符)

(3)多行打印命令

P只會打印模式空間中的第一行


2:保持空間

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

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

保持空間的命令如下:

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

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

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

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

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


3:排除命令

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


4:改變流

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

[address]b [label]

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

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

(2):測試命令t

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

[address]t [label]

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


5:模式替代

(1):and符號&,用來代替替換命令中的匹配模式,會替換整個匹配模式

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

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

the *cat* sleeps in the *hat*

(2):替換單獨的單詞

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

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


6:腳本中使用sed

(1):使用包裝腳本

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

(2):重定向sed腳本

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


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

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

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

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

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

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

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

(3)給文件中的行進行編號

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

(4)打印末尾若干行

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

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

(5)刪除行

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

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

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

<2>刪除開頭的空白行

/./,$!d

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

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

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

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


第二十一章:gawk進階

1:使用變量

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

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

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

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

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

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

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

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

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


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

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

很多,man gawk可以進行查看

ARGC當(dāng)前命令行參數(shù)個數(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}’

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

<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]將會從數(shù)組中刪掉關(guān)聯(lián)索引值和相關(guān)的數(shù)據(jù)元素值


3:使用模式

BEGIN和END就是特殊的模式

(1)正則表達式

gawk ‘/pattern/{commands}’?file

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

?j???1

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容