《Linux – Ubuntu 如何使用awk搜尋文字檔案內的字串 – 學習筆記》

Telegram share !

相信很多系統維運人員都會處理到臨時要調整系統資訊,但是因為一台主機上有很多個設定檔案與程式碼,怕一不小心漏改到造成系統錯誤,這時候可以使用awk這個指令來輔助搜尋,在Linux中提供不少方便的awk函式供系統管理人員使用,但由於內建函式眾多,我只提供日常比較常用的函式供你參考,我也順便紀錄下來當作備忘錄,也希望藉由此次分享讓初學者能更快掌握相關語法。

測試資料

檔案名稱可以用furnituredb.txt,使用vim furnituredb.txt建立並將以下資料貼入即可開始測試

ID / Name / SN
F001 咖啡桌 6QY852V793UB
F002 餐桌 NA7L27342OZB
F003 邊桌 680H92L6Q0TM
F004 茶几 Q3CWQQ80JBHH
F005 木頭餐桌 3M3VEFHK744N
F006 柚木餐桌 UI3GK6PR3Y36
0001 長桌 6M3VEFHK788N

awk基本用法:

1.搜尋特定檔案內的關鍵字

awk “/桌/ 檔案名稱

# 基本搜索: 使用 awk 来搜索包含指定文本的行。
[email protected]:/home/ubuntu# awk "/桌/" furnituredb.txt
F001 咖啡桌 6QY852V793UB
F002 餐桌 NA7L27342OZB
F003 邊桌 680H92L6Q0TM
F005 木頭餐桌 3M3VEFHK744N
F006 柚木餐桌 UI3GK6PR3Y36
0001 長桌 6M3VEFHK788N

2.搜尋特定目錄下所有檔案,包含關鍵字的檔案找出來

find 目錄名 -type f -exec awk ‘/關鍵字/ {print FILENAME “:” $0}’ {} \;

#使用 find + aws可以針對資料夾內的文字檔案做遞迴搜索,找出包含指定關鍵字的檔案。
[email protected]:/home/ubuntu# find /home/ubuntu/ -type f -exec awk '/桌/ {print FILENAME ":" $0}' {} \;
/home/ubuntu/furnituredb.txt:F001 咖啡桌 6QY852V793UB
/home/ubuntu/furnituredb.txt:F002 餐桌 NA7L27342OZB
/home/ubuntu/furnituredb.txt:F003 邊桌 680H92L6Q0TM
/home/ubuntu/furnituredb.txt:F005 木頭餐桌 3M3VEFHK744N
/home/ubuntu/furnituredb.txt:F006 柚木餐桌 UI3GK6PR3Y36
/home/ubuntu/furnituredb.txt:0001 長桌 6M3VEFHK788N

3.搜尋特定檔案內的關鍵字並且忽略大小寫

find 目錄路徑 -type f -exec awk ‘BEGIN {IGNORECASE = 1} /關鍵字/ {print FILENAME “:” $0}’ {} \;

# 使用BEGIN {IGNORECASE = 1} 選項可以忽略搜索時的大小寫差異
[email protected]:/home/ubuntu# find /home/ubuntu/ -type f -exec awk 'BEGIN {IGNORECASE = 1} /f00/ {print FILENAME ":" $0}' {} \;
/home/ubuntu/furnituredb.txt:F001 咖啡桌 6QY852V793UB
/home/ubuntu/furnituredb.txt:F002 餐桌 NA7L27342OZB
/home/ubuntu/furnituredb.txt:F003 邊桌 680H92L6Q0TM
/home/ubuntu/furnituredb.txt:F005 木頭餐桌 3M3VEFHK744N
/home/ubuntu/furnituredb.txt:F006 柚木餐桌 UI3GK6PR3Y36

4.使用正則運算式搜尋

find 目錄路徑或檔案名稱 -type f -exec awk ‘BEGIN {IGNORECASE = 1} /^[0-9]/ {print FILENAME “:” $0}’ {} \;

# 使用/正則運算式/可以啟用正則運算式搜索
[email protected]:/home/ubuntu# find /home/ubuntu/ -type f -exec awk 'BEGIN {IGNORECASE = 1} /^[0-9]/ {print FILENAME ":" $0}' {} \;
/home/ubuntu/furnituredb.txt:0001 長桌 6M3VEFHK788N

5.使用反向搜尋

!/keyword/ 是正則運算式,用於匹配不包含關鍵字的資料行

# 使用 ! /邊桌/ 可以找出不想被搜尋出來的關鍵字之外的紀錄
[email protected]:/home/ubuntu# find furnituredb.txt -type f -exec awk 'BEGIN {IGNORECASE = 1} !/邊桌/ {print FILENAME ":" $0}' {} \;
furnituredb.txt:ID / Name / SN
furnituredb.txt:F001 咖啡桌 6QY852V793UB
furnituredb.txt:F002 餐桌 NA7L27342OZB
furnituredb.txt:F004 茶几 Q3CWQQ80JBHH
furnituredb.txt:F005 木頭餐桌 3M3VEFHK744N
furnituredb.txt:F006 柚木餐桌 UI3GK6PR3Y36
furnituredb.txt:0001 長桌 6M3VEFHK788N

6.顯示行號

” NR”

# 使用 " NR" 選項可以找出被搜尋出來的關鍵字並顯示行號
[email protected]:/home/ubuntu# find furnituredb.txt -type f -exec awk 'BEGIN {IGNORECASE = 1} /邊桌/ {print FILENAME ":"NR":" $0}' {} \;
furnituredb.txt:4:F003 邊桌 680H92L6Q0TM

Reference