1. 程式人生 > >shell常用語法案例

shell常用語法案例

shell常用語法案例

一、 正則表達式:

正則表達式(或稱Regular Expression,簡稱RE)就是由普通字符(例如字符 a z)以及特殊字符(稱為元字符)組成的文字模式。

該模式描述在查找文字主體時待匹配的一個或多個字符串。

正則表達式作為一個模板,將某個字符模式與所搜索的字符串進行匹配。簡單的說,正則表示式就是處理字符串的方法,它是以行為單位來進行字符串的處理行為,正則表示式通過一些特殊符號的輔助,可以讓使用者輕易的達到搜尋/刪除/取代某特定字符串的處理程序。vimgrepfindawksed等命令都支持正則表達式。

常用正則表達式:

1.代表任意單個字符,如:/l..e/與包含一個

l,後跟兩個字符,然後跟一個e的行相匹配

grep l..e test

awk /l..e/ test

cat test(查看文件)

leeet

laat

lae

2^代表行的開始。 ^love 如:與所有love開頭的行匹配

3$代表行的結束。love$ 如:與所有love結尾的行匹配

那麽‘^$’ 就表示空行

4[]匹配括號中的字符之一

[abc] 匹配單個字符abc

[123] 匹配單個字符

123

[a-z] 匹配小寫字母a-z之一

[a-zA-Z] 匹配任意英文字母之一

[0-9a-zA-Z]匹配任意英文字母或數字之一

註意:上面標紅色的單個和之一,不管[]裏面多復雜,它的結果都是一個字符!

grep l[ae]e test

awk /l[ae]e/ test

可以用^標記做[]內的前綴,表示[]內的字符之外的字符。比如搜索oo前沒有g的字符串的行. 應用 ‘[^g]oo‘ 作搜索字符串,^符號如果出現[]的起始位置表示否定,但是[]的其他位置是普通字符[^ab^c] 匹配除了ab^c的任意單個字符

5、* 用於修飾前導字符

,表示前導字符出現0或任意多

如:a*grep‘匹配所有0個或多個a後緊跟grep的行。.*”表示任意字符串

6\?用於修飾前導字符,表示前導字符出現0或1

a\? 匹配0或1個a

7\+用於修飾前導字符,表示前導字符出現1或多

a\+ 匹配1或多個a

8\{n,m\} 用於修飾前導字符,表示前導字符出現n至m次 (n和m都是整數,且n<m)

a\{3,\} 匹配3至5個連續的a

\{n,m\}還有其他幾種形式:

\{n\} 連續的n前導字符

\{n,\} 連續的至少n個前導字符

9、\ 用於轉義緊跟其後的單個特殊字符,使該特殊字符成為普通字符

如:^\.[0-9][0-9]以一個句點和兩個數字開始

例如:

a* 匹配連續的任意(也包括0)個a

a\? 匹配0或1個a

a\+ 匹配1或多個a

a\{3,5\} 匹配3至5個連續的a

\.* 匹配0或多個連續的. \.表示普通字符句點

sed s/^ *[0-9]*// test1

history > test1(先生成test1文件)

10|表示 如:a|b|c 匹配abc。如:[a-z]|[A-Z]匹配英文字母

如:egrep grep|sed test

11(),將部分內容合成一個單位組,比如要搜索 glad good可以如下 ‘g(la|oo)d‘

如:egrep ‘g(la|oo)d’ test

12? 匹配前面的字符或子表達式零次或一次。例如,"do(es)?" 可以匹配 "do" "does"

綜合舉例:

# ls -l /bin | grep ‘^...x‘

# ls -l /bin | grep ‘^d‘

sed命令的用法

sed是一種在線編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為模式空間pattern space),接著用sed命令處理緩沖區中的內容,處理完成後,把緩沖區的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容並沒有改變,除非你使用重定向存儲輸出。

sed的基本命令

1替換: s命令
1.1 基本用法

如: sed ‘s/day/night/‘ filename> newfilename
該例子將文件 filename中的每一行第一次出現的 day 替換成 night, 將結果輸出到文件 newfilename

s " 替換 " 命令
/../../ 分割符 (Delimiter)
day 搜索字符串
night 替換字符串
其實 , 分割符 "/" 可以用別的符號代替 , 比如 ",", "|" .
如:sed ‘s/\/usr\/local\/bin/\/common\/bin/‘filename > newfilename
等價於 sed ‘s_/usr/local/bin_/common/bin_‘ filename >newfilename
顯然 , 此時用 "_" 作分割符比 "/" 好得多

1.2 & 表示匹配的字符串

有時可能會想在匹配到的字符串周圍或附近加上一些字符 .
如: sed ‘s/abc/(abc)/‘ filename >newfilename

該例子在找到的 abc 前後加上括號 .
該例子還可以寫成 sed‘s/abc/(&)/‘ filename >newfilename

