Linux三劍客:文字處理的強大工具,讓資料處理效率提升10倍

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' passwdp:顯示模式空間中的內容, 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' passwdc:替換匹配行為指定的文字。舉例: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}' FILEawk按照行來讀取文件,根據輸入分隔符切分成小部分(用內建變數來表示$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. 1. /指定內容/這種方式可以匹配到含有“指定內容”的行,在條件中不新增$#所帶的項,建議不使用正則,有異常情況。
awk -F: '/nologin/{print $0}' /etc/passwd #匹配到含有nologin關鍵字的行seq 100 | awk '/1/{print $1}'
  1. 2. $#=/指定內容/這種方式指定第#列匹配指定內容
awk -F: '$1=/bin/{print $0}' /etc/passwd
  1. 3. $#~/指定內容/這種方式用於指定列模糊匹配(正則匹配)指定內容,並獲取該行。
awk -F: '$1~/dae/{print $1}' /etc/passwd  #正向選擇awk -F: '$1!~/dae/{print $1}' /etc/passwd #反向選擇
  1. 4. 值判斷使用>,<,>=,<=,==,!=來判斷指定列的值。
awk -F: '$3>=10{print $1}' /etc/passwd
  1. 5. 邏輯判斷使用&&,||來進行邏輯判斷。
awk -F: '$3>=5 && $3<=10{print $1}' /etc/passwd
  1. 6. if條件判斷
awk -F: '{if ($NF~/nologin$/){i++}else{j++}}; END{print i, j}' /etc/passwd#注意if-else條件判斷是放在{}中的
  1. 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 個模組
1.38張最全工程師技能圖譜
2.面試大禮包
3.Linux書籍
4.go書籍
······
6.自動化運維工具
18.訊息佇列合集
 以上所有資料獲取請掃碼
備註:最新運維資料
100%免費領取
(後臺不再回復,掃碼一鍵領取


相關文章