Linux文字三劍客

misakivv發表於2024-05-08

目錄
  • 一、文字搜尋工具--grep
    • 1、簡介
    • 2、工作原理
    • 3、語法格式
    • 4、選項介紹
    • 5、例項測試
      • 5.1、-i選項
      • 5.2、-v選項
      • 5.3、-n選項
      • 5.4、-c選項
      • 5.5、-o選項
      • 5.6、-B選項
      • 5.7、-A選項
      • 5.8、-C選項
      • 5.9、-w選項
      • 5.10、-E選項
      • 5.11、-e選項
  • 二、流編輯器--sed
    • 1、簡介
    • 2、工作原理
    • 3、語法格式
    • 4、選項介紹
    • 5、動作介紹
    • 6、sed的增刪改查
      • 6.1、增
        • 6.1.1、在test01檔案的第一行後面追加3行數字
        • 6.1.2、在行首新增一行數字
      • 6.2、刪
        • 6.2.1、刪除第一行
        • 6.2.2、刪除2-10行
        • 6.2.3、刪除全文
        • 6.2.4、刪除匹配到/sbin/nologin的行
        • 6.2.5、刪除以bin開頭的行
        • 6.2.6、刪除第三行到末尾
        • 6.2.7、刪除第1-3行以外的行
        • 6.2.8、去除檔案中的空行和註釋行
      • 6.3、改
        • 6.3.1、將第一行替換為 hello sed
      • 6.4、文字替換
        • 6.4.1、將所有的nologin替換為login
        • 6.4.2、將所有的/sbin/nologin 替換為/bin/login
        • 6.4.3、匹配以mail開頭的行,將該行所有的mail替換為gmail
      • 6.5、查
        • 6.5.1、顯示第二行(包括模式空間檔案)
        • 6.5.2、只顯示第二行
  • 三、文字處理工具--awk
    • 1、簡介
    • 2、工作原理
    • 3、語法格式
    • 4、選項介紹
    • 5、awk運算子
      • 5.1、算數運算子
      • 5.2、關係運算子
      • 5.3、邏輯運算子
      • 5.4、賦值運算子
      • 5.5、特殊運算子
    • 6、awk常用的內建變數
    • 7、awk的正則
    • 8、BEGIN和END模組
      • 8.1、BEGIN模組
        • 8.1.1、輸出標題行Username shell,以及對應的使用者和shell型別
      • 8.2、END模組
        • 8.2.1、列印對應的使用者和shell型別,最後再列印end of file
    • 9、例項測試
      • 9.1、列印test01內容並附帶行號
      • 9.2、只列印第二行
      • 9.3、列印二到四行
      • 9.4、只列印第二行和第四行
      • 9.5、匹配以root開頭的行
      • 9.6、列印test01檔案中使用者和對應的shell型別
  • 四、綜合案例
    • 1、查詢使用者名稱為root的行,並列印其所有的欄位
    • 2、統計不同shell型別的使用者數量
    • 3、獲取系統的ip地址

一、文字搜尋工具--grep

1、簡介

grep(Global search REgular expression and Print out the line.)是一種強大的文字搜尋工具,它能使用特定模式匹配(包括正規表示式)搜尋文字,並預設輸出匹配行。Unix的grep家族包括grep、egrepfgrep。Windows系統下類似命令FINDSTR

grep的全稱中可以瞭解到,grep是一個可以利用""正規表示式"進行"全域性搜尋"的工具,grep會在文字檔案中按照指定的正則進行全域性搜尋,並將搜尋出的行列印出來。

2、工作原理

  • grep讀取輸入資料,這可以是來自一個或多個檔案的內容,也可以是管道(stdin)傳入的資料。
  • 它根據提供的模式(pattern),這個模式可以是簡單字串或複雜的正規表示式,逐行匹配文字。
  • 當一行文字與模式匹配時,該行會被輸出到標準輸出(stdout),預設情況下不改變原始檔案。
  • 如果沒有找到匹配項,grep可能不會輸出任何內容,具體行為取決於使用的選項。

3、語法格式

