Linux三劍客及使用介紹

来源:https://www.cnblogs.com/zimskyzeng/archive/2019/10/07/11630071.html
-Advertisement-
Play Games

Linux 三劍客是(grep,sed,awk)三者的簡稱,熟練使用這三個工具可以提升運維效率。Linux 三劍客以正則表達式作為基礎,而在Linux系統中,支持兩種正則表達式,分別為“標準正則表達式”和“擴展正則表達式”。在掌握好正則表達式後,將具體講解三劍客的用法。 一、正則表達式 可以看到標準 ...


Linux 三劍客是(grep,sed,awk)三者的簡稱,熟練使用這三個工具可以提升運維效率。Linux 三劍客以正則表達式作為基礎,而在Linux系統中,支持兩種正則表達式,分別為“標準正則表達式”和“擴展正則表達式”。在掌握好正則表達式後,將具體講解三劍客的用法。

一、正則表達式

正則表達式:REGular EXPression, REGEXP
元字元:
.: 匹配任意單個字元
[]: 匹配指定範圍內的任意單個字元
[^]:匹配指定範圍外的任意單個字元
 字元集合:[:digit:], [:lower:], [:upper:], [:punct:], [:space:], [:alpha:], [:alnum:]
    註意:字元集合要用[ ]包含

匹配次數(貪婪模式):
*: 匹配其前面的字元任意次 
 a, b, ab, aab, acb, adb, amnb
 a*b, a?b
 a.*b

 .*: 任意長度的任意字元
\?: 匹配其前面的字元1次或0次
\+:匹配至少一次
\{m,n\}:匹配其前面的字元至少m次,至多n次
 \{1,\}
 \{0,3\}
    備註:至少0次,必須要顯示的寫出來。

位置錨定:
^: 錨定行首,此字元後面的任意內容必須出現在行首
$: 錨定行尾,此字元前面的任意內容必須出現在行尾
^$: 空白行

\<或\b: 錨定詞首,其後面的任意字元必須作為單詞首部出現
\>或\b: 錨定詞尾,其前面的任意字元必須作為單詞的尾部出現

分組:
\(\)
 \(ab\)*
 後向引用
 \1: 引用第一個左括弧以及與之對應的右括弧所包括的所有內容
 \2:
 \3:

可以看到標準正則表達的使用過程中,許多符號都需要轉義,這在工作中帶來了一定的不便,因此擴展的正則表達式便出現了。

二、拓展正則表達式

1. 字元匹配:
.
[abc]:包含abc任意一個字元
[^abc]:不包含abc任意一個字元

2. 次數匹配(不用再轉義):
*: 
?:
+: 匹配其前面的字元至少1次
{m,n}

3. 位置錨定:
^
$
\<
\>

4. 分組(不用再轉義):
():分組
\1, \2, \3, ...

5. 或者
|: or
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:使用擴展的正則表達式
PATTERN部分
以字元串的方式給定匹配模板,可以使用普通字元串以及正則表達式(標準&擴展)。
FILE部分
需要查找內容的文件。

四、sed命令

4.1. 概述

sed全稱是Stream EDitor
sed是一個流編輯器、行編輯器

4.2 基本語法

sed [option] 'script' [input file]...
option部分
-n:不輸出模式空間中的內容到stdout
-e:可以在sed命令中指定多個script腳本,多點編輯功能
-f:輸入sed腳本,腳本中寫著編輯命令
-r:支持使用擴展的正則
-i:直接編輯源文件

script部分
地址定界編輯命令(和vim命令相似)
1)空地址:全文編輯
2)單地址:
  #:指定某一行,對特定行進行編輯
  /pattern/:指定模式匹配到的那一行
3)地址範圍:
  #,#
  #,+#
  #,/pattern/
  /pattern1/,/pattern2/
4)步進地址:
  1~2:以1為起始行,然後遞進2行向下匹配
  2~2:所有偶數行
5)編輯命令:
  d:刪除整行,d放在最後
  p:顯示模式空間中的內容, 放在最後
  a:在匹配的行後面增加文本,使用\n支持多行追加。a放在定界後面
  i:在前面加文本。舉例:sed '3i hello' xxx
  c:替換行為指定的文本。舉例:sed '3c text' xxx 把第三行替換成text。sed -i '/xyz/c helloworld' num.txt
  w:保存模式空間中匹配的內容到指定位置。舉例:sed -n '/^[^#]/w /tmp/demo' /etc/fstab 將/etc/fstab中非#開頭的行保存到/tmp/demo中。
  r:讀取指定文件的內容添加到當前文件匹配到的行後面,進行文件合併。
  !:條件取反。用法:地址定界!編輯命令。
  s///:條件替換。
替換標記備註:g(全局替換),p(顯示替換成功的行)

