文本處理工具:
Vim vi nano
文本處理三劍客
Grep系:grep,egrep,fgrep,文本搜索工具,基於“PATTERN”對於給定的文本進行模糊搜索,grep系默認工作於貪婪模式下
Sed:stream editor ,流編輯器,行編輯器,文本編輯工具
Awk:gawk——GUN awk,文本格式化工具,文本報告生成器,文本處理的編程語言,
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:]
[:alnum:]
[:punct:]
[:blank:]
[:xdigit:]:所有的十六進制數字
a-z:所有的小寫字母
A-Z:所有的大寫字母
0-9:標識所有的十進制數字
次數匹配:該類字符之前的那個字符可以出現的次數
*(星號):其前門的字符可以出現任意次(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]\>'
請找出ifconfig命令執行結果中數值在0-255之間的整數
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
默認情況下,grep命令後面只允許有一個PATTERN
如果想要在一次grep所搜過程中寫多個PATTERN,則需要使用-e選項,每個-e選項只能使用一個PATTERN作爲參數;
將所需要的PATTERN寫入到一個文件中,保證每行只有一個PATTERN,我們就可以使用-f FILE方式來實現多PATTERN匹配
Egrep:
語法結構:grep [OPTIONS] PATTERN [FILE...]
擴展的正則表達式元字符:
字符匹配:
.
[]
[^]
次數匹配:
*
?
+
{m}
{m,n}
{m,}
{0,n}
位置錨定:
^
$
\<,\b
\>,\b
分組和引用:
()
\1,\2,\3,...
或:
|
Fgrep:PATTERN中所有的字符都當作文本字符來處理ION;
其他的文本處理命令:
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
parch [-R][-i patchfile] [file]
編程語言:
問題空間:就是使用人類的自然語言描述的任務
解空間:就是使用編程語言描述任務的實施步驟和顯示最終結果
編程思想:能夠把編程語言所提供的語法格式,隨時隨地轉換成能夠解決問題的思路
對於編程語言的學習:
1.學習編程語言的語法格式
2.學習工具的使用(庫,命令)
3.算法
4.數據結構
學習編程語言的目標:
將問題空間和解空間對應起來,最直接的辦法就是使用解空間的語言習慣來進行思考;
shell腳本編程:
shell腳本的內容和格式:
首行,絕對行首,shebang(解釋器程序的絕對路徑)
註釋信息,以#佔據絕對行首的行
爲了能夠在程序中突出程序的功能,適當的添加空白行,以分隔不同功能的源代碼塊;
有一定的縮進
利用bash腳本編程實現算術運算:
+,-,
*,/,
%:模運算,取餘數
**|^
增強型的算術元算符號:
+=:let B=B+2 ---> let B+=2
-=:let B-B=2 ---> let B-=2
*=:let B=B*2 ---> let B*=2
/=:let B=B/2 ---> let B/=2
%=:let B=B%2 ---> let B%=2
特殊的增強型算術運算:
let B=B+1 ---> let B+=1 ---> let B++
let B=B-1 ---> let B-=1 ---> let B--
B++:先將B的值賦給其他變量,然後自身+1
++B:先做自身+1,然後再將B值賦給其他變量
算術運算方法:
1.let VAR=算術表達式
將算術表達式先進行算術運算,並將運算得到的結果保存到變量VAR中
2.VAR=$[算術表達式]
算術表達式中有過有變量引用,可以使用$,也可以省略$;
例子:SUM=$[C+B]相當於SUM=$[$C+$B]
3.VAR=$[算術表達式]
算術表達式中如果有變量引用,可以使用$引用,也可以省略$
4.expr ARGU1 ARGU2 ARGU3
ARGU1和ARGU3必須是數值
ARGU2必須是運算符號
5.echo "算術表達式" | bc
注意:*號,在某些情況下需要轉義;
例子:
統計/etc/fstab,/etc/passwd,/etc/issue三個文件中,以字母r開頭的行數的總和;
echo $[`grep -c "^r" /etc/passwd`+`grep -c "^r" /etc/issue`+`grep -c "^r" /etc/fstab`]
變量:存儲數據的容器
弱變量,弱類型變量,字符(默認)型,數值型(不包括浮點型)
條件測試命令:
test EXPRESSION
shell內建命令:
[ EXPRESSION ]
外部命令:
` EXPRESSION `
bash的內部關鍵字:
注意:這類命令一般沒有執行結果,只有執行狀態返回值
test測試命令有三類測試表達式:
1.數值測試:雙目操作符
-eq:被測試的兩個數值,是否相等,相等爲真,不等爲假;
-ne:被測試的兩個數值,是否不相等,不等爲真,相當爲假
-gt:被測試的兩個數值,左邊的是否大於右邊的,大於爲真,不大於爲假
-lt:被測試的兩個數值,左邊的是否小於右邊的,小於爲真,不小於爲假
-ge:被測試的兩個數值,左邊的是否大於等於右邊的,大於等於爲真,小於爲假
-le:被測試的兩個數值,左邊的是否小於等於右邊的,小於等於爲真,大於爲假
例子:~/aaa的大小是否小於1000字節
[root@localhost 桌面]# [ $(ls -l aaa | awk '{print $5}') -lt 1000 ] && echo ok ||echo "bu ok"
2.字符串測試
==|=:被測試的兩個字符串是否相同,相同爲真,不同爲假;
!=:被測試的兩個字符是否相同,不同爲真,相同爲假
>:被測試的兩個字符串在ASCII碼錶中對應的二進制數值,左邊是否大於右邊,大於爲真,小於爲假
<:被測試的兩個字符串在ASCII碼錶中對應的二進制數值,左邊是否小於右邊,小於爲真,大於爲假
注意:>和<必須在` EXPRESSION `(必須兩個中括號,切有空格)測試語句中
=~:被測試的兩個字符串,左側字符串能否被右側的PATTERN匹配,能匹配爲真,不能匹配爲假;
單目操作符:
-z 'STRING':判斷指定的字符串是否爲空串,空爲真,不空爲假
-n 'STRING':判斷指定的字符串是否爲非空串,非空爲真,空爲假
注意:
1.通常情況下,字符串要加引號,單引號或雙引號,根據實際情況選擇即可
2.[[]]和[]在某些情況下,可能意義不同;
3.表達式兩端以及操作符兩端都要有空格;
3.文件狀態測試
文件的存在性測試,如果被測試的文件存在爲真,不存在爲假
-a | -e
[ -e /backup ]
[ -a /backup ]
文件類型測試(先測試存在性)
-b FILE:被測試的文件是否存在並且是否爲塊設備,存在且爲塊設備,否則爲假
-c FILE:被測試的文件是否存在並且是否爲字符設備,存在且爲字符設備,否則爲假
-d FILE:被測試的文件是否存在並且是否爲目錄文件,存在且爲目錄文件,否則爲假
-f FILE:被測試的文件是否存在並且是否爲普通文件,存在且爲普通文件,否則爲假
-h FILE:被測試的文件是否存在並且是否爲符號鏈接文件,存在且爲符號鏈接文件,否則爲假
-L FILE:被測試的文件是否存在並且是否爲符號鏈接文件,存在且爲符號鏈接文件,否則爲假
-p FILE:被測試的文件是否存在並且是否爲管道文件,存在且爲管道文件,否則爲假
-S FILE:被測試的文件是否存在並且是否爲套接字文件,存在且爲套接字文件,否則爲假
文件的訪問權限測試;
-r FILE:被測試的文件是否存在並且當前有效賬戶是否可讀,文件存在並且當前有用戶可讀爲真,否則爲假
-w FILE:被測試的文件是否存在並且當前有效賬戶是否可寫,文件存在並且當前有用戶可寫爲真,否則爲假
-x FILE:被測試的文件是否存在並且當前有效賬戶是否可執行,文件存在並且當前有用戶可執行爲真,否則爲假
文件的特殊權限標識測試:
-u FILE:被測試的文件是否存在並且是否設置了SUID權限,文件存在並且設置了SUID權限爲真,否則爲假
-g FILE:被測試的文件是否存在並且是否設置了SGID權限,文件存在並且設置了SGID權限爲真,否則爲假
-k FILE:被測試的文件是否存在並且是否設置了STICKY權限,文件存在並且設置了STICKY權限爲真,否則爲假
文件的所有權測試:
-O FILE:被測試的文件是否存在並且其屬主是否爲當前有效用戶,有效爲真,否則爲假
-G FILE:被測試的文件是否存在並且其屬組是否爲當前有效用戶的組,有效爲真,否則爲假
文件內容是否爲空:
-s FILE:被測試的文件是否存在並且內容不爲空,存在且內容不空爲真,否則爲假
時間戳測試:
-N FILE:被測試的文件自從上一次被修改之後,是否被修改過,修改過爲真,否則爲假
雙目測試:
FILE1 -ef FILE2:測試兩個文件是否指向同一個文件系統的相同inode的硬鏈接
FILE1 -ef FILE2:被測試的兩個文件,FILE1是否比FILE2更新,更新爲真,否則爲假
FILE1 -ef FILE2:被測試的兩個文件,FILE1是否比FILE2更舊,更舊爲真,否則爲假
測試語句中可以田間邏輯運算:
第一種表達方式:
[ -O /tmp/test ] && [ -s /tmp/test ]
[ -O /tmp/test ] || [ -s /tmp/test ]
第二種表達方式:
[ -O /tmp/test -a -s /tmp/test ]
[ -O /tmp/test -o -s /tmp/test ]
[!-O /tmp/test ]
命令的執行結果:
正常的輸出結果:
命令的執行狀態返回值:
0-255
0:表示命令執行成功
1,2,127:系統保留
3-126,128-255:用戶自定義的執行狀態返回值
exit[#]退出當前shell的登錄
當shell腳本運行時,一旦遇到exit命令,將立即結束當前shell進程,同時腳本的運行也將被停止,即exit後面的所有命令都不再被解釋執行;