grep [選項] PATTERN [檔案列表]
  • grep:命令名稱,用於搜尋含有特定模式的檔案內容。
  • [選項]:可選引數,用來控制搜尋的方式、輸出格式等。常見的選項包括-i(忽略大小寫)、-v(反向匹配)、-n(顯示行號)、-r-R(遞迴搜尋)、-w(精確單詞匹配)等。
  • PATTERN:必填項,表示要搜尋的模式或正規表示式。這可以是一個簡單的文字字串或複雜的正規表示式,用於匹配檔案中的內容。
  • [檔案列表]:可選,指定要搜尋的一個或多個檔名。如果不提供檔名,grep預設從標準輸入(stdin)讀取資料,這意味著你可以透過管道(|)將其他命令的輸出傳遞給grep進行搜尋。

4、選項介紹

選項 描述
-i 忽略大小寫進行匹配。
-v 反轉匹配,輸出不匹配指定模式的行。
-n 在每行匹配之前顯示行號。
-c 計算匹配行的總數,而不是列印匹配行。
-o 只列印匹配的內容
-l 只列出包含匹配項的檔名,對於每個匹配的檔案只輸出一次。
-L 列出不包含匹配項的檔名。
-B 列印匹配的前幾行
-A 列印匹配的後幾行
-C 列印匹配的前後幾行
-w 匹配整個單詞,即模式必須與整個單詞相匹配,而不是單詞的一部分。
-r-R 遞迴搜尋指定目錄下的所有檔案。
-E 使用擴充套件正規表示式(ERE)。
-F 將模式作為固定字串對待,不解釋為正規表示式。
-q 靜默模式,不輸出任何內容到螢幕,僅返回退出狀態碼。常用於指令碼中判斷是否存在匹配。
-e 多點操作

5、例項測試

測試文件 test

#!/bin/bash

set -euo pipefail

NGINX_VERSION="1.18.0"
INSTALL_DIR="/apps/NGINX"

#echo "開始安裝 Nginx $NGINX_VERSION..."
#echo "1. 安裝依賴包..."
if yum list installed $PACKAGE_LIST &> /dev/null; then
    echo "依賴包已安裝。"
else
    echo "正在安裝依賴包:$PACKAGE_LIST"

    yum -y install $PACKAGE_LIST > /dev/null
    echo "依賴包安$裝完成。"
echo "2. 建立非登入使用者 NgInX..."
if id -u NgInX &> /dev/null; then
    echo "NgInX 原始碼下載完成。"
echo "5. 設定#目錄#許可權..."
chown -R nginx.NGINX "$INSTALL_DIR" > /dev/null
echo "6. 建立符號鏈#接..."
ln -s "$INSTALL_DIR/sbin/NgInX" /usr/bin/ > /dev/null
echo "符號鏈$接建立完成$。"
[Install]
[install]
sed -i '/^#pid.*$/a pid        /apps/nginx/run/nginx.pid;' /apps/NGINX/conf/NgInX.conf > /dev/null
echo "NgInX 安$裝完成。"

5.1、-i選項

列印出所有的nginx,無論大小寫

grep -i 'nginx' test

image-20240507114319716

5.2、-v選項

列印出所有不包含null的行

grep -v 'echo' test

image-20240507115029917

5.3、-n選項

列印所有不包含nginx大小寫,並且顯示所在行

grep -inv 'nginx' test

image-20240507115514967

5.4、-c選項

列印所有不包含echo大小寫,並且計算匹配的行的總數

grep -ivc 'echo' test

image-20240507151526012

5.5、-o選項

只列印匹配到的NgInX字串

grep -o 'NgInX' test

image-20240507151957888

5.6、-B選項

列印匹配開始安裝的前三行

grep -B3 '開始安裝' test

image-20240507152251624

5.7、-A選項

列印匹配開始安裝的後三行

grep -A3 '開始安裝' test

image-20240507152443758

5.8、-C選項

列印匹配開始安裝的前後兩行

grep -C2 '開始安裝' test

image-20240507152616566

5.9、-w選項

列印完全匹配NgInX字串的行

grep -w 'NgInX' test

5.10、-E選項

