Linux三劍客及使用介紹
前言
Linux 三劍客是(grep,sed,awk)三者的簡稱,熟練使用這三個工具可以提升運維效率。Linux 三劍客以正則表示式作為基礎,而在Linux系統中,支援兩種正則表示式,分別為“標準正則表示式”和“擴充套件正則表示式”。在掌握好正則表示式後,將具體講解三劍客的用法。
一、正則表示式
正則表示式:REGular EXPression, REGEXP。我們透過特定的字串匹配模板,來獲取到所需的內容。熟練掌握好正則表示式是使用
Linux三劍客
的前提啊。元字元
.
: 匹配任意單個字元;[]
: 匹配指定範圍內的任意單個字元;[^]
:匹配指定範圍外的任意單個字元;字元集合
[[:digit:]]
:匹配單個數字;[[:lower:]]
:匹配單個小寫字母;[[:upper:]]
:匹配單個大寫字母;[[:punct:]]
:匹配單個標點字元;[[:space:]]
:匹配單個空白字元;[[:alpha:]]
:匹配單個字母;[[:alnum:]]
:匹配單個字母或數字;匹配次數(貪婪模式)
*
:匹配其前面的字元任意次?
:匹配其前面的字元0次或者1次+
:匹配其前面的字元至少1次.*
:任意長度的任意字元位置錨定
^
: 錨定行首,此字元後面的任意內容必須出現在行首$
: 錨定行尾,此字元前面的任意內容必須出現在行尾^$
: 空白行LInux實際使用
由於linux系統shell直譯器的特殊處理,某些元字元在linux下具有展開式等特殊含義,在實際的使用過程中我們需要新增
\
進行轉義。\?
:匹配其前面的字元1次或0次;\+
:匹配至少一次;\{m,n\}
:匹配其前面的字元至少m次,至多n次;\{1,\}
:匹配前面的字元至少1次;\{0,3\}
:匹配前面的字元0次至3次均可;備註:至少0次,必須要顯示的寫出來;
\<或\b
:錨定詞首,其後面的任意字元必須作為單詞首部出現\>或\b
:錨定詞尾,其前面的任意字元必須作為單詞的尾部出現分組與後向引用
\(\)
\(ab\)*
\1
:引用第1個左括號以及與之對應的括號所包括的所有內容;\2
:引用第2個左括號以及與之對應的括號所包括的所有內容,以此類推;二、拓展正則表示式
可以看到標準正則表達的使用過程中,許多符號都需要轉義,這在工作中帶來了一定的不便,因此擴充套件的正則表示式便出現了。
字元匹配:
.
:匹配單個字元;[abc]
:包含abc任意一個字元[^abc]
:不包含abc任意一個字元次數匹配(不用再轉義):
*
:匹配前一個字元任意次;?
:匹配其前面的字元1次或0次;+
:匹配其前面的字元至少1次;{m,n}
:匹配其前面的字元至少m次,至多n次;位置錨定:
對比使用方式:
^
和 $
這裡要注意的是對於詞首定位和詞尾定位,分別是\<
和 \>
,依然需要加上反斜槓;分組(不用再轉義):
()
:分組\1
, \2
, \3
:分別對應第n個括號所匹配的內容;或運算
|
: 可以同時取並集;注意:C|cat表示的是C或cat(表示的是整個部分)
可以看到,使用擴充套件的正則表示式可以省略很多的轉義符號,這尤其在寫sed語句時極大的提高了程式碼的可讀性。建議優先使用擴充套件的正則表示式。
三、grep命令家族
3.1. grep相關命令
grep命令家族由grep, egrep, fgrep 三個子命令組成,適用於不同的場景。具體如下:
命令描述
grep 原生的grep命令,使用“標準正則表示式”作為匹配標準。egrep 擴充套件的grep命令,相當於
$(grep -E)
,使用“擴充套件正則表示式”作為匹配標準。fgrep 簡化版的grep命令,不支援正則表示式,但搜尋速度快,系統資源使用率低。3.2. 使用方法
語法
grep [options] PATTERN [FILE...]
options部分
-i
:忽略大小寫--color
:高亮匹配上的字串-v
: 顯示沒有被模式匹配到的行-o
:只顯示被模式匹配到的字串-E
:使用擴充套件的正則表示式,egrep=grep -E
PATTERN部分以字串的方式給定匹配模板,可以使用普通字串以及正則表示式(標準&擴充套件)。
FILE部分需要查詢內容的檔案。
四、sed命令
4.1. 概述
sed全稱為Stream EDitor,sed是一個流編輯器,在處理行內容時功能十分強大。
4.2 基本語法
sed [option] 'script' [input file]...
1.option部分
-n
:不輸出模式空間中未匹配上的內容stdout,詳情可以看4.3高階用法;-e
:可以在sed命令中指定多個script指令碼,多點編輯功能;-f
:輸入sed指令碼,指令碼中寫著編輯命令;-r
:支援使用擴充套件的正則;-i
:直接編輯原始檔;2.script部分
script部分包含兩個內容,其一是定界,即確定我們要操作的範圍。另一個內容是操作,比如替換、插入當前行或在後面插入等操作。
a)定界-空地址
即全文編輯;
b)定界-單地址:
n
:指定第n行,對特定行進行編輯;舉例:sed -n '1p' passwd
僅輸出第一行;/pattern/
:指定模式匹配到的那一行,注意這裡的pattern
不是擴充套件正則表示式,如果要用擴充套件的正則表示式,需要在option需要使用-r
;舉例:sed -n '/sbin/p' passwd
輸出能夠匹配上sbin的內容行;c)定界-範圍:
n,m
:定位從第n行開始至第m行(都是閉區間);n,+k
:定位從第n行開始,包括往後的k行;n,/pattern/
:定位從第n行開始,至指定模式匹配到的那一行;/pattern1/,/pattern2/
:定位從pattern1
模式匹配開始,直到pattern2
模式匹配之間的範圍;d)定界-步進方式:
1~2
:以1為起始行,然後步進2行向下匹配,即所有的奇數行;2~2
:以2為起始行,然後步進2行向下匹配,即所有的偶數行;e)編輯操作:
d
:刪除整行,d
放在定界後面。舉例:sed '/sbin/d' passwd
;p
:顯示模式空間中的內容, p
放在定界後面。一般來說,p
操作和-n
選項配合使用,篩選出我們匹配的行。若不加-n
的話,由於模式空間中未匹配上的行也會輸出,我們會發現所有內容都輸出並且匹配行會輸出2次;a
:在匹配的行後面增加文字,使用\n
支援多行追加,a
放在定界後面。舉例:sed '1a first_line\nsecond_line' passwd
在第1行後面插入兩行內容(first_line 和 second_line);i
:在匹配的行前面增加文字,i
放在定界後面。舉例:sed '3i hello' passwd
;c
:替換匹配行為指定的文字。舉例:sed '/root/c text' passwd
把匹配到的行替換成text;w
:儲存模式空間中匹配的內容到指定位置。舉例:sed -n '/^[^#]/w /tmp/demo' /etc/fstab
即將/etc/fstab中非#開頭的行輸出儲存到/tmp/demo中。r
:讀取指定檔案的內容新增到當前檔案匹配到的行後面,進行檔案合併。舉例:sed '2r /etc/passwd' 1.txt
即將/etc/passwd檔案的內容讀取,並插入到1.txt檔案的第二行處。!
:條件取反。用法:地址定界!編輯命令。s///
:條件替換,這裡的/
可以用其他特殊符號,其替換分隔符的判定標準是s字元後的第一個特殊符號。這在替換文字中涉及特殊符號時特別好使,我們避開需要替換的特殊符號即可。即sed 's@root@me@g' /etc/passwd
等同於 sed 's/root/me/g' /etc/passwd
。替換標記備註:g(全域性替換),p(顯示替換成功的行)替換舉例:根據輸入查詢目錄,下面輸出的是/var/log/
echo "/var/log/messages" | sed 's@[^/]\+$/\?@@'
4.3.sed高階用法
1.模式空間與保持空間

