- 一、文字搜尋工具--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.1.1、在
- 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.3.1、將第一行替換為
- 6.4、文字替換
- 6.4.1、將所有的
nologin
替換為login
- 6.4.2、將所有的
/sbin/nologin
替換為/bin/login
- 6.4.3、匹配以
mail
開頭的行,將該行所有的mail
替換為gmail
- 6.4.1、將所有的
- 6.5、查
- 6.5.1、顯示第二行(包括模式空間檔案)
- 6.5.2、只顯示第二行
- 6.1、增
- 三、文字處理工具--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
- 8.1、BEGIN模組
- 9、例項測試
- 9.1、列印test01內容並附帶行號
- 9.2、只列印第二行
- 9.3、列印二到四行
- 9.4、只列印第二行和第四行
- 9.5、匹配以root開頭的行
- 9.6、列印test01檔案中使用者和對應的shell型別
- 四、綜合案例
- 1、查詢使用者名稱為
root
的行,並列印其所有的欄位 - 2、統計不同shell型別的使用者數量
- 3、獲取系統的ip地址
- 1、查詢使用者名稱為
一、文字搜尋工具--grep
1、簡介
grep
(Global search REgular expression and Print out the line.)是一種強大的文字搜尋工具,它能使用特定模式匹配(包括正規表示式)搜尋文字,並預設輸出匹配行。Unix的grep家族包括grep、egrep和fgrep。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
5.2、-v選項
列印出所有不包含
null
的行
grep -v 'echo' test
5.3、-n選項
列印所有不包含
nginx
大小寫,並且顯示所在行
grep -inv 'nginx' test
5.4、-c選項
列印所有不包含
echo
大小寫,並且計算匹配的行的總數
grep -ivc 'echo' test
5.5、-o選項
只列印匹配到的
NgInX
字串
grep -o 'NgInX' test
5.6、-B選項
列印匹配
開始安裝
的前三行
grep -B3 '開始安裝' test
5.7、-A選項
列印匹配
開始安裝
的後三行
grep -A3 '開始安裝' test
5.8、-C選項
列印匹配
開始安裝
的前後兩行
grep -C2 '開始安裝' test
5.9、-w選項
列印完全匹配
NgInX
字串的行
grep -w 'NgInX' test
5.10、-E選項
過濾
test
檔案中所有的空行、註釋#
egrep -v '^#|^$' test
grep -Ev '^#|^$' test
5.11、-e選項
同時查詢包含"安裝"和"NgInX"的行
grep -e '安裝' -e 'NgInX' test
二、流編輯器--sed
sed操作檔案前記得備份原始檔,或者先使用預設的-e引數操作
1、簡介
sed
全稱為Stream EDitor
,行編輯器,同時也是一種流編輯器。是一個強大的非互動式命令列工具,主要用於自動地對文字檔案或者輸入流進行基於模式的查詢、替換、刪除、插入等操作。
2、工作原理
- 讀取行:
sed
逐行讀取輸入檔案(或從標準輸入接收到的資料)。每次讀取一行內容,不會一次性將整個檔案載入到記憶體中,這使得sed
在處理大檔案時效率很高。 - 模式空間:讀取的每一行文字會被放置到一個稱為“模式空間”(pattern space)的緩衝區中。模式空間是
sed
進行文字處理的主要場所,所有的編輯命令都在這裡對文字行進行操作。 - 執行命令:根據提供的命令指令碼,
sed
會對模式空間中的文字行進行匹配、替換、刪除等操作。這些命令可以是簡單的正規表示式匹配,也可以是複雜的邏輯判斷和操作序列。 - 輸出處理結果:處理完一行後,
sed
會將模式空間中的內容輸出到螢幕(或重定向的輸出檔案),然後清空模式空間(除非使用特殊命令如H
、G
、N
、D
等操作了保留空間hold space),準備處理下一行。這個過程重複,直到所有行都被處理完畢。 - 保留空間:除了模式空間,
sed
還有一個稱為“保留空間”(hold space)的緩衝區,它可以用來臨時儲存資料,實現更復雜的文字處理邏輯,比如在多行間傳遞資料。 - 非破壞性處理:預設情況下,
sed
不對原檔案進行修改,而是將處理後的結果輸出到標準輸出。如果你想修改原檔案,可以使用-i
選項進行就地編輯。 - 退出處理:當檔案的所有行都被成功處理並輸出後,
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
6.1.2、在行首新增一行數字
-
sed '1i 111' test01
6.2、刪
"d":delete,刪除文字
6.2.1、刪除第一行
-
nl test01 | sed '1d'
6.2.2、刪除2-10行
-
nl test01 | sed '2,10d'
6.2.3、刪除全文
-
sed 'd' test01
6.2.4、刪除匹配到/sbin/nologin
的行
-
sed '/\/sbin\/nologin/d' test01
6.2.5、刪除以bin
開頭的行
-
sed '/^bin/d' test01
6.2.6、刪除第三行到末尾
-
nl test01 | sed '3,$d'
6.2.7、刪除第1-3行以外的行
-
nl test01 | sed '1,3!d'
6.2.8、去除檔案中的空行和註釋行
-
sed -e '/^#/d' -e '/^$/d' test01
6.3、改
"c":change,替換
6.3.1、將第一行替換為 hello sed
-
sed '1c hello sed' test01
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"。
- "s": 這是sed中最常用的命令,代表替換(substitute)。當你希望在檔案中查詢並替換某些文字時,就會用到這個命令。例如,
-
替換語法(-i選項慎用):
-
sed -i 's/目標內容/替換內容/g' file
-
#本質上與上面的命令差不多,更改分隔符為#可以避免轉義的複雜性,使命令更易讀 sed -i '#/目標內容#替換內容/g' file
-
6.4.1、將所有的nologin
替換為login
-
sed 's/nologin/login/g' test01
6.4.2、將所有的/sbin/nologin
替換為/bin/login
-
sed '/\/sbin\/nologin/s#/sbin\/nologin#/bin/login#g' test01
6.4.3、匹配以mail
開頭的行,將該行所有的mail
替換為gmail
-
sed '/^mail/{s#mail#gmail#g}' test01
6.5、查
"p":print,列印,輸出指定內容
配合
-n
取消預設輸出
6.5.1、顯示第二行(包括模式空間檔案)
-
sed '2p' test01
6.5.2、只顯示第二行
-
sed -n '2p' test01
三、文字處理工具--awk
1、簡介
awk
不僅僅是 linux系統中的一個命令,而且是一種程式語言,可以用來處理資料和生成報告(excel)。處理的資料可以是一個或多個檔案,可以是來自標準輸入,也可以透過管道獲取標準輸入,awk
可以在命令列上直接編輯命令進行操作,也可以編寫成awk程式來進行更為複雜的運用。
2、工作原理
- 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處理的內容可以來自標準輸入(<) ,一個或多個檔案或者管道
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
8.2、END模組
8.2.1、列印對應的使用者和shell型別,最後再列印end of file
awk -F ":" '{print $1,$NF} END{print "out of file"}' test01
9、例項測試
測試文件依然是test01
9.1、列印test01內容並附帶行號
awk '{print NR,$0}' test01
9.2、只列印第二行
awk 'NR==2{print}' test01
9.3、列印二到四行
awk 'NR>=2 && NR<=4{print}' test01
awk 'NR>1 && NR<5{print}' test01
9.4、只列印第二行和第四行
awk 'NR==2 || NR==4{print}' test01
9.5、匹配以root開頭的行
awk '/^root/{print}' test01
9.6、列印test01檔案中使用者和對應的shell型別
awk -F ":" '{print $1,$NF}' test01
四、綜合案例
1、查詢使用者名稱為root
的行,並列印其所有的欄位
grep '^root:' test01 | awk -F: '{print "Username: "$1", UID: "$3", GID: "$4", Comment: "$5", Home Dir: "$6", Shell: "$7}'
2、統計不同shell型別的使用者數量
grep -E '/bin/bash$|/sbin/nologin$' test01 | awk -F: '{print $7}' | sort | uniq -c
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}'