1. 程式人生 > >Linux用戶管理(十)Linux Shell高級

Linux用戶管理(十)Linux Shell高級

shell

Shell高級

一. shell置換和引用

1.什麽是置換和引用

shell中具有很多特殊意義的字符(*、?、\等),shell將包含元字符的字符串根據其意義轉換成新字符串的過程稱為置換;關閉shell對特殊字符含義的解析處理被稱為引用。

2.Shell置換的類型

(1) 文件名置換

l 元字符

-* 匹配所有字符

-? 匹配所有單個字符

-[] 匹配括弧內的字符

-[!] 匹配除括弧內的其他字符

l 實例

-#ls abc*

-#ls ?abc

-#ls [abc]*

-#ls [!a]*

(2) 變量置換

l $varname${varname} 置換變量的值,引用指定變量名的值

l ${varname:+value} 判斷varname變量是否設置,如果設置了,則顯示value,否則顯示空

l ${varname:?value} 如果變量varname變量未設置/為空,則顯示錯誤信息value

l ${varname:-value} 如果變量varname變量未設置/為空,則顯示value

l ${varname:=value} 如果變量varname變量未設置/為穿,則顯示value,並將value值賦給varname變量

(3) 命令置換

l 使用`命令`,置換命令的結果。如cat `ls /etc/grub.conf`

l 使用$(命令)方式置換命令的結果。如cat $(ls /etc/grub.conf)

(4) 運算式置換

l 使用$((算術表達式))置換表達式的結果。如a=$( (1 + 1 ))

l 使用declare/let定義整型變量和給變量賦值。如let a=5+5

3.Shell引用

l 使用“\”取消其後面的特殊字符的含義,特殊字符有* ? [] ‘ ’ “ ” \ $ ; & ( ) | ^ ! #;如“abc\*.

l 使用‘’引用所有被括起來的字符,如echo ‘$a*’