下面是更復雜的例子 :
sed ‘s/[a-z]/(&)/‘ filename >newfilename

sed 默認只替換搜索字符串的第一次出現 , 利用 /g 可以替換搜索字符串所有

$ sed‘s/test/mytest/g‘ example-----在整行範圍內把test替換為mytest。如果沒有g標記,則只有每行第一個匹配的test被替換成mytest

$ sed‘s/^192.168.0.1/&localhost/‘ example-----&符號表示替換字符串中被找到的部份。所有以192.168.0.1開頭的行都會被替換成它自已加 localhost,變成192.168.0.1localhost

$ sed ‘s#10#100#g‘ example-----不論什麽字符,緊跟著s命令的都被認為是新的分隔符,所以,“#”在這裏是分隔符,代替了默認的“/”分隔符。表示把所有10替換成100

如果需要對同一文件或行作多次修改,可以使用 "-e" 選項

技術分享

取得eth0網卡IP地址:

技術分享

2刪除行:d命令

從某文件中刪除包含"how" 的所有行

技術分享

/etc/passwd的內容顯示並找印行號,同時將2~5刪除

技術分享

附:nl命令在linux系統中用來計算文件中行號nl可以將輸出的文件內容自動的加上行號

如果只要刪除第2行,可以使用nl /etc/passwd |sed ‘2d‘ 來達成,至於若是要刪除第 3 到最後一行,則是nl /etc/passwd | sed ‘3,$d‘的啦。

3.增加行:a命令(在指定的行後新增)或i命令(在指定的行前新增)

a的後面可以接字符串,而這些字符串會在新的一行出現

/etc/passwd的第二行後增加“XXXXX”字樣的新行

技術分享

/etc/passwd的第二行前增加“XXXXX”字樣的新行

技術分享

如果要同時新增多行,則每行之間要用反斜杠\來進行新行的添加

技術分享

4、取代行:c命令

c的後面可以接字符串,這些字符串可以取代n1,n2之間的行

技術分享

5、打印:p命令

sed‘/north/p‘ datafile 默認輸出所有行,找到north的行重復打印

sed –n ‘/north/p‘datafile 禁止默認輸出,只打印找到north的行

nl/etc/passwd | sed -n ‘5,7p‘ 僅列出/etc/passwd文件中的第57行內容

註:sed-i選項可以直接修改文件中的內容

技術分享

三、awk命令:

awk也是一個數據處理工具!相較於 sed 常常作用於一整個行的處理, awk 則比較傾向於一行當中分成數個字段來處理。

.awk語言的最基本功能是在文件或字符串中基於指定規則來分解抽取信息,也可以基於指定的規則來輸出數據。

1.命令格式

awk [-F field-separator] ‘commands‘ input-files

其中,[-F域分隔符]是可選的,因為awk使用空格或tab鍵作為缺省的域分隔符,因此如果要瀏覽域間有空格的文本,不必指定這個選項,如果要瀏覽諸如passwd文件,此文件各域以冒號作為分隔符,則必須指明-F選項,如:awk -F: ‘commands‘ input-file

:linux系統中用環境變量IFS存儲分隔符,但根據實際應用也可以改變IFS的值.

例如:

技術分享

腳本執行結果如下:

技術分享

commands 是真正awk命令, input-files 是待處理的文件。

iput_files可以是多於一個文件的文件列表,awk將按順序處理列表中的每個文件。

awk中,文件的每一行中,由域分隔符分開的每一項稱為一個域。通常,在不指名-F域分隔符的情況下,默認的域分隔符是空格或tab鍵。

awk的模式和動作

任何awk語句都由模式和動作組成(awk_pattern { actions })。
在一個awk腳本中可能有許多語句。

模式部分決定動作語句何時觸發及觸發事件。處理即對數據進行的操作。如果省略模式部分,動作將時刻保持執行狀態。即省略時不對輸入記錄進行匹配比較就執行相應的actions。

模式可以是任何條件語句或正則表達式等。awk_pattern可以是以下幾種類型:

1) 正則表達式用作awk_pattern:/regexp/

例如:awk ‘/^[a-z]/‘ input_file

2) 布爾表達式用作awk_pattern,表達式成立時,觸發相應的actions執行。

表達式中可以使用變量(如字段變量$1,$2等)和/regexp/

② 布爾表達式中的操作符:

關系操作符: <> <= >= == !=
匹配操作符: value ~ /regexp/ 如果value匹配/regexp/,則返回真

value!~ /regexp/ 如果value不匹配/regexp/,則返回真
例如: awk ‘$2 > 10 {print "ok"}‘ input_file
awk ‘$3 ~ /^d/ {print"ok"}‘ input_file

③ &&(與) 和 ||(或) 可以連接兩個/regexp/或者布爾表達式,構成混合表達式。!(非) 可以用於布爾表達式或者/regexp/之前。