過濾test檔案中所有的空行、註釋#

egrep -v '^#|^$' test
grep -Ev '^#|^$' test

image-20240507193250707

5.11、-e選項

同時查詢包含"安裝"和"NgInX"的行

grep -e '安裝' -e 'NgInX' test

image-20240507195402507

二、流編輯器--sed

sed操作檔案前記得備份原始檔,或者先使用預設的-e引數操作

1、簡介

sed全稱為Stream EDitor,行編輯器,同時也是一種流編輯器。是一個強大的非互動式命令列工具,主要用於自動地對文字檔案或者輸入流進行基於模式的查詢、替換、刪除、插入等操作。

2、工作原理

  1. 讀取行sed逐行讀取輸入檔案(或從標準輸入接收到的資料)。每次讀取一行內容,不會一次性將整個檔案載入到記憶體中,這使得sed在處理大檔案時效率很高。
  2. 模式空間:讀取的每一行文字會被放置到一個稱為“模式空間”(pattern space)的緩衝區中。模式空間是sed進行文字處理的主要場所,所有的編輯命令都在這裡對文字行進行操作。
  3. 執行命令:根據提供的命令指令碼,sed會對模式空間中的文字行進行匹配、替換、刪除等操作。這些命令可以是簡單的正規表示式匹配,也可以是複雜的邏輯判斷和操作序列。
  4. 輸出處理結果:處理完一行後,sed會將模式空間中的內容輸出到螢幕(或重定向的輸出檔案),然後清空模式空間(除非使用特殊命令如HGND等操作了保留空間hold space),準備處理下一行。這個過程重複,直到所有行都被處理完畢。
  5. 保留空間:除了模式空間,sed還有一個稱為“保留空間”(hold space)的緩衝區,它可以用來臨時儲存資料,實現更復雜的文字處理邏輯,比如在多行間傳遞資料。
  6. 非破壞性處理:預設情況下,sed不對原檔案進行修改,而是將處理後的結果輸出到標準輸出。如果你想修改原檔案,可以使用-i選項進行就地編輯。
  7. 退出處理:當檔案的所有行都被成功處理並輸出後,sed完成其任務並退出。

3、語法格式

  • sed的命令格式:

    • sed [option] 'sed command' 輸入檔案
      
  • sed的指令碼格式

    • sed [option] ‐f 'sed script' 輸入檔案
      

4、選項介紹

選項 描述
-n 抑制自動列印模式空間的內容,僅列印透過命令顯式指定的內容。
-e 新增指令碼到執行的命令列表中,允許多個-e選項串聯多個指令碼。
-f 從指定的指令碼檔案中讀取命令並執行。
--follow-symlinks 處理檔案時跟隨符號連結。
-i 直接修改檔案內容。
-c 在使用-i模式時,使用複製而非重新命名來處理檔案。
-b 對於某些平臺,開啟檔案時使用二進位制模式,但實際上不起作用。
-l N l命令指定期望的行寬包裝長度。
--posix 禁用所有GNU擴充套件,使用POSIX相容模式。
-r 使用擴充套件正規表示式。
-s 將每個檔案視為獨立的,而非一個連續的長流。
-u 減少從輸入檔案載入的資料量,並更頻繁地重新整理輸出緩衝區,適合處理大檔案或需要即時輸出的情況。
-z 使用NUL字元而不是換行符作為行分隔符。
--help 顯示幫助資訊並退出。
--version 輸出版本資訊並退出。

5、動作介紹

