shell
shell腳本編程:
1)什麼叫編程,編程就是編寫程序源代碼。爲了可以讓用戶在使用計算機的時候,可讓計算機以非交互式的方式完成某 些任務,須要將這些任務編制稱爲一個文件,讓計算機順序讀取,從而實現功能;
2)編程語言:
高級語言:
根據源代碼的處理方式:
編譯運行語言:
源代碼 --> 編譯器(編譯) --> 彙編器(彙編) --> [連接器(庫的連接)] -->能夠直接執行的二進制文件;
解釋運行語言:
源代碼 --> 直接啓動跟源代碼對應的解釋器程序,由解釋器邊解釋邊執行;
根據其編程過程當中的功能的實現是調用庫還調用外部程序文件:
完整編程語言:
利用庫或編程組件進行編程;
腳本編程語言:
解釋器
shell腳本:調用shell程序,其次調用須要的外部命令文件;命令解釋器
提供了單一功能的編程接口:過程式編程邏輯的支持;
根據程序的編寫範式:程序=指令+數據 程序=算法+數據結構
過程式編程語言:
以指令(算法)爲中心,圍繞指令(算法)的實現設計數據和數據結構,數據爲指令服務的;
算法或指令的實現形式:
順序執行
選擇執行
循環執行
對象式編程語言:
以數據爲中心,將數據實例化爲類,圍繞着數據的需求來部署指令
類(class):被實例化的數據
屬性(attribution):同一類中的不一樣對象的區分依據;
方法(method):類的正確的操做方法;
低級語言:
彙編語言
shell腳本編程是一種過程式編程語言,解釋運行,依賴於外部程序文件運行;
3)shell腳本究竟是什麼?
1.純文本文檔——文件中所存儲的數據都是以字符爲單位進行存儲的;
2.根據用戶的需求來解決用戶問題的大量命令的組合體;
3."執行冪等性"——任何命令屢次執行的結果是一致的;
不少命令都不具有"執行冪等性",在shell腳本中就須要使用大量的程序邏輯來判斷某個命令是否知足其運行條件,以免在運行過程當中出現嚴重錯誤;
4) shell腳本中的代碼內容:
1.首行必須是shebang,解釋器路徑,必須佔據絕對行首:在執行時,啓動相應的解釋器以解釋腳本內諸多的命令;
#!/bin/bash
#!/bin/sh
#!/usr/bin/python
#!/usr/bin/perl
2.在shell腳本中,除了shebang以外,以#佔據絕對行首的內容,均爲註釋行;解釋器會忽略這樣的行的內容;
3.解釋會忽略腳本中因此的空白行;
4.大量的命令和關鍵字(if,else,then,do,while,for,...)
5.bash中全部的特殊字符;
注意:shell腳本一旦運行,是在當前的shell中根據shebang的指示,開啓一個解釋器(子shell)解釋執行代碼內容,shell腳本的內容是在一個子shell進程中實現的;
咱們能夠利用文本編輯工具來編寫shell腳本:
nano、vi、vim、emacs、pico
推薦使用vim:語法着色特性,自動縮進,...
腳本命名方式:可使用.sh的文件名後綴;在低版本的vim編輯器,只能根據.sh的後綴命令來識別是否爲shell腳本;高版本的vim編輯器,則無需過多的關心文件後綴名的問題;
5)腳本的運行方法:
1.爲腳本文件賦予執行權限,直接運行此文件;
~]# chmod +x /PATH/TO/SCRIPT_FILE
~]# /PATH/TO/SCRIPT_FILE
若是在執行腳本時,只寫腳本文件名不給出路徑的話,必須確保PATH變量中保存的路徑下,能找到該腳本文件;
2.直接使用解釋器運行腳本,將腳本做爲解釋器命令的參數;
bash /PATH/TO/SCRIPT_FILE
bash -x /PATH/TO/SCRIPT_FILE:將腳本的運行過程展現出來,通常用於腳本排錯;
bash -n /PATH/TO/SCRIPT_FILE:對腳本進行語法排錯,若是存在語法錯誤,則bash會給予提示,針對於這類錯誤提示,須要咱們自行判斷錯誤發生的位置;
6)文本處理工具:
vim、vi、nano
文本處理三劍客:
grep系:grep、egrep、fgrep,文本搜索工具,基於"PATTERN"對於給定的文本進行模糊搜索,grep系默認工做於貪婪模式下;
sed:Stream EDitor,流編輯器,行編輯器,文本編輯工具;
awk:gawk——GNU awk,文本格式化工具,文本報告生成器,文本處理的編程語言;
grep系:
grep
egrep
fgrep
grep:Global search Regular Expression and Print out the line.
利用正則表達式進行全局搜索並將匹配的行顯示出來;
grep [OPTIONS] PATTERN [FILE...]
PATTERN:過濾條件,是由正則表達式元字符以及沒有特殊含義的文本字符組成;
正則表達式的元字符:
會被正則表達式引擎解釋爲特殊含義;
pcre——perl語言的正則表達式引擎;
基本的正則表達式:BRE
擴展的正則表達式:ERE
grep默認僅支持基本正則表達式;
egrep默認僅支持擴展正則表達式;
fgrep默認不開啓正則表達式引擎;
文本字符:
只具有字符便面含義的那些字符;
經常使用選項:
-i, --ignore-case:忽略文本字符的大小寫;
-v, --invert-match:反向匹配;最終顯示的結果是PATTERN不能成功匹配的行;
-c, --count:計數,統計匹配PATTERN的全部的行數;
-o, --only-matching:關閉貪婪模式,僅顯示PATTERN可以匹配的內容;
-q, --quiet, --silent:安靜模式,不輸出任何匹配結果;
--color[=WHEN], --colour[=WHEN]:將匹配PATTERN的內容以特殊顏色高亮顯示;
--color=auto
-E, --extended-regexp:擴展的正則表達式,grep -E至關於egrep;
-F, --fixed-strings, --fixed-regexp:grep -F至關於fgrep
-G, --basic-regexp:基本的正則表達式,egrep -G至關於grep
-P, --perl-regexp:使用PCRE(Perl Common Regular Expression)引擎;
-A NUM, --after-context=NUM:在顯示匹配PATTERN的行的同時顯示其後面的NUM行;
-B NUM, --before-context=NUM:在顯示匹配PATTERN的行的同時顯示其前面的NUM行;
-C NUM, -NUM, --context=NUM:在顯示匹配PATTERN的行的同時顯示其先後各NUM行;
PATTERN:
正則表達式元字符:
基本的正則表達式元字符:
GLOBBING-------簡化版的正則表達式: [] ? *
字符匹配:
. :匹配任意單個字符;
[]:匹配指定範圍內的任意單個字符;
[^]:匹配指定範圍之外的任意單個字符;
下列全部的字符集均可以放置於[]之中用於匹配單個字符;
[:lower:]
[:upper:]
[:alpha:]
[:digit:]
[:space:]
[:alnum:]
[:punct:]
[:blank:]
[:xdigit:]:全部的十六進制數字;
a-z:全部的小寫字母
A-Z:全部的大寫字母
0-9:標識全部的十進制數字
[:alnum:](字母和數字), [:alpha:](字母), [:cntrl:](), [:digit:](數字),
[:graph:](), [:lower:](小寫字母), [:print:](可打印字符), [:punct:](),
[:space:](空格), [:upper:](大寫字母), [:xdigit:]
次數匹配:該類字符以前的那個字符能夠出現的次數;
*:其前面的字符能夠出現任意次(0次,1次或屢次);
\?:其前面的字符無關緊要(0次或1次);
\+:其前面的字符至少出現一次(1次或屢次);
\{m\}:其前面的字符必須出現m次;
\{m,n\}:其前面的字符至少出現m次,至多出現n次;(m<n)
\{,n\}:其前面的字符至少出現0次,至多出現n次;
\{m,\}:其前面的字符至少出現m次,×××;
在正則表達式中,表示任意長度任意字符的方式:.*
位置錨定字符:
行錨定:
行首錨定:^
行尾錨定:$
字錨定:
字首錨定:\<或\b
字尾錨定:\>或\b
\b:舊版本中的錨定方法,建議不使用;
對於正則表達式引擎來講,字是由非特殊字符組成的連續字符串;
分組與引用字符:
\(PATTERN\):將此PATTERN所匹配到的全部字符看成一個不可分割的總體來處理
在正則表達式引擎之中,有一系列的內置變量,這些變量會保存全部分組內的字符信息,用於後向引用;這些變量依次是:\1, \2, \3, ...
pattern1\(pattern2\)pattern3\(pattern4\(pattern5\)\)
\1:pattern2
\2:pattern4
\3:pattern5
\1:第一組小括號中的pattern匹配到的字符;
\2:第二組小括號中的pattern匹配到的字符;
...
請找出在/etc/passwd中用戶的UID和GID相同的用戶帳戶;
~]# grep '\(\<[[:digit:]]\+\>\).*\1' /etc/passwd
或:
\|
注意:\|將其左右兩邊的字符串看成總體對待;
A\|american :A或american
請找出ifconfig命令的執行結果中數值在100-255之間的整數;
第一位:1 2
第二位:0-9 0-4 5
第三位:0-9 0-9 0-5
ifconfig | grep '\<\(1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)\>'
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
默認狀況下,grep命令後面只容許有一個PATTERN;
若是想要在一次grep所搜過程當中寫多個PATTERN,則須要使用-e選項;每一個-e選項只能使用一個PATTERN做爲參數;
將所須要的PATTERN寫入到一個文件中,保證每行只有一個PATTERN;咱們就可使用-f FILE方式來實現多PATTERN匹配;
egrep:
egrep [OPTIONS] PATTERN [FILE...]
擴展的正則表達式元字符:
字符匹配:
.
[]
[^]
次數匹配:
*
?
+
{m}
{m,n}
{m,}
{0,n}
位置錨定
^
$
\<,\b
\>,\b
分組和引用:
()
\1, \2, \3,...
或:
|
fgrep:PATTERN中全部的字符都被看成文本字符來處理;
其餘的文本處理命令:
wc:
wc [OPTION]... [FILE]...
-l:只顯示行數
-w:只顯示字數
-c:只顯示字符數
cut:remove sections from each line of files
可以被cut命令修剪的文件,通常都是具備必定結構或格式的文本文檔;/etc/passwd
cut OPTION... [FILE]...
-d, --delimiter=DELIM:指定在實施修剪操做時所依賴的分隔符,默認是空白字符;
-f, --fields=LIST:根據定義的分隔符來指定字段的編號;
地址定界使用方法:
#:選擇被指定的單個字段;
#,#:離散的多個被指定的單個字段;
#-#:連續的多個被指定的字段;
--output-delimiter=STRING:指定輸出分隔符;
awk:
awk -F "DELIMITER" '[/PATTERN/]{print $1,$2,...$NF}' FILE...
-F "DELIMITER":指定字段分隔符,默認爲空白字符;
$1,$2,...,$NF:根據字段分隔符切割出來的文本片斷都存放在相應的內部變量中;
sort:sort lines of text files,將文本文件按行繼續排序,默認排序規則是按照ASCII表中的字符順序進行,這個排序標準可修改;
-r, --reverse:逆序排序
-R, --random-sort:隨機排序,這種隨機算法是很是簡陋的,不適用於複雜環境;
-u, --unique:重複出現的行,只保留一行;(連續且徹底相同的行叫重複),祛重;
-n, --numeric-sort:以數字的數值大小進行排序;
-t, --field-separator=SEP:指定字段分隔符;
-k, --key=KEYDEF:指明根據哪一個關鍵字段進行排序,通常和-t同時使用;
uniq:report or omit repeated lines
-d, --repeated:只顯示重複出現的行,並且每一組重複行只顯示一行;
-u, --unique:只顯示不重複的行;
-c, --count:在每行之前綴的方式顯示重複行的重複次數;
diff:compare files line by line
同一文件的不一樣修改版本;打補丁;
patch:apply changes to files
patch [-R][-i patchfile] [file]
... ...
python