例如: awk ‘($1< 10 ) && ($2 > 10) {print "ok"}‘ input_file
awk ‘/^d/ || /x$/ {print"ok"}‘ input_file

模式包括兩個特殊字段 BEGINEND。使用BEGIN語句設置計數和打印頭。BEGIN語句使用在任何文本瀏覽動作之前,之後文本瀏覽動作依據輸入文本開始執行。END語句用來在awk完成文本瀏覽動作後打印輸出文本總數和結尾狀態標誌。

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

awk執行時,其瀏覽域標記為$1$2...$n。這種方法稱為域標識。使用這些域標識將更容易對域進行進一步處理。

使用$1 , $3表示參照第1和第3域,註意這裏用逗號做域分隔。如果希望打印一個有5個域

的記錄的所有域,不必指明$1 , $2 , $3 , $4 , $5,可使用$0,意即所有域。

為打印一個域或所有域,使用print命令。這是一個awk動作

awk的運行過程:

如果BEGIN 區塊存在,awk執行它指定的actions。

awk從輸入文件中讀取一行,稱為一條輸入記錄。(如果輸入文件省略,將從標準輸入讀取)

awk將讀入的記錄分割成字段,將第1個字段放入變量$1中,第2個字段放入$2,以此類推。$0表示整條記錄。

把當前輸入記錄依次與每一個awk_cmd中awk_pattern比較,看是否匹配,如果相匹配,就執行對應的actions。如果不匹配,就跳過對應的actions,直到比較完所有的awk_cmd。

當一條輸入記錄比較了所有的awk_cmd後,awk讀取輸入的下一行,繼續重復步驟,這個過程一直持續,直到awk讀取到文件尾。

當awk讀完所有的輸入行後,如果存在END,就執行相應的actions。

入門實例:

例1:顯示/etc/passwd文件中的用戶名和登錄shell

技術分享

如果只是顯示/etc/passwd的賬戶和賬戶對應的shell,而賬戶與shell之間以tab鍵分割

技術分享

如果只是顯示/etc/passwd文件中的用戶名和登錄shell, 而賬戶與shell之間以逗號分割

技術分享

註:awk的總是輸出到標準輸出,如果想讓awk輸出到文件,可以使用重定向。

例2:顯示/etc/passwd文件中的UID大於500的所有用戶的用戶名和登錄shell

技術分享

例3:如果只是顯示/etc/passwd文件中的UID大於500的用戶名和登錄shell,而賬戶與shell之間以逗號分割,而且在所有行添加列名name,shell,在最後一行添加"blue,/bin/nosh"。

技術分享

註:

1.awk 後面接兩個單引號並加上大括號 {} 來設定想要對數據進行的處理動作

2.awk工作流程是這樣的:先執行BEGING,然後讀取文件,讀入有\n換行符分割的一條記錄,然後將記錄按指定的域分隔符劃分域,填充域,$0則表示所有域,$1表示第一個域,$n表示第n個域,隨後開始執行模式所對應的動作。接著開始讀入第二條記錄······直到所有的記錄都讀完,最後執行END操作。

思考題:如何打印所有記錄(以/etc/passwd中的內容為例)

技術分享

4:搜索/etc/passwdroot關鍵字的所有行

技術分享

這種是pattern(模式)的使用示例,匹配了pattern(這裏是root)的行才會執行action(沒有指定action,默認輸出每行的內容)

搜索支持正則表達式,例如找root開頭的:

技術分享

搜索/etc/passwdroot關鍵字的所有行,並顯示對應的shell

技術分享

這裏指定了action{print $7}

awk內置變量

awk有許多內置變量用來設置環境信息,下面給出了最常用的一些變量。

FILENAME awk瀏覽的文件名

FS 設置輸入域分隔符,等價於命令行-F選項

NF 瀏覽記錄的域個數(每一行($0)擁有的字段總數)

NR 已讀的記錄數(awk所處理的是第幾行數據)

例5:顯示 /etc/passwd文件中1、3、5、7行對應的完整行內容:

技術分享

顯示所有賬戶的記錄,並帶有其記錄號,並在END部分打印輸入文件名

技術分享

除了awk的內置變量,awk還可以自定義變量

6:統計/etc/passwd的賬戶人數

技術分享

count是自定義變量。之前的action{}裏都是只有一個print,其實print只是一個語句,而action{}可以有多個語句,以;號隔開。

這裏沒有初始化count,雖然默認是0,但是妥當的做法還是初始化為0:

技術分享

例7:統計某個文件夾下的文件占用的字節數

技術分享

如果以M為單位顯示:

技術分享

註意:以上統計沒有包括子目錄中的文件

如果想快速查看所有文件的長度及其總和,但要排除子目錄,如何實現:

技術分享


本文出自 “10946218” 博客,謝絕轉載!

shell常用語法案例