動作 描述
= 列印當前處理的行號。
a \text 在當前行之後追加文字text,文字中的換行需用\轉義。
i \text 在當前行之前插入文字text,文字中的換行需用\轉義。
q [exit-code] 立即退出sed指令碼,可選指定退出程式碼。
Q [exit-code] GNU擴充套件,立即退出sed指令碼,不處理剩餘輸入,可選指定退出程式碼。
r filename 讀取檔案filename的內容並追加到模式空間處理後的輸出中。
R filename GNU擴充套件,讀取檔案filename的一行並追加到模式空間處理後的輸出中,每次呼叫讀取一行。
{ ... } 定義一個命令塊,其中可以包含多條sed命令。
b label 無條件跳轉到標籤label處,或如果沒有指定標籤,則跳到指令碼末尾。
c \text text替換當前模式空間中的行,文字中的換行需用\轉義。
d 刪除模式空間中的當前行,然後開始處理下一行。
D 如果模式空間中沒有換行符,就像執行了d命令;如果有換行符,刪除至第一個換行符前的內容並重新開始處理。
h H 複製模式空間內容到保持空間(h)或追加到保持空間(H)。
g G 用保持空間的內容替換模式空間內容(g)或追加保持空間內容到模式空間(G)。
l 以一種視覺上不易混淆的形式列出模式空間中的當前行。
l width GNU擴充套件,按指定寬度width折行顯示模式空間中的當前行。
n N 讀取下一行到模式空間(n)或追加下一行到模式空間而不啟動新迴圈(N)。
p 列印當前模式空間的內容。
P 列印模式空間中的內容直到第一個換行符。
s/regexp/replacement/ 替換與正規表示式regexp匹配的部分為replacement&在替換中表示匹配的文字,\1\9表示捕獲組。
t label 如果最近的替換成功,則跳轉到標籤label
T label GNU擴充套件,如果最近的替換未成功,則跳轉到標籤label
w filename 將模式空間的內容寫入檔案filename
W filename GNU擴充套件,將模式空間的第一行寫入檔案filename
x 交換模式空間與保持空間的內容。
y/source/dest/ 對模式空間中的字元進行轉換,將source中每個字元轉換為dest中對應位置的字元。

6、sed的增刪改查

以下所有的命令皆不使用-i選項修改僅供展示

測試文件:

[root@localhost ~]# cat /etc/passwd > test01
[root@localhost ~]# cat test01
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin

6.1、增

"a":apend,追加,追加文字到指定行後。

"i":insert,插入,插入文字到指定行前。

6.1.1、在test01檔案的第一行後面追加3行數字
  • sed '1a 111\n222\n333' test01
    
  • image-20240507211303076

6.1.2、在行首新增一行數字
  • sed '1i 111' test01
    
  • image-20240507211930773

6.2、刪

"d":delete,刪除文字

6.2.1、刪除第一行
  • nl test01 | sed '1d'
    
  • image-20240507223725343

6.2.2、刪除2-10行
  • nl test01 | sed '2,10d'
    
  • image-20240507223830239

6.2.3、刪除全文
  • sed 'd' test01
    
6.2.4、刪除匹配到/sbin/nologin的行
  • sed '/\/sbin\/nologin/d' test01
    
  • image-20240507220237519

6.2.5、刪除以bin開頭的行
  • sed '/^bin/d' test01
    
  • image-20240507221557353

6.2.6、刪除第三行到末尾
  • nl test01 | sed '3,$d'
    
  • image-20240507223926271

6.2.7、刪除第1-3行以外的行
  • nl test01 | sed '1,3!d'
    
  • image-20240507224022667

6.2.8、去除檔案中的空行和註釋行
  • sed -e '/^#/d' -e '/^$/d' test01
    

6.3、改

"c":change,替換

6.3.1、將第一行替換為 hello sed
  • sed '1c hello sed' test01
    
  • image-20240507223423544

6.4、文字替換

  • 選項:

    • "s": 這是sed中最常用的命令,代表替換(substitute)。當你希望在檔案中查詢並替換某些文字時,就會用到這個命令。例如,s/old/new/ 表示將每一行中首次出現的"old"字串替換為"new"。這裡的"old"是你要查詢的目標文字,而"new"是你希望替換成的新文字。
    • "g": 這是一個修飾符,用於指示sed進行全域性替換(global)。如果不加"g",sed只會在每行的第一個匹配處進行替換。加上"g"後,sed會在同一行內所有匹配到的目標內容都進行替換。所以,s/old/new/g 表示將每行中所有出現的"old"都替換為"new"。
  • 替換語法(-i選項慎用):

    • sed -i 's/目標內容/替換內容/g' file
      
    • #本質上與上面的命令差不多,更改分隔符為#可以避免轉義的複雜性,使命令更易讀
      sed -i '#/目標內容#替換內容/g' file
      
