目錄一、文本搜索工具--grep1、簡介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選項二、流編輯器--sed1、簡介2 ...
目錄
- 一、文本搜索工具--grep
- 二、流編輯器--sed
- 三、文本處理工具--awk
- 四、綜合案例
一、文本搜索工具--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}'