在 Linux 系統中過濾文件中的字符串,可以使用多種命令行工具實現。以下是幾種常見方法及詳細說明:
一、使用 grep
命令(最常用)
grep
是 Linux 中最強大的文本搜索工具,支持正則表達式。
基礎語法:
grep [選項] "要搜索的字符串" 文件名
常用選項:
-i
:忽略大小寫(grep -i "error" log.txt
)-v
:反向匹配(顯示不包含字符串的行)-n
:顯示匹配行的行號-r
:遞歸搜索目錄下的所有文件-w
:精確匹配整個單詞(避免部分匹配)-c
:統計匹配的行數
示例:
-
簡單匹配:
grep "error" /var/log/syslog
輸出所有包含
error
的行。 -
忽略大小寫:
grep -i "warning" app.log
匹配
warning
、WARNING
、Warning
等。 -
顯示行號:
grep -n "404" access.log
輸出格式:
行號:匹配內容
-
反向匹配:
grep -v "debug" server.log
輸出所有不包含
debug
的行。 -
統計匹配次數:
grep -c "failed" auth.log
二、使用 awk
命令(復雜文本處理)
awk
適合按列處理文本,支持更復雜的邏輯。
基礎語法:
awk '/模式/ {動作}' 文件名
示例:
-
按列過濾(假設字段以空格分隔):
awk '$3 > 1000' data.txt # 輸出第三列大于1000的行
-
多條件匹配:
awk '/error/ && /network/' app.log
同時包含
error
和network
的行。 -
自定義輸出:
awk '/error/ {print "Line " NR ": " $0}' app.log
輸出匹配行時添加自定義前綴。
三、使用 sed
命令(流編輯器)
sed
主要用于文本替換,但也可用于過濾。
示例:
-
打印匹配行:
sed -n '/error/p' app.log
-n
表示不自動打印所有行,p
表示打印匹配行。 -
刪除匹配行:
sed '/error/d' app.log
刪除所有包含
error
的行(僅輸出到終端,不修改原文件)。
四、組合工具(高級用法)
1. 結合 grep
和 awk
:
grep "error" app.log | awk '{print $1, $2}'
先過濾出包含 error
的行,再提取前兩列。
2. 使用正則表達式:
grep -E "error|warning" app.log # 匹配 error 或 warning
grep "^[0-9]{4}-" dates.txt # 匹配以四位數字-開頭的行(如 2025-05-13)
五、注意事項
-
特殊字符轉義:
如果搜索內容包含正則表達式特殊字符(如.
,*
,[ ]
),需用反斜杠轉義:grep "192\.168\.1\.1" network.log
-
性能優化:
- 對大文件使用
grep -F
禁用正則表達式,加速搜索。 - 使用
--color=auto
高亮匹配內容:grep --color=auto "error" app.log
- 對大文件使用
六、實戰案例
場景:從 Nginx 日志中提取所有 404 錯誤請求。
grep " 404 " /var/log/nginx/access.log | awk '{print $1, $7}'
輸出格式:客戶端IP 請求的URL
根據需求選擇合適的工具,簡單場景用 grep
,復雜邏輯用 awk
。