替換舉例:根據輸入查找目錄
echo "/var/log/messages" | sed 's@[^/]+$/?@@'

4.3.sed高級用法

  1. 模式空間與保持空間

在模式空間中,完成匹配的操作。當沒有匹配上的時候,文本行內容會預設輸出stdout;當匹配上文本行的時候,會執行編輯命令,執行結果輸出到stdout中。
保持空間可以理解為一個暫存區,只是用於完成額外的動作。

  1. 參數
    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:在原有的每行後方添加一個空白行;
  • 舉例:提取字元串
/bin/bash
info="hellozimskyshenzhen"
echo $info | sed 's/hello\(\w\+\)shenzhen/\1/g'

備註:

  • sed中不支持\d,如果要用數字用[0-9],但是支持\w。
  • sed中的()要轉義,+要轉義,<>大於小於號要轉義。
  • 舉例:判斷是否存在指定格式的字元串
#!/bin/bash
# 判斷輸入是否為整數
if [ -n "$(echo $1 | sed -n '/^[0-9]\+$/p')" ] ; then
  echo 'yes'
else
  echo 'no'
fi

五、awk命令

5.1. awk概述

awk是發明該工具三個作者姓名的首字母簡稱,awk是一個報表生成器,主要用於格式化輸出。格式化文本輸出器。

5.2. 基本用法

1. 語法
gawk [option] 'program' FILE
其中program: PATTERN{ACTION STATEMENTS}
{動作指令}可以理解成為命令,最常用的是print、printf

2. awk讀取文檔過程
按照行來讀取文檔,根據輸入分隔符切分成小部分(用內建變數來表示$0$1$2...),用ACTION STATEMENTS來處理。$0表示顯示整行。

3. 選項option
-F:指名輸入欄位的分隔符;
-v:用來實現自定義變數var=value;

4. PATTERN(用於定界)
 空:表示處理文件的每一行
 /pattern/:使用正則匹配需要處理的行
 !/pattern/:上面取反
 關係表達式:結果為真假,結果為真的處理,假的不處理。非0非空字元串為真,其餘為假。
 行定界:不支持直接給出數字的格式(1,2{...})。見舉例。
 BEGIN/END模式:BEGIN{}表示僅在開始處理文件中的文本之前執行一次的程式,例如列印表頭。END{}表示文本處理完成之後執行一次,例如彙總數據。

舉例:
awk -F: '$NF=="/bin/bash" {print $1, $NF}' /etc/passwd
awk -F: '$NF!"/bash/$"{print $1,$NF}' passwd
awk -F: '$3<1000 {print $1, $3}' /etc/passwd
awk -F; '(NR>=2&&NR<=10){print $1}' /etc/passwd 行定界
awk -F: '{printf "%-15s %10s\n", $1, $2}' /etc/passwd

5. 變數

  • 內建變數(在引用變數時不用加$)
    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: ...

  • 自定義變數
    方法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,while
    if(condition){statement}
    if(condition){statement} else {statements}
    while(condition) {statements}
    do {statements} while(condition)
    for(expr1;expr2;expr3) {statements}
    break
    continue
    delete 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 679

cat data | awk '$2>=30&&$2<=90{dic[$1]+=$3}; END{for (i in dic) {print i, dic[i]}}'

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 通過 NFS 網路文件系統,可以通過網路共用目錄,讓網路上的其他主機可以通過掛載訪問共用目錄的數據。 ...
  • 在 Linux 中,許多網路服務針對客戶機提供訪問控制機制,而 TCP Wrappers 是應用服務與網路之間的一道特殊的防線,提供額外的安全保障。 ...
  • 本篇寫一些關於 Linux 網路中 SSH 服務的相關知識。 ...
  • 設置 DNS 分離解析可以對不同的客戶端提供不同的功能變數名稱解析記錄。來自不同地址的客戶機請求同一功能變數名稱時,為其提供不同的解析結果。 ...
  • 設置主從 DNS 的主要是為了冗餘,分擔壓力,防止伺服器宕機後, DNS 無法正常解析。 ...
  • 具體到一個公司的網路環境中,不可能只有一個 VLAN,更不可能對每個 VLAN 都架設一個 DHCP 伺服器,這時就要做一個 DHCP 的中繼,使得 DHCP 的廣播可以通過 VLAN 。 ...
  • 想使用 mongodb 官網提供的YUM安裝方法快速安裝,但官方暫時未提供centos8的安裝包,只需稍作修改則能順利安裝! ...
  • 原理:兩台web伺服器,通過心跳線進行通信,當主節點出現服務異常,備用節點通過探測判斷主節點是否存活,若是不存活,就把服務接管過來。 Web1和Web2中間有一根心跳線,檢查對方的存活狀態。流動IP:也叫vip是對外提供服務的ip,正常情況下是配置在Web1上的,當Web1宕機後,Web2會自動配置 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...