在模式空間中,完成匹配的操作。當沒有匹配上的時候,文字行內容會預設輸出stdout;當匹配上文字行的時候,會執行編輯命令,執行結果輸出到stdout中。保持空間可以理解為一個暫存區,只是用於完成額外的動作。
2.相關引數
h
:把模式空間中的內容覆蓋至保持空間中;H
:把模式空間中的內容追加至保持空間中;g
:把保持空間中的內容覆蓋至模式空間中;G
:把保持空間中的內容追加至模式空間中;x
:把模式空間中的內容與保持空間中的內容互換;n
:覆蓋讀取匹配到的行的下一行(改變指向)至模式空間中;N
:追加讀取匹配到的行的下一行(改變指向)至模式空間中;d
:刪除模式空間中的行;D
:刪除多行模式空間中的所有行;3.舉例
sed -n 'n;p' FILE
:顯示偶數行;sed '1!G;h;$!d' FILE
:逆序顯示檔案的內容;sed '$!d' FILE
:取出最後一行;sed '\$!N;$!D' FILE
:取出檔案後兩行;sed '/^$/d;G' FILE
:刪除原有的所有空白行,而後為所有的非空白行後新增一個空白行;sed 'n;d' FILE
:顯示奇數行;sed 'G' FILE
:在原有的每行後方新增一個空白行;4.基礎面試題舉例
面試題1:提取字串中的指定字串
/bin/bashinfo="hellozimskyshenzhen"echo$info | sed 's/hello\(\w\+\)shenzhen/\1/g'
注意事項:sed中不支援\d,如果要用數字用[0-9],但是支援\w。在一般正則表示式中,sed中的()
要轉義,+
要轉義,<>
要使用\
轉義。如果不想這麼麻煩,那就加上-r
選項使用擴充套件正則表示式吧!
面試題2:判斷輸入是否為整數
#!/bin/bashif [ -n "$(echo $1 | sed -n '/^[0-9]\+$/p')" ] ; thenecho'yes'elseecho'no'fi
五、awk命令
5.1. awk概述
awk是發明該工具三個作者姓名的首字母簡稱,awk是一個報表生成器,主要用於格式化輸出。格式化文字輸出器。
5.2. 基本用法
1.語法
awk [option] 'PATTERN{ACTION STATEMENTS}' FILE
awk按照行來讀取文件,根據輸入分隔符切分成小部分(用內建變數來表示$0
,$1
,$2
等),用ACTION STATEMENTS
來處理該行文字。$0表示顯示整行。2.常用選項option
-F:指名輸入欄位的分隔符;-v:用來實現自定義變數var=value;
3.PATTERN(用於定界)
“:表示處理檔案的所有行;
/pattern/
:表示處理正則匹配對應的行;!/pattern/
:表示處理正則不匹配的行;關係表示式
:比如NR>2
等返回布林型別的表示式。若結果為真則處理,假則不處理。對於非0非空字串為真,其餘為假。n
:表示處理第n行的文字,注意這裡不支援直接給出數字的格式,例如1,2{...}
。詳情請見舉例。BEGIN/END模式
:BEGIN{}表示僅在開始處理檔案中的文字之前執行一次的程式,例如打印表頭。END{}表示文字處理完成之後執行一次,例如彙總資料。舉例:# 在/etc/passwd檔案中,以:為分隔符,篩選出最後一列為/bin/bash的行,並列印第一列和最後一列awk -F: '$NF=="/bin/bash" {print $1, $NF}' /etc/passwdawk -F: '$NF!="/bin/bash"{print $1,$NF}' passwdawk -F: '$3<1000 {print $1, $3}' /etc/passwdawk -F; '(NR>=2&&NR<=10){print $1}' /etc/passwd 行定界awk -F: '{printf "%-15s %10s\n", $1, $2}' /etc/passwd
4.內建變數(在引用變數時不用加$
)
FS:input field seperator:輸入欄位分隔符,預設空白字元。也可使用-v指定。OFS:輸出欄位分隔符。使用-v指定。RS:輸入時的換行符ORS:輸出時的換行符NF:number of field 每一行的欄位數量。加上$NF表示最後一列。NR:number of record 檔案的行數,打印出來是列印行號FNR:多個檔案中的行數分別計數FILENAME:當前檔案的檔名ARGC:引數命令列中引數的個數ARGV:返回陣列,命令列中的每個引數舉例:awk 'BEGIN {print ARGV[0]}' /etc/fstab /etc/issue在這裡ARGV[0]是awk,固定為第0個引數。ARGV[1]是/etc/fstab,ARGV[2]是/etc/issue舉例:awk -v FS=':' '{print $1}' -v OFS=':' /etc/passwd 指名冒號作為輸入的分隔符。同awk -F: …
5.自定義變數
方法1:-v var=value (區分字元的大小寫)方法2:在program中定義
舉例:awk -v test='hello' 'BEGIN {print test}'awk 'BEGIN {test='hello' print test}'
6.常用的ACTION命令
-
• print輸出格式:print item1,item2 …備註:使用逗號作為分隔符;輸出item可以是字串、內建變數、awk表示式;若省略item,則顯示$0整行; -
• printf格式化輸出:printf FORMAT, item1, item2…按位放在format中。注意事項:format必須要給出;如需換行,必須要顯示寫出;format中需要為後面每個item指定格式符; -
• Expressions -
• Control statements:控制語句if,whileif(condition){statement}if(condition){statement} else {statements}while(condition) {statements}do {statements} while(condition)for(expr1;expr2;expr3) {statements}breakcontinuedelete array[index]delete array刪除整個陣列exit 退出語句 -
• Compound statements:組合語句 -
• Input statements:輸入語句 -
• Output statements:輸出語句格式符:%c:顯示字元的ASCII值%d:顯示十進位制整數%e:科學計數法數值顯示%f:顯示為浮點數%g:以科學計數法顯示浮點數%s:顯示字串%u:顯示無符號整數%%:顯示%自身修飾符: #[.#]
:第一個數字用於控制顯示字元的寬度,第二個數字表示小數的精度(對於浮點數而言);輸出預設右對齊%15s,左對齊:%-15s;+:表示帶正負符號;運算子: 算數運算子:+-/* ; +x把字串轉換成數值;-x改成負數; 字串運算子:字串連線(沒有運算子) 複製運算子:=,+=,-=,/=,++,– 比較運算子:>,<,<=,!=,==模式匹配符::左側的字串是否被模式匹配 !:左側的字串是否不能被模式匹配邏輯運算子: &&:與 ||:或 !:非函式呼叫: function_name(arg1, arg2, …)條件表示式: selector?true_exp:false_exp 和三目運算子一樣 -
• 操作例子
# 一般來說, 列印無狀態內容放在BEGIN和END塊中awk -v begin="hello" -v end="ok" -F: 'BEGIN{print begin}; {print $1, $NF}; END{print end}' /etc/passwd
5.3. awk高階用法及舉例
awk常用內建變數
$1:表示第一列$NF:表示最後一列$NR:表示行號
常用條件表示
-
1. /指定內容/這種方式可以匹配到含有“指定內容”的行,在條件中不新增$#所帶的項,建議不使用正則,有異常情況。
awk -F: '/nologin/{print $0}' /etc/passwd #匹配到含有nologin關鍵字的行seq 100 | awk '/1/{print $1}'
-
2. $#=/指定內容/這種方式指定第#列匹配指定內容
awk -F: '$1=/bin/{print $0}' /etc/passwd
-
3. $#~/指定內容/這種方式用於指定列模糊匹配(正則匹配)指定內容,並獲取該行。
awk -F: '$1~/dae/{print $1}' /etc/passwd #正向選擇awk -F: '$1!~/dae/{print $1}' /etc/passwd #反向選擇
-
4. 值判斷使用>,<,>=,<=,==,!=來判斷指定列的值。
awk -F: '$3>=10{print $1}' /etc/passwd
-
5. 邏輯判斷使用&&,||來進行邏輯判斷。
awk -F: '$3>=5 && $3<=10{print $1}' /etc/passwd
-
6. if條件判斷
awk -F: '{if ($NF~/nologin$/){i++}else{j++}}; END{print i, j}' /etc/passwd#注意if-else條件判斷是放在{}中的
-
7. 字典使用在awk中可以定義陣列型別,用於統計。
awk '{ip[$1]++}; END{for (i in ip) {print i, ip[i]}}' access.log#解析: 將第一列ip設定為字典的key,當出現一次相同的ip時自增1,用於統計所有的ip計數。#for迴圈中取到每個字典對應的key,再使用print塊打印出來。注意花括號的隔離。
#QQ號 等級 時長#統計等級(30<=x<=90),相同賬號的時長#1234 12 23#1234 10 122#1233 92 4212#1233 42 4252#1239 87 2313#1233 56 1121#1231 19 45#1235 45 679cat data | awk '$2>=30&&$2<=90{dic[$1]+=$3}; END{for (i in dic) {print i, dic[i]}}'
連結:https://www.cnblogs.com/hiyong/p/14238392.html
(版權歸原作者所有,侵刪)
文末福利
就目前來說,傳統運維衝擊年薪30W+的轉型方向就是SRE&DevOps崗位。
為了幫助大家早日擺脫繁瑣的基層運維工作,給大家整理了一套高階運維工程師必備技能資料包,內容有多詳實豐富看下圖!
共有 20 個模組





······



以上所有資料獲取請掃碼
備註:最新運維資料

100%免費領取
(後臺不再回復,掃碼一鍵領取)