6.4.1、將所有的nologin替換為login
  • sed 's/nologin/login/g' test01
    
  • image-20240507225355325

6.4.2、將所有的/sbin/nologin 替換為/bin/login
  • sed '/\/sbin\/nologin/s#/sbin\/nologin#/bin/login#g' test01
    
  • image-20240507231422891

6.4.3、匹配以mail開頭的行,將該行所有的mail替換為gmail
  • sed '/^mail/{s#mail#gmail#g}' test01
    
  • image-20240507231749333

6.5、查

"p":print,列印,輸出指定內容

配合-n取消預設輸出

6.5.1、顯示第二行(包括模式空間檔案)
  • sed '2p' test01
    
  • image-20240507232214542

6.5.2、只顯示第二行
  • sed -n '2p' test01
    
  • image-20240507232311129

三、文字處理工具--awk

1、簡介

awk不僅僅是 linux系統中的一個命令,而且是一種程式語言,可以用來處理資料和生成報告(excel)。處理的資料可以是一個或多個檔案,可以是來自標準輸入,也可以透過管道獲取標準輸入,awk可以在命令列上直接編輯命令進行操作,也可以編寫成awk程式來進行更為複雜的運用。

2、工作原理

20170719154838100

  • 1、透過關鍵字 BEGIN 執行 BEGIN 塊的內容,即 BEGIN 後花括號 {} 的內容。
  • 2、完成 BEGIN 塊的執行,開始執行body塊。
  • 3、讀入有 \n 換行符分割的記錄。
  • 4、將記錄按指定的域分隔符劃分域,填充域,$0 則表示所有域(即一行內容),\(1** 表示第一個域,**\)n 表示第 n 個域。
  • 5、依次執行各 BODY 塊,pattern 部分匹配該行內容成功後,才會執行 awk-commands 的內容。
  • 6、迴圈讀取並執行各行直到檔案結束,完成body塊執行。
  • 7、開始 END 塊執行,END 塊可以輸出最終結果。

3、語法格式

  • awk指令是由模式,動作,或者模式和動作的組合組成。
  • 模式即pattern,可以類似理解成sed的模式匹配,可以由表示式組成,也可以是兩個正斜槓之間的正規表示式。比如NR==1,這就是模式,可以把他理解為一個條件。
  • 動作即action,是由在大括號裡面的一條或多條語句組成,語句之間使用分號隔開。
awk [options] 'pattern {action}' file

awk處理的內容可以來自標準輸入(<) ,一個或多個檔案或者管道

1639072-20190520142743645-776696011

Z

4、選項介紹

選項 描述
-b, --characters-as-bytes 將所有輸入資料視為單位元組字元,忽略多位元組字元處理的locale資訊。
-c, --traditional 執行於相容模式,gawk表現得與UNIX awk一致,不識別GNU特有的擴充套件。
-C, --copyright 輸出GNU版權資訊併成功退出。
-d[file], --dump-variables[=file] 輸出所有全域性變數的排序列表及其型別、最終值至指定檔案或預設的awkvars.out。
-e program-text, --source program-text 使用命令列提供的program-text作為AWK程式原始碼。
-E file, --exec file 類似於-f,但作為最後一個處理的選項,適合用於避免CGI應用中URL傳遞選項或原始碼。禁用命令列變數賦值。
-f program-file, --file program-file 從指定檔案讀取AWK程式原始碼而非命令列引數。可多次使用。
-F fs, --field-separator fs 使用fs作為輸入欄位分隔符。
-g, --gen-pot 掃描並解析AWK程式,生成包含所有可本地化字串的GNU .pot檔案。程式本身不執行。
-h, --help 輸出可用選項的簡短摘要後立即退出。
-L [value], --lint[=value] 提供關於可疑或非便攜構造的警告,可選fatal使警告成為錯誤,invalid僅報告實際無效項。
-n, --non-decimal-data 識別輸入資料中的八進位制和十六進位制值,需謹慎使用。
-N, --use-lc-numeric 強制gawk在解析輸入資料時使用locale的十進位制點字元。
-o output-file 指定輸出的檔名
-O, --optimize 啟用程式內部表示的最佳化,當前包括常量摺疊。
-p[prof_file], --profile[=prof_file] 將效能分析資料傳送到指定檔案,預設為awkprof.out。
-P, --posix 啟用相容模式,並施加額外限制以符合POSIX標準。
-r, --re-interval 允許在正規表示式匹配中使用區間表示式。
-R, --command file (Dgawk專用) 從檔案讀取儲存的偵錯程式命令。
-S, --sandbox 在沙盒模式下執行gawk,禁用系統呼叫、getline輸入重定向、print/printf輸出重定向等。
-t, --lint-old 提供關於不相容原始Unix awk結構的警告。
-V, --version 輸出gawk的版本資訊。
-- 標誌選項結束,允許後續引數以"-"開頭,符合POSIX約定。
-v var=val, --assign var=val 在程式執行前將變數var賦值為val

