一、正規表達式
linux的正則主要分為基礎正則和拓展正則,基礎的正則如下:
1.正則比對時會最大化比對結果
正規表達式由于其貪婪比對的邏輯,會将結果進行最大化比對,經常書寫出的正則會超出我們的需要,是以書寫時我們要用定界符到,如/etc/passwd檔案中的第一列為使用者名,用冒号分隔,後面都跟x,如果我們簡單的以:作為分隔符,正則或最大化比對結果,比對到最後一個x,但我們可以如果用:x:來做定界符,就能精确定位到我們想要的結果
2.轉義字元的使用
正則中,隻要不是想要搜尋的符号,就必須加\轉義字元将其轉換為原本的意思,如上表中的 ma(tri)?,[0-9]{3}等正則例子,實際書寫時都要加轉義字元,寫為“ma\(tir\)\?”和'[0-9]\{3\}',而同樣,如果想搜尋的符号中有* ?之内的正則表達符号,也要加轉義字元才能代表原本的符号含義.
3.[]的注意事項
[a-zA-Z]代表包含大小寫的所有單個字母,不能寫成[a-Z];
[a-z_-]代表比對字母或下劃線或橫杠,不能寫成[a-z-_]
4.寫正則時需要不斷試錯
即便寫出了比對的正規表達式,用定界符進行精準比對後,正則中仍然會出現結果不符合要求的情況,需要對表達式不斷修改,不斷試錯,才能得到想要的結果
二、grep 指令
所有參數:
常見用法:
1. -b -o 統計字元串的偏移量(即一行中相對行首的位置差)
echo gun is not unix | grep -b -o "not"
7:not
#一行中字元串的字元偏移是從該行的第一個字元開始計算,起始值為0。選項 -b -o 一般總是配合使用。
2.-l和-L 在多檔案查找時,僅輸出符合條件/不符合條件的檔案的檔案名,不輸出内容
3.-f 和字元串比對,正則式比對不同,将單獨的檔案作為比對樣式,每一個比對的樣式為一行
#在樣式檔案中逐行寫出需要比對的字元。
cat patfile
aaa
bbb
echo aaa bbb ccc ddd eee | grep -f patfile -o
4.-A -B -C 除了輸出比對内容外,還輸出比對内容上/下/上下行的内容,可以指定幾行
#如果比對結果有多個,會用“--”作為各比對結果之間的分隔符:
echo -e "a\nb\nc\na\nd\nc" | grep a -A 1
a
b
--
a
d
5. -q 靜默輸出,不會輸出任何資訊,如果指令運作成功傳回0,失敗則傳回非0值。一般用于條件測試。
6.--include 排除目标檔案
1)--include *{.c,.cpp} 僅僅在檔案夾中搜尋.c和.cpp檔案;
2)--exclude "README" 排除全部README檔案
3) --include-dir 僅在某些檔案夾中搜尋
4) --exclude-dir 排除某些檔案夾
5) --exclude-from FILE 從檔案FILE中讀取須要排除的檔案清單
#隻在目錄中所有的.php和.html檔案中遞歸搜尋字元"main()"
grep "main()" . -r --include *.{php,html}
#在搜尋結果中排除所有README檔案
grep "main()" . -r --exclude "README"
#在搜尋結果中排除filelist檔案清單裡的檔案
grep "main()" . -r --exclude-from filelist
三、cut:字段簡單剪切指令
該指令有兩項功能,其一是用來顯示檔案的内容,它依次讀取由參數file所指明的檔案,将它們的内容輸出到标準輸出上;其二是連接配接兩個或多個檔案,如cut fl f2 > f3将把檔案fl和幾的内容合并起來,然後通過輸出重定向符“>”的作用,将它們放入檔案f3中。
1.格式
cut(options)(參數)
2.全部參數
3.常見用法
#學生報表資訊,包含No、Name、Mark、Percent:
[[email protected] text]# cat test.txt
No Name Mark Percent
01 tom 69 91
02 jack 71 87
03 alex 68 98
#使用 -f 選項提取指定字段:
[[email protected] text]# cut -f 1 test.txt
No
01
02
03
[[email protected] text]# cut -f2,3 test.txt
Name Mark
tom 69
jack 71
alex 68
#--complement 選項提取指定字段之外的列(列印除了第二列之外的列):
[[email protected] text]# cut -f2 --complement test.txt
No Mark Percent
01 69 91
02 71 87
03 68 98
#使用 -d 選項指定字段分隔符:
[[email protected] text]# cat test2.txt
No;Name;Mark;Percent
01;tom;69;91
02;jack;71;87
03;alex;68;98
[[email protected] text]# cut -f2 -d";" test2.txt
Name
tom
jack
alex
注意:cut的分隔符,預設為制表符,可以-d指定其他分隔符,但是不能指定空格(-d " ")!,即如果文本内容以空格分隔,cut會認為文本隻有一列
四、sed:功能強大的流式文本編輯器
格式:
sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
重要參數:
-n :即--slient和 -quiet 靜默輸出 隻列印腳本或command處理過行
-e :直接在指令行模式上進行sed動作編輯,此為預設選項
-f :将sed的動作寫在一個檔案内,用–f filename 執行filename内的sed動作
-r :支援擴充正規表達式
-i :直接修改檔案内容,不輸出到螢幕
sed command:
注意:
- sed指令中,字元串或正則的兩邊需要加上雙斜杠// 如添加動作:‘/正則式/i’
- sed '2,4d' 将2-4行内容删除,而不是删除第2行和第4行
- sed 's/book/BOOKS/g' file g是全局參數,不加隻替換第一個
- &的用法 已比對字元串标記
echo this is a test line | sed 's/\w\+/[&]/g' [this] [is] [a] [test] [line]
- \1的用法,子串比對标記
echo this is digit 7 in a number | sed 's/digit \([0-9]\)/\1/' this is 7 in a number
- r/w 從檔案讀入,或寫入到檔案(前者不改變檔案内容,後者改變)
#将比對内容顯示在比對行下 sed '/test/r file' filename #在example中所有包含test的行都被寫入file裡: sed -n '/test/w file' example
- q 中途退出指令
#列印完第10行後,退出sed sed '10q' file
五、awk:文本和資料進行處理的程式設計語言
(awk指令比較複雜,涉及到程式設計思想和邏輯判斷,僅總結目前知識水準範圍内的内容)
1.awk的模式(patten)和操作(command)
模式可以是以下任意一個:
- /正規表達式/:使用通配符的擴充集。
- 關系表達式:使用運算符進行操作,可以是字元串或數字的比較測試。
- 模式比對表達式:用運算符
(比對)和~
(不比對)。~!
- BEGIN語句塊、pattern語句塊、END語句塊(即拓展commend,一般在BEGIN中指派,申明等,END中進行操作,運算等,BEGIN和END不參與邏輯循環)
操作由一個或多個指令、函數、表達式組成,之間由換行符或分号隔開,并位于大括号内,主要部分是:
- 變量或數組指派
- 輸出
- 内置函數
- 控制流語句
2. 内置參數(變量)
-
$0,$1,$2 列數,從0開始(預設空格和制表符為分隔符,-F或fs==指定分隔符)
awk '{printf $1}' //列印第一個字母
- NR,NF 行号和字段數
- FILENAME 檔案名
- 完整的内置參數如下:
3.邏輯處理
作為一種程式設計語言所應具有的特點之一,awk支援多種運算,這些運算與C語言提供的基本相同。awk還提供了一系列内置的運算函數(如log、sqr、cos、sin等)和一些用于對字元串進行操作(運算)的函數(如length、substr等等)。
運算符 | 描述 | 舉例 |
+ - | 加,減 | awk 'BEGIN{a="b";print a++,++a;}' 輸出:0 2 (注意:所有用作算術運算符進行操作,操作數自動轉為數值,所有非數值都變為0) |
* / & | 乘 除 求餘 | |
++ -- | 增加和減少(作為字首和字尾) | |
> >= != == | 關系運算符 (注意:> < 可以作為字元串比較,也可以用作數值比較,關鍵看操作數如果是字元串就會轉換為字元串比較。兩個都為數字才轉為數值比較。字元串比較:按照ASCII碼順序比較。) | awk 'BEGIN{a=11;if(a >= 9){print "ok";}}' 輸出:ok |
= += -= *= ... | 指派語句 | a+=5; 等價于:a=a+5; 其它同類 |
|| && | 邏輯或,邏輯與 | awk 'BEGIN{a=1;b=2;print (a>5 && b<=2),(a>5 || b<=2);}' 輸出:0 1 |
~ ~! | 正規表達式的比對和不比對 | awk 'BEGIN{a="100testa";if(a ~ /^100*/){print "ok";}}' 輸出:ok |
?: | C條件表達式 | awk 'BEGIN{a="b";print a=="b"?"ok":"err";}' 輸出:ok |
in | 數組中是否存在鍵值 | awk 'BEGIN{a="b";arr[0]="b";arr["b"]="c";print (a in arr);}' 輸出:1 |
4.拓展格式
拓展格式如下:
awk [options]'BEGIN{print"START"}pattern{commands}END{print "END"}'
一般在BEGIN中指派,申明等,END中進行操作,運算等,BEGIN和END不參與邏輯循環
awk -F ':' 'BEGIN{print "Line Col User"}{print NR" ",NF" ",$1}END{print"--------"FILENAME"------------"}' /etc/passwd |more
#顯示每行的行号,列數(用:作為分隔符)并在表頭和結束列印相關内容
5.與sed的比較
awk和sed都是流式文本資料處理指令,都支援管道操作,一般什麼情況選擇sed,什麼情況選擇awk呢?
1.兩個指令都是行處理指令,具體的邏輯是一次讀入一行内容,然後處理一行内容,處理完成後又處理下一行内容
2.和sed相比,同樣是對一行的内容進行操作,awk可以進行切片處理,分‘列’進行處理(根據分隔符将一行拆分成多列,如使用内置參數$1 ,$2可對第2列和第3列進行提取操作)
3.sed指令對複雜正則的比對度較高,在處理正則的複雜比對和精确比對時,建議優先考慮使用sed指令
4.awk指令由于可以進行邏輯處理和流程控制,在對文本的操作邏輯性較強時,推薦優先考慮awk指令
參考内容:
https://www.cnblogs.com/tlnshuju/p/7106790.html grep指令最經常使用的功能總結
http://man.linuxde.net/sed sed指令_Linux sed 指令用法詳解:功能強大的流式文本編輯器
http://man.linuxde.net/awk awk指令_Linux awk 指令用法詳解:文本和資料進行處理的程式設計語言
https://www.imooc.com/learn/819 執行個體妙解Sed和Awk的秘密