l 使用“”引用所有除$`以外的字符

二. 文本過濾

1.什麽是文本過濾

文本過濾指的是提取指定文件中的部分內容或替換指定文本文件中的字符串

2.文本過濾的命令

(1)

head

功能:輸出文件頭部n

格式:head -n 文件名

實例:#head -3 /etc/passwd

(2) tail

功能:輸出文件尾部n行或監控文件

格式:tail +n/-n/-f 文件

實例:#tail –3 /etc/passwd

#tail +3 /etc/passwd

#tail –f /etc/passwd

(3) uniq

功能: 檢查及刪除文本文件中重復出現的行列

格式: uniq [選項] [輸入文件][輸出文件]

選項:

-c 在每列旁邊顯示該行重復出現的次數。
-d 僅顯示重復出現的行列。
-f 忽略比較指定的欄位。
-s 忽略比較指定的字符。
-u 僅顯示出現一次的行。
-w<字符位置> 指定要比較的字符。
實例:

#uniq -u /root/aa

#uniq -dc /root/aa

(4) sort

功能:對文件進行排序/合並

格式:sort [選項] 文件名

選項:

-d:按字典順序(只對空格/字母/數字)

-f:忽略大小寫

-t:指定分隔符

-r反向

-n按數字大小顯示

-c只檢查是否有序,不實際排序

-u消除重復行

實例:

#sort -r /etc/passwd

#sort +1-2 /etc/passwd

(5) grep

功能:在文本文件中查找匹配的字符串

格式:#grep [參數] “字符串” 文件

參數:

-? 同時顯示匹配行上下的?行

-b 在匹配行前面打印該行所在的塊號

-c 只打印匹配的行數,不顯示匹配的內容

-f File 從文件中提取模板,空文件中包含0個模板,所以什麽都不匹配

-h 當搜索多個文件時,不顯示匹配文件名前綴

-I 忽略大小寫差別

-q 取消顯示,只返回退出狀態。0則表示找到了匹配的行

-l 打印匹配模板的文件清單

-L 打印不匹配模板的文件清單

-n 在匹配的行前面打印行號

-s 不顯示關於不存在或者無法讀取文件的錯誤信息

-v 反檢索,只顯示不匹配的行

-w 如果被\<和\>引用,就把表達式做為一個單詞搜索

正則表達式元字符:

^

錨定行的開始 如:‘^grep‘匹配所有以grep開頭的行

$

錨定行的結束 如:‘grep$‘匹配所有以grep結尾的行

.

匹配一個非換行符的字符 如:‘gr.p‘匹配gr後接一個任意字符,然後是p

*

匹配零個或多個先前字符 如:‘*grep‘匹配所有一個或多個空格後緊跟grep的行。.*一起用代表任意字符

[]

匹配一個指定範圍內的字符,如‘[Gg]rep‘匹配Grep和grep

[^]

匹配一個不在指定範圍內的字符,如:‘[^A-FH-Z]rep‘匹配不包含A-R和T-Z的一個字母開頭,緊跟rep的行

\(..\)

標記匹配字符,如‘\(love\)‘,love被標記為1

\<

錨定單詞的開始,如:‘\<grep‘匹配包含以grep開頭的單詞的行

\>

錨定單詞的結束,如:‘grep\>‘匹配包含以grep結尾的單詞的行

x\{m\}

重復字符x,m次,如:‘0\{5\}‘匹配包含5個o的行

x\{m,\}

重復字符x,至少m次,如:‘o\{5,\}‘匹配至少有5個o的行

x\{m,n\}

重復字符x,至少m次,不多於n次,如:‘o\{5,10\}‘匹配5--10個o的行

實例:

# ls -l | grep ‘^a‘

通過管道過濾ls-l輸出的內容,只顯示以a開頭的行。

# grep ‘test‘ d*

顯示所有以d開頭的文件中包含test的行。

# grep ‘test‘ aa bbcc

顯示在aa,bb,cc文件中匹配test的行。

# grep ‘[a-z]\{5\}‘aa

顯示所有包含每個字符串有5個連續小寫字符的字符串的行。

# grep ‘w\(es\)t.*\1‘aa

如果west被匹配,則es就被存儲到內存中,並標記為1,然後搜索任意個字符(.*),這些字符後面緊跟著另外一個es(\1),找到就顯示該行。如果用egrep或grep -E,就不用"\"號進行轉義,直接寫成‘w(es)t.*\1‘就可以了。

(6) sed

功能:Sed(a stream editor)是流線型、非交互式編輯器。它允許你執行與vi編輯器裏一樣的編輯任務。Sed 程序不是與編輯器交互式工作的,而是讓你在命令行裏敲入編輯的命令,給文件命名,然後在屏幕上查看命令輸出結果。

格式:sed [選項] sed子命令 輸入文件 [輸出文件]

子命令:

p 打印匹配行

= 顯示文件行號

a \ 在定位行號後附加新文本信息

i \ 在定位行號前插入新文本信息

d 刪除定位行

c \ 用新文本替換定位文本

s 使用替換模式替換相應模式

r 從另一個文件中讀文本

w 寫文本到一個文件

q 第一個模式匹配完成後推出或立即推出

{ } 在定位行執行的命令組

n 從另一個文件中讀文本下一行,並附加在下一行

y 傳送字符

n 延續到下一輸入行;允許跨行的模式匹配語句

實例:

1> 打印:p命令

#sed ‘/north/p‘datafile

默認輸出所有行,找到north的行重復打印

#sed –n ‘/north/p‘datafile

禁止默認輸出,只打印找到north的行

#sed -n‘/west/,/east/p‘ datafile

打印在west和east之間的模式範圍內所有行。

2> 刪除:d命令

#sed ‘3d‘ datafile

刪除第三行,其余行輸出到屏幕

#sed ‘3,$d‘ datafile

從第3行到最後一行都刪除,將剩余部分輸出到屏幕

#sed ‘/north/d‘datafile

將含有north的行刪除,其余輸出到屏幕

3> 替換:s命令

#sed ‘s/west/north/g‘datafile

找到datafile中的所有west並替換成north,將替換後的內容輸出到屏幕。

#sed -n‘s/Hemenway/Jones/gp‘ datafile

所有的Hemenway所在的位置都用Jones來取代,而且只有改變的行被打印。

#sed -n‘s/\(Mar\)got/\1ianne/p‘ datafile

模式Mar被封裝在括弧裏且在一個專用寄存器裏存為標記1。在替換串裏它將被引用做\1。然後用Marianne替代Margot。

4> 多次編輯 -e 選項

#sed -e ‘1,3d‘ -e‘s/Hemenway/Jones/‘ datafile

5> 從文件中讀取:r命令

#sed ‘/Suan/rnewfile‘ datafile

r命令從newfile中讀取內容,將內容輸出到Suan的後面。

6> 寫入文件:w命令

#sed -n ‘/north/wnewfile‘ datafile

w命令把指定的行寫入到一個文件。

7> 添加:a命令

#sed ‘/north/a\ THENORTH SALES DISTRICT HAS MOVED<-----‘ datafile

奇怪的是a\後面必須另起一行,在輸入要添加的內容,否則會提示解析錯誤。

8> 插入:i命令

# sed ‘/north/i\ THENORTH SALES DISTRICT HAS MOVED‘ datafile

在符合模式的行前面插入內容。其余和a\命令相同。

9>下一個:n命令

#sed‘/eastern/{n;s/AM/Archie/;}‘ datafile

10>變換:y 命令

#sed‘1,3y/abcdefghijklmnopqrst/ABCDEFGHIJKLMNOPQRST/‘ datafile

將對應字母進行轉換。

11>退出:q 命令

#sed ‘5q‘ datafile

在打印了5行之後,用q命令退出sed程序。

三. Awk

1. 什麽是awk

Awk是一種程序語言,對文本文件的處理具有很強的功能,如修改、比較、提取、打印等。awk語言的最基本功能是在文件或字符串中基於指定規則瀏覽和抽取信息。awk抽取信息後,才能進行其他文本操作。完整的awk腳本通常用來格式化文本文件中的信息。

2. 如何執行awk程序

Awk程序可以直接在命令行中執行,也可以存放在文件然後在命令行調用。

方法一:直接在命令行中執行

#gawk ‘program’ input-file1 input-file2…

方法二:調用awk程序文件

#gawk –f program-file input-file1 input-file2…

任何a w k語句都由模式和動作組成。在一個a w k腳本中可能有許多語句。模式部分決定動作語句何時觸發及觸發事件。處理即對數據進行的操作。如果省略模式部分,動作將時刻保持執行狀態。模式可以是任何條件語句或復合語句或正則表達式。

模式包括兩個特殊字段B E G I NE N D。使用B E G I N語句設置計數和打印頭。B E G I N語句使用在任何文本瀏覽動作之前,之後文本瀏覽動作依據輸入文件開始執行。E N D語句用來在a w k完成文本瀏覽動作後打印輸出文本總數和結尾狀態標誌。如果不特別指明模式, a w k總是匹配或打印行數。

實際動作在大括號{ }內指明。動作大多數用來打印,但是還有些更長的代碼諸如i f和循環語句及循環退出結構。如果不指明采取動作, a w k將打印出所有瀏覽出來的記錄。

3. 認識文件中的記錄和域

1 分隔符 2 分隔符 3 分隔符 4

abc # 0 2 / 9 9 # 4 8 # fine

l 默認文件中以換行符結束的行稱為記錄,awk中可以指定記錄分隔符,也可以用$0引用整個記錄

l 記錄是由若幹個域構成的,域之間由指定的分隔符隔開,默認分隔符為空格。可以用$1…$n引用記錄中的各個域

4. 正則表達式和運行算符

(1) 算術運算符:+ -*、/ %(取余) ^(乘方)

(2) 關系運算符:< > <= >= == != ~(匹配) !~(不匹配)

(3) 邏輯運算符:&& || !

(4) 賦值運算符:= += -= *= /= %= ^=

(5) 自增、自減運算符:++ --

(6) 數組引用:in

5. awk變量和數組

(1)awk變量分為數值型和字符型,用戶引用變量時即定義了變量,變量類型由變量內容決定,引用變量時不用加$。

(2)awk內置變量如下

l ARGC 命令行參數的數目。

l ARGIND 命令行中當前文件的位置(0開始算)

l ARGV 包含命令行參數的數組。

l CONVFMT 數字轉換格式(默認值為%.6g)

l ENVIRON 環境變量關聯數組。

l ERRNO 最後一個系統錯誤的描述。

l FIELDWIDTHS 字段寬度列表(用空格鍵分隔)

l FNR NR,但相對於當前文件。

l FS字段分隔符(默認是任何空格)

l IGNORECASE如果為真,則進行忽略大小寫的匹配。

l NF當前記錄中的字段數。

l NR當前記錄數。

l OFMT數字的輸出格式(默認值是%.6g)

l OFS輸出字段分隔符(默認值是一個空格)

l ORS輸出記錄分隔符(默認值是一個換行符)

l RLENGTHmatch函數所匹配的字符串的長度。

l RS記錄分隔符(默認是一個換行符)

l RSTARTmatch函數所匹配的字符串的第一個位置。

l SUBSEP 數組下標分隔符(默認值是\034)

(3)awk數組

awk允許使用數組,數組的格式如下。

Varname[下標]

awk數據組的下標可以數字(從1開始)和字符表示,name[1]、name[a]。

6.awk輸出命令

輸出命令是awk最常用的操作命令,它包含print和printf兩種方式。

(1) print

#awk ‘{print $0}’ /etc/passwd

(2)printf(格式化輸出)

格式:printf “輸出格式”,表達式

實例:#awk ‘{printf “user name:%s”,%1’} /etc/passwd

註:print和printf語句中常用的轉義字符和格式符

-轉義字符

l \t table制表位

l \n 換行符

l \\ 表示“\”

l \b 表示退格

-格式符

l %c 輸出單個字符

l %d %i 輸出整數

l %e 按科學計數法輸出小數

l %f 輸出浮點數

l %s 輸出字符串

l %% 輸出%

7.Awk控制語句

(1) if語句

功能:實現條件分支

格式:if (expr) {action1}

else {action2}

實例:#awk -F: ‘{if ($3==0) {print $0}}’ /etc/passwd

(2)for語句

功能:實現循環執行

格式:for (init_cntr;test_cntr;incr_cntr){action}

實例:#awk ‘{for(i=1;i<5;i++) {printf “%s”,$i;printf “:”} print “\n”}’

(3)while語句

功能:實現循環執行

格式:while (expr){action}

實例:#awk ‘{i=1;while(i<5) {printf “%s”,$i;printf “:”} print “\n” }’

註:還有一種do…while形式

(4)break和continue

退出循環和進行下一次循環

(5)exit

退出awk

(6)next

跳過後面內容,讀取下一行

8.awk函數

length(string) 求串string中的字符個數

index(search,string) 返回string中search串的位置

match(string,reg) 返回常規表達式reg匹配的string中的位置

sub(reg,string,target) 第一次當常規表達式reg匹配,替換target串中的字符串

substr(string,position,len)返回一個以position開始len個字符的子串

totower(string) 返回string中對應的小寫字符

toupper(string) 返回string中對應的大寫字符

split(string,store,delim) 根據分界符delim,分解string為store的數組元素
sprintf(format,variable) 返回一個包含基於format的格式化數據,variables是要放到串中的數據

strftime(format,timestamp) 返回一個基於format的日期或者時間串,timestmp是systime()函數返回的時間

srand(x) 初始化隨機數發生器。如果忽略x,則使用system()

system() 返回自1970年1月1日以來經過的時間(按秒計算)

rand() 0-1之間的隨機數

9.Awk腳本實例

#vi /awk/st1.awk

#!/bin/awk -f
#to call:du|duawk.awk
#prints file/direc‘s in bytes and blocks
BEGIN{
OFS="\t";
print "name" "\t\t","bytes","blocks\n"
print "==============================="}
{print $2,"\t\t",$1*512,$1}

#chmod a+x/awk/st1.awk

#du|awk/st1.awk


本文出自 “Linux獄長” 博客,請務必保留此出處http://sswqzx.blog.51cto.com/2494644/1975124

Linux用戶管理(十)Linux Shell高級