5、awk運算子

5.1、算數運算子

算術運算子 描述
+ 加法
- 減法
* 乘法
/ 除法
% 取模(求餘數)
+= 加等於
-= 減等於
*= 乘等於
/= 除等於
%= 取模等於
** 冪運算(乘方)

5.2、關係運算子

關係運算子 描述
== 等於
!= 不等於
< 小於
> 大於
<= 小於等於
>= 大於等於

5.3、邏輯運算子

邏輯運算子 描述
&& 邏輯與
|| 邏輯或
! 邏輯非

5.4、賦值運算子

賦值運算子 描述
= 簡單賦值
+= 加法賦值
-= 減法賦值
*= 乘法賦值
/= 除法賦值
%= 取模賦值
**= 冪賦值(乘方賦值)

5.5、特殊運算子

特殊運算子 描述
? : 條件運算子(三目運算子)
~ 匹配正規表示式(模式匹配)
!~ 不匹配正規表示式

6、awk常用的內建變數

內建變數 描述
$0 當前記錄
\\(1-\)n 當前記錄的第n個欄位
ARGC 命令列引數的數量,不包括awk命令本身
ARGV 包含命令列引數的陣列
FILENAME 當前輸入檔案的名稱
FNR 當前記錄號,在處理多個檔案時,對於每個檔案單獨計數
NR 總的輸入記錄號,從1開始,跨多個檔案累加
NF 當前行中的欄位數,即分割後陣列的元素數量
FS 輸入欄位分隔符,預設為空格或製表符
OFS 輸出欄位分隔符,預設為空格或製表符,用於列印時分隔欄位
RS 輸入記錄分隔符,預設為換行符,用於界定不同的記錄
ORS 輸出記錄分隔符,預設為換行符,用於列印時分隔記錄
RSTART 匹配字串的起始位置,由match函式設定
RLENGTH 匹配字串的長度,由match函式設定
ENVIRON 環境變數關聯的關聯陣列,可以訪問外部環境變數

7、awk的正則

