文章目錄
- 一、AWK
- 1. `awk` 是什么?
- 2. `awk` 的基礎語法
- 2.1 選項
- 2.2 模式
- 2.3 動作
- 3. `awk` 的內置變量
- 4. 典型應用場景及示例
- 4.1 打印特定列
- 4.2 條件篩選
- 4.3 使用正則表達式
- 4.4 統計行數
- 4.5 字段操作
- 4.6 使用內置函數
- 4.7 多文件處理
- 4.8 使用自定義變量
- 5. 高級應用:多行處理
- 6. 實戰案例:日志分析
- 6.1 提取 IP 地址
- 6.2 提取狀態碼
- 6.3 統計每個 IP 的訪問次數
- 7.begin和end模式
- 7.1`BEGIN` 模式
- 示例 1:初始化變量
- 示例 2:設置輸入字段分隔符
- 7.2`END` 模式
- 示例 1:打印總結信息
- 示例 2:統計文件行數
- 7.3 綜合示例
- 二、SED
- 1. `sed` 是什么?
- 2. `sed` 的基礎語法
- 2.1 選項
- 2.2 命令
- 3. 常用命令及示例
- 3.1 替換(`s`)
- 示例 1:替換文本中的單詞
- 示例 2:全局替換(`g` 標志)
- 示例 3:替換第 2 行的內容
- 示例 4:替換匹配正則表達式的行
- 3.2 刪除(`d`)
- 示例 1:刪除第 5 行
- 示例 2:刪除第 5 到第 10 行
- 示例 3:刪除所有包含 `error` 的行
- 3.3 打印(`p`)
- 示例 1:打印第 5 行
- 示例 2:打印第 5 到第 10 行
- 示例 3:打印所有包含 `error` 的行
- 3.4 追加(`a`)和插入(`i`)
- 示例 1:在第 5 行后追加文本
- 示例 2:在第 5 行前插入文本
- 3.5 替換整行(`c`)
- 示例 1:將第 5 行替換為新內容
- 4. 高級應用
- 4.1 多命令組合
- 示例:先替換,再刪除
- 4.2 直接修改文件(`-i`)
- 示例:直接替換文件中的內容
- 4.3 使用擴展正則表達式(`-r` 或 `-E`)
- 示例:匹配單詞邊界
- 5. 實戰案例:日志處理
- 5.1 刪除所有包含 `error` 的行
- 5.2 替換狀態碼 `200` 為 `OK`
- 5.3 在每行末尾追加注釋
- 參考文檔
一、AWK
1. awk
是什么?
awk
是一種強大的文本處理工具,主要用于處理結構化的文本數據(如表格、日志文件等)。它能夠逐行讀取文件內容,根據指定的規則對每一行進行處理,并輸出結果。awk
的名字來源于其發明者的姓氏首字母(Aho、Weinberger、Kernighan)。
2. awk
的基礎語法
awk
的基本語法如下:
awk [選項] '模式 {動作}' 文件
2.1 選項
-F fs
:指定輸入字段分隔符(默認是空格或制表符)。-v var=value
:向awk
腳本傳遞變量。-f script.awk
:從文件讀取awk
腳本。
2.2 模式
模式用于指定哪些行需要執行動作。可以是:
- 空模式(
{}
):匹配所有行。 - 正則表達式(
/pattern/
):匹配符合正則表達式的行。 - 條件表達式(
$1 > 100
):匹配滿足條件的行。
2.3 動作
動作是用 {}
包裹的代碼塊,用于對匹配的行進行處理。可以使用 awk
的內置函數和變量。
3. awk
的內置變量
awk
提供了許多內置變量,用于處理文本數據:
變量 | 作用 |
---|---|
$0 | 當前行的全部內容 |
$1, $2, ... | 當前行的第 1、第 2、… 個字段 |
NF | 當前行的字段數 |
NR | 當前行號(全局) |
FNR | 當前文件的行號 |
FS | 輸入字段分隔符(默認是空格或制表符) |
OFS | 輸出字段分隔符(默認是空格) |
RS | 輸入記錄分隔符(默認是換行符) |
ORS | 輸出記錄分隔符(默認是換行符) |
4. 典型應用場景及示例
4.1 打印特定列
需求:打印 /etc/passwd
文件的第 1 列和第 7 列(字段分隔符是冒號 :
)。
awk -F: '{print $1, $7}' /etc/passwd
4.2 條件篩選
需求:篩選出第 2 列大于 100 的行。
awk '$2 > 100' data.txt
4.3 使用正則表達式
需求:篩選出包含單詞 error
的行。
awk '/error/' access.log
4.4 統計行數
需求:統計文件的行數。
awk 'END {print NR}' file.txt
4.5 字段操作
需求:將第 1 列和第 2 列拼接成新的字段,用逗號分隔。
awk -F: '{print $1 "," $2}' /etc/passwd
4.6 使用內置函數
需求:計算每行的字段數。
awk '{print NF}' data.txt
4.7 多文件處理
需求:同時處理多個文件,打印每個文件的行號和內容。
awk '{print FNR, $0}' file1.txt file2.txt
4.8 使用自定義變量
需求:計算所有行的第 3 列的總和。
awk '{sum += $3} END {print sum}' data.txt
5. 高級應用:多行處理
需求:打印每行的前 3 行內容。
awk '{print NR-3, NR-2, NR-1, NR, $0}' data.txt
6. 實戰案例:日志分析
假設有一個日志文件 access.log
,格式如下:
192.168.1.1 - - [25/Jul/2024:10:42:35 +0800] "GET /index.html HTTP/1.1" 200 1234
192.168.1.2 - - [25/Jul/2024:10:42:36 +0800] "POST /submit HTTP/1.1" 200 5678
6.1 提取 IP 地址
awk '{print $1}' access.log
6.2 提取狀態碼
awk '{print $9}' access.log
6.3 統計每個 IP 的訪問次數
awk '{ip[$1]++} END {for (i in ip) print i, ip[i]}' access.log
7.begin和end模式
在 awk
中,BEGIN
和 END
是兩個特殊的模式。
BEGIN
:在處理任何輸入行之前執行一次,適合初始化變量、設置輸入字段分隔符等。END
:在處理完所有輸入行之后執行一次,適合打印總結信息、執行后續操作等。
7.1BEGIN
模式
BEGIN
模式在處理任何輸入行之前執行一次。它通常用于:
- 初始化變量。
- 設置輸入字段分隔符(
FS
)。 - 執行一些在處理文件之前需要完成的操作。
示例 1:初始化變量
假設我們要計算文件中所有數字的總和,可以在 BEGIN
中初始化總和變量。
awk 'BEGIN {sum = 0}{sum += $1}END {print "總和是: " sum}' data.txt
示例 2:設置輸入字段分隔符
假設文件的字段分隔符是逗號(,
),可以在 BEGIN
中設置 FS
。
awk 'BEGIN {FS=","}{print $1, $2}' data.csv
7.2END
模式
END
模式在處理完所有輸入行之后執行一次。它通常用于:
- 打印總結信息。
- 執行一些在處理文件之后需要完成的操作。
示例 1:打印總結信息
假設我們要計算文件中所有數字的總和,并在處理完所有行后打印總和。
awk 'BEGIN {sum = 0}{sum += $1}END {print "總和是: " sum}' data.txt
示例 2:統計文件行數
假設我們要統計文件的行數。
awk 'END {print NR}' file.txt
7.3 綜合示例
假設我們有一個日志文件 access.log
,格式如下:
192.168.1.1 - - [25/Jul/2024:10:42:35 +0800] "GET /index.html HTTP/1.1" 200 1234
192.168.1.2 - - [25/Jul/2024:10:42:36 +0800] "POST /submit HTTP/1.1" 200 5678
需求:統計每個狀態碼的出現次數,并在處理完所有行后打印總結信息。
awk 'BEGIN {FS=" "}{status_code = $9if (status_code in status_count) {status_count[status_code]++} else {status_count[status_code] = 1}}END {for (code in status_count) {print "狀態碼 " code " 出現了 " status_count[code] " 次"}}' access.log
建議
- 初始化變量:在
BEGIN
中初始化變量,避免在動作塊中重復初始化。 - 總結信息:在
END
中打印總結信息,避免在動作塊中重復計算。 - 調試:在
BEGIN
和END
中打印調試信息,幫助定位問題。
二、SED
1. sed
是什么?
sed
(Stream Editor)是一種流編輯器,主要用于對文本數據進行處理。它逐行讀取輸入(可以是文件或標準輸入),對每一行執行指定的編輯操作,并輸出結果。sed
的操作是基于正則表達式的,非常適合進行文本替換、刪除、插入等操作。
2. sed
的基礎語法
sed
的基本語法如下:
sed [選項] '命令' 文件
2.1 選項
-i
:直接修改文件內容(慎用,會覆蓋原文件)。-e
:允許使用多條命令。-f
:從文件讀取命令。-r
或-E
:使用擴展正則表達式(更強大的正則表達式支持)。-n
:靜默模式,不自動打印每一行,需要顯式使用p
命令打印。
2.2 命令
sed
的命令格式為:
[地址]命令
- 地址:可以是行號(如
5
)、范圍(如5,10
)、正則表達式(如/pattern/
)等。 - 命令:常見的命令有
s
(替換)、d
(刪除)、p
(打印)、a
(追加)、i
(插入)等。
3. 常用命令及示例
3.1 替換(s
)
sed
最常用的命令是 s
,用于替換文本中的內容。
示例 1:替換文本中的單詞
需求:將文件中的所有 foo
替換為 bar
。
sed 's/foo/bar/' file.txt
示例 2:全局替換(g
標志)
需求:將文件中的所有 foo
替換為 bar
(每行替換所有出現的 foo
)。
sed 's/foo/bar/g' file.txt
示例 3:替換第 2 行的內容
需求:只替換第 2 行中的 foo
為 bar
。
sed '2s/foo/bar/' file.txt
示例 4:替換匹配正則表達式的行
需求:只替換包含 error
的行中的 foo
為 bar
。
sed '/error/s/foo/bar/' file.txt
3.2 刪除(d
)
刪除指定的行。
示例 1:刪除第 5 行
sed '5d' file.txt
示例 2:刪除第 5 到第 10 行
sed '5,10d' file.txt
示例 3:刪除所有包含 error
的行
sed '/error/d' file.txt
3.3 打印(p
)
打印指定的行(通常與 -n
選項一起使用)。
示例 1:打印第 5 行
sed -n '5p' file.txt
示例 2:打印第 5 到第 10 行
sed -n '5,10p' file.txt
示例 3:打印所有包含 error
的行
sed -n '/error/p' file.txt
3.4 追加(a
)和插入(i
)
在指定位置追加或插入文本。
示例 1:在第 5 行后追加文本
sed '5a ===' file.txt
示例 2:在第 5 行前插入文本
sed '5i ===' file.txt
3.5 替換整行(c
)
將指定行替換為新內容。
示例 1:將第 5 行替換為新內容
sed '5c new line' file.txt
4. 高級應用
4.1 多命令組合
可以使用 -e
選項組合多個命令。
示例:先替換,再刪除
sed -e 's/foo/bar/' -e '5d' file.txt
4.2 直接修改文件(-i
)
直接修改文件內容(慎用,會覆蓋原文件)。
示例:直接替換文件中的內容
sed -i 's/foo/bar/' file.txt
4.3 使用擴展正則表達式(-r
或 -E
)
使用更強大的正則表達式。
示例:匹配單詞邊界
sed -r 's/\bfoo\b/bar/' file.txt
5. 實戰案例:日志處理
假設有一個日志文件 access.log
,格式如下:
192.168.1.1 - - [25/Jul/2024:10:42:35 +0800] "GET /index.html HTTP/1.1" 200 1234
192.168.1.2 - - [25/Jul/2024:10:42:36 +0800] "POST /submit HTTP/1.1" 200 5678
5.1 刪除所有包含 error
的行
sed '/error/d' access.log
5.2 替換狀態碼 200
為 OK
sed 's/200/OK/' access.log
5.3 在每行末尾追加注釋
sed 's/$/ # processed/' access.log
參考文檔
- 官方文檔:GNU Sed Manual
- 在線教程:Sed One-Liners Explained
- 官方文檔:GNU Awk User’s Guide
- 在線教程:Learn Awk the Hard Way