文本主要是記錄在學習實驗樓中的Linux基本入門課程時,所做的學習筆記。
如有版權問題請聯繫:[email protected]
掌握基本命令:sed ,grep ,awk的用法
掌握正則表達式符號和語法
語法
字符 | 描述 |
---|---|
\ | 將下一個字符標記爲一個特殊字符、或一個原義字符。例如,“n”匹配字符“n”。“\n”匹配一個換行符。序列“\”匹配“\”而“(”則匹配“(”。 |
^ | 匹配輸入字符串的開始位置。 |
$ | 匹配輸入字符串的結束位置。 |
{n} | n是一個非負整數。匹配確定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的兩個o。 |
{n,} | n是一個非負整數。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等價於“o+”。“o{0,}”則等價於“o*”。 |
{n,m} | m和n均爲非負整數,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”將匹配“fooooood”中的前三個o。“o{0,1}”等價於“o?”。請注意在逗號和兩個數之間不能有空格。 |
* | 匹配前面的子表達式零次或多次。例如,zo*能匹配“z”、“zo”以及“zoo”。*等價於{0,}。 |
+ | 匹配前面的子表達式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等價於{1,}。 |
? | 匹配前面的子表達式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等價於{0,1}。 |
? | 當該字符緊跟在任何一個其他限制符(*,+,?,{n},{n,},{n,m})後面時,匹配模式是非貪婪的。非貪婪模式儘可能少的匹配所搜索的字符串,而默認的貪婪模式則儘可能多的匹配所搜索的字符串。例如,對於字符串“oooo”,“o+?”將匹配單個“o”,而“o+”將匹配所有“o”。 |
. | 匹配除“\n”之外的任何單個字符。要匹配包括“\n”在內的任何字符,請使用像“(.|\n)”的模式。 |
(pattern) | 匹配pattern並獲取這一匹配的子字符串。該子字符串用於向後引用。要匹配圓括號字符,請使用“(”或“)”。 |
x|y | 匹配x或y。例如,“z|food”能匹配“z”或“food”。“(z|f)ood”則匹配“zood”或“food”。 |
[xyz] | 字符集合(character class)。匹配所包含的任意一個字符。例如,“[abc]”可以匹配“plain”中的“a”。其中特殊字符僅有反斜線\保持特殊含義,用於轉義字符。其它特殊字符如星號、加號、各種括號等均作爲普通字符。脫字符^如果出現在首位則表示負值字符集合;如果出現在字符串中間就僅作爲普通字符。連字符 - 如果出現在字符串中間表示字符範圍描述;如果如果出現在首位則僅作爲普通字符。 |
[^xyz] | 排除型(negate)字符集合。匹配未列出的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”。 |
[a-z] | 字符範圍。匹配指定範圍內的任意字符。例如,“[a-z]”可以匹配“a”到“z”範圍內的任意小寫字母字符。 |
[^a-z] | 排除型的字符範圍。匹配任何不在指定範圍內的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”範圍內的任意字符。 |
優先級
優先級爲從上到下從左到右,依次降低:
運算符 | 說明 |
---|---|
\ | 轉義符 |
(), (?:), (?=), [] | 括號和中括號 |
*、+、?、{n}、{n,}、{n,m} | 限定符 |
^、$、\任何元字符 | 定位點和序列 |
| | 選擇 |
grep模式匹配命令
grep命令用於打印輸出文本中匹配的模式串,它使用正則表達式作爲模式匹配的條件。grep支持三種正則表達式引擎,分別用三個參數指定:
參數 | 說明 |
---|---|
-E | POSIX擴展正則表達式,ERE |
-G | POSIX基本正則表達式,BRE |
-P | Perl正則表達式,PCRE |
在通過grep命令使用正則表達式之前,先介紹一下它的常用參數:
參數 | 說明 |
---|---|
-b | 將二進制文件作爲文本來進行匹配 |
-c | 統計以模式匹配的數目 |
-i | 忽略大小寫 |
-n | 顯示匹配文本所在行的行號 |
-v | 反選,輸出不匹配行的內容 |
-r | 遞歸匹配查找 |
-A n | n爲正整數,表示after的意思,除了列出匹配行之外,還列出後面的n行 |
-B n | n爲正整數,表示before的意思,除了列出匹配行之外,還列出前面的n行 |
–color=auto | 將輸出中的匹配項設置爲自動顏色顯示 |
下面包含完整的特殊符號及說明:
特殊符號 | 說明 |
---|---|
[:alnum:] | 代表英文大小寫字節及數字,亦即 0-9, A-Z, a-z |
[:alpha:] | 代表任何英文大小寫字節,亦即 A-Z, a-z |
[:blank:] | 代表空白鍵與 [Tab] 按鍵兩者 |
[:cntrl:] | 代表鍵盤上面的控制按鍵,亦即包括 CR, LF, Tab, Del.. 等等 |
[:digit:] | 代表數字而已,亦即 0-9 |
[:graph:] | 除了空白字節 (空白鍵與 [Tab] 按鍵) 外的其他所有按鍵 |
[:lower:] | 代表小寫字節,亦即 a-z |
[:print:] | 代表任何可以被列印出來的字節 |
[:punct:] | 代表標點符號 (punctuation symbol),亦即:” ’ ? ! ; : # $… |
[:upper:] | 代表大寫字節,亦即 A-Z |
[:space:] | 任何會產生空白的字節,包括空白鍵, [Tab], CR 等等 |
[:xdigit:] | 代表 16 進位的數字類型,因此包括: 0-9, A-F, a-f 的數字與字節 |
注意:之所以要使用特殊符號,是因爲上面的[a-z]不是在所有情況下都管用,這還與主機當前的語系有關,即設置在LANG環境變量的值,zh_CN.UTF-8的話[a-z],即爲所有小寫字母,其它語系可能是大小寫交替的如,”a A b B…z Z”,[a-z]中就可能包含大寫字母。所以在使用[a-z]時請確保當前語系的影響,使用[:lower:]則不會有這個問題。
sed 留編輯器
sed -i '1s/sad/happy/' test # 表示將test文件中第一行的"sad"替換爲"happy"
參數 | 說明 |
---|---|
-n | 安靜模式,只打印受影響的行,默認打印輸入數據的全部內容 |
-e | 用於在腳本中添加多個執行命令一次執行,在命令行中執行多個命令通常不需要加該參數 |
-f | filename 指定執行filename文件中的命令 |
-r | 使用擴展正則表達式,默認爲標準正則表達式 |
-i | 將直接修改輸入文件內容,而不是打印到標準輸出設備 |
sed執行命令格式:
[n1][,n2]command
[n1][~step]command
其中一些命令可以在後面加上作用範圍,形如:
$ sed -i 's/sad/happy/g' test
# g表示全局範圍
$ sed -i 's/sad/happy/4' test
# 4表示指定行中的第四個匹配字符串
其中n1,n2表示輸入內容的行號,它們之間爲,逗號則表示從n1到n2行,如果爲~波浪號則表示從n1開始以step爲步進的所有行;command爲執行動作,下面爲一些常用動作指令:
命令 | 說明 |
---|---|
s | 行內替換 |
c | 整行替換 |
a | 插入到指定行的後面 |
i | 插入到指定行的前面 |
p | 打印指定行,通常與-n參數配合使用 |
d | 刪除指定行 |
awk文本處理語言
雖然很強大,感覺暫時用不到,先付個常用的內置變量表吧
變量名 | 說明 |
---|---|
FILENAME | 當前輸入文件名,若有多個文件,則只表示第一個。如果輸入是來自標準輸入,則爲空字符串 |
$0 | 當前記錄的內容 |
$N | N表示字段號,最大值爲NF變量的值 |
FS | 字段分隔符,由正則表達式表示,默認爲” “空格 |
RS | 輸入記錄分隔符,默認爲”\n”,即一行爲一個記錄 |
NF | 當前記錄字段數 |
NR | 已經讀入的記錄數 |
FNR | 當前輸入文件的記錄數,請注意它與NR的區別 |
OFS | 輸出字段分隔符,默認爲” “空格 |
ORS | 輸出記錄分隔符,默認爲”\n” |