正規表示式 展示 功能 解釋及舉例
. 匹配任意單個字元(不包括換行符) /./ 匹配任何單字元的行,如 "a", "b", "1", "!" 等。
^ 脫字元 匹配字串的開始 /^Hello/ 匹配以 "Hello" 開頭的行。
$ 美元符號 匹配字串的結束 /world$/ 匹配以 "world" 結尾的行。
[abc] 字符集 匹配字符集中的任意一個字元 /[abc]/ 匹配含有 "a"、"b" 或 "c" 的行。
[^abc] 否定字符集 匹配不在字符集中的任意一個字元 /[^abc]/ 匹配不含 "a"、"b" 或 "c" 的行。
[a-z] 字元範圍 匹配指定範圍內的任意字元 /[a-z]/ 匹配小寫字母。
\d 數字 匹配任何數字(等價於 [0-9]) /\\d+/ 匹配一個或多個連續數字。
\s 空白字元 匹配任何空白字元(空格、tab、換行等) /\\s+/ 匹配一個或多個空白字元。
\w 單詞字元 匹配字母、數字或下劃線(等價於 [a-zA-Z0-9_]) /\\w+/ 匹配一個或多個單詞字元組成的字串。
\W 非單詞字元 匹配非單詞字元(等價於 [^a-zA-Z0-9_]) /\\W+/ 匹配一個或多個非單詞字元。
* 星號 重複前面的子表示式零次或多次 /a*b/ 匹配任意數量的 "a" 後跟一個 "b",如 "b", "ab", "aab", "aaab"。
+ 加號 重複前面的子表示式一次或多次 /a+b/ 匹配至少一個 "a" 後跟一個 "b",如 "ab", "aab", "aaab"。
? 問號 重複前面的子表示式零次或一次 /a?b/ 匹配 "b" 或者 "ab"。
重複次數 重複前面的子表示式恰好n次 /a{2}/ 匹配 "aa"。
至少重複n次 重複前面的子表示式至少n次 /a{2,}/ 匹配至少兩個 "a" 如 "aa", "aaa", "aaaa" 等。
重複n到m次 重複前面的子表示式n到m次(包括n和m) /a{2,3}/ 匹配 "aa" 或 "aaa"。
(...) 分組 定義子表示式以便引用或重複 /(ab)+/ 匹配一個或多個 "ab" 連續出現,如 "ab", "abab", "ababab"。
| 或者 匹配兩種或多種可能的模式之一 匹配左邊或右邊的子表示式之一 `/apache

8、BEGIN和END模組

BEGIN只執行一次並且執行在主體程式碼塊之前。

END只執行一次並且執行在主體程式碼塊之後。

BEGIN可以拋開檔案單獨執行,結果類似於echo而END不可以。

BEGIN中沒有檔案的讀取變數而END是有的。

但END中的$0是awk處理到最後的文字樣式。

8.1、BEGIN模組

8.1.1、輸出標題行Username shell,以及對應的使用者和shell型別
awk -F ":" 'BEGIN{print "Username shell"} {print $1,$NF}' test01

image-20240508224934872

8.2、END模組

8.2.1、列印對應的使用者和shell型別,最後再列印end of file
awk -F ":" '{print $1,$NF} END{print "out of file"}' test01

image-20240508230602631

9、例項測試

測試文件依然是test01

9.1、列印test01內容並附帶行號

awk '{print NR,$0}' test01

image-20240508210705987

9.2、只列印第二行

awk 'NR==2{print}' test01

image-20240508211902207

9.3、列印二到四行

awk 'NR>=2 && NR<=4{print}' test01
awk 'NR>1 && NR<5{print}' test01

image-20240508213006162

9.4、只列印第二行和第四行

awk 'NR==2 || NR==4{print}' test01

image-20240508213615980

9.5、匹配以root開頭的行

awk '/^root/{print}' test01

image-20240508215454499

9.6、列印test01檔案中使用者和對應的shell型別

awk -F ":" '{print $1,$NF}' test01

image-20240508221936335

四、綜合案例

1、查詢使用者名稱為root的行,並列印其所有的欄位

grep '^root:' test01 | awk -F: '{print "Username: "$1", UID: "$3", GID: "$4", Comment: "$5", Home Dir: "$6", Shell: "$7}'

image-20240508231511844

2、統計不同shell型別的使用者數量

grep -E '/bin/bash$|/sbin/nologin$' test01 | awk -F: '{print $7}' | sort | uniq -c

image-20240508232120435

3、獲取系統的ip地址

ifconfig | sed -n '/netmask/p' | sed 's/^.*inet //g' | sed 's/netmask.*$//g' | sed -n '1p'
ip a|sed -n '/inet /p'|sed 's/^.*inet //g'|sed 's/\/.*$//g'|sed -n '2p'
ip a | grep -oP 'inet \K[\d.]+' | sed -n '2p'
ip a | grep -o -E "([0-9]{1,3}[.]){3}[0-9]{1,3}" | sed -n '2p'
ifconfig ens33|awk -F [" "]+ 'NR==2{print $3}'
ifconfig ens33 | awk 'BEGIN{FS="[[:space:]:]+"} NR==2{print$3}'

image-20240508232905839

相關文章