linux文本處理grep、sed、awk
grep
grep [options] PATTERN [FILE]
grep | 選項 | 解釋 |
---|---|---|
- | ||
- | 正則表達式的選擇 | |
- | -E, –extended-regexp | 擴展的正則表達式,同命令egrep(已廢棄),字符`? + { } |
- | -G, –basic-regexp | 基本正則表達式,grep默認執行,字符`? + { } |
- | -F, –fixed-regexp | 所有搜索都是普通字符串,不進行正則匹配 |
- | -P, –perl-regexp | 使用Perl正則表達式 |
- | -e, –regexp=PATTERN | 用PATTERN來匹配 |
- | -f, –file=FILE | 指定規則文件 |
- | -i, –ignore-case | 忽略大小寫 |
- | -w, –word-regexp | 強制PATTERN僅完全匹配字詞 |
- | -x, –line-regexp | 強制PATTERN僅完全匹配一行 |
- | ||
- | 雜項 | |
- | -s, –no-messages | 不顯示錯誤信息 |
- | -v, –invert-match | 選中不匹配的行 |
- | ||
- | 輸出控制 | |
- | -m, –max-count=NUM | NUM次匹配後停止 |
- | -b, –byte-offset | 輸出的同時打印字節偏移 |
- | -n, –line-number | 輸出的同時打印行號 |
- | -H, –with-filename | 輸出同時打印文件名 |
- | -o, –only-matching | 僅輸出匹配的部分 |
- | -d, –directories=ACTION | 讀取目錄的方式,read/recurse/skip |
- | -r, –recursive | 同 --directories=recurse |
- | -l, –files-with-matches | 僅打印匹配的文件名 |
- | -L, –files-without-matches | 僅打印不匹配的文件名 |
- | ||
- | 文件控制 | |
- | -B, –before-context=NUM | 打印匹配文本及前NUM行 |
- | -A, –after-context=NUM | 打印匹配文本及後NUM行 |
- | -C, –context=NUM | 打印匹配文本的前後NUM行 |
sed
sed (stream editor),sed是一個流編輯器,sed把讀入的文本,通過一系列編輯命令轉換爲另一種格式輸出。
sed不會改變源文件。
- sed的命令格式
sed option 'script' file1 file2 ...
sed option -f scriptfile file1 file2 ...
sed處理的文件既可以由標準輸入重定向得到,也可以當命令行參數傳入,命令行參數可以一次傳入多個文件,sed會依次處理。sed的編輯命令可以直接當命令行參數傳入,也可以寫成一個腳本文件然後用-f參數指定。
- sed的執行的方式
/pattern/action
pattern是正則表達式,action是編輯操作。sed程序一行一行讀出待處理文件,如果某一行與pattern匹配,則執行相應的action,如果一條命令沒有pattern而只有action,這個action將作用於待處理文件的每一行。
- 常用選項
sed | 選項 | 解釋 |
---|---|---|
- | -n | 取消打印模式空間 |
- | -r | 使用擴展的正則表達式,sed默認運行基本正則匹配 |
- | -s | 將輸入文件視爲各個獨立的文件而不是一個長的連續輸入 |
- | -u | 從輸入文件中讀取最少的數據,更頻繁的刷新輸出 |
- | -f = FILE | 指定腳本文件 |
- | -e = EXP | 指定腳本 |
- | -i | 直接修改文件的內容 |
模式空間: 當前sed處理的行
- 常用命令
格式 | 含義 |
---|---|
a | 新增, a 的後面可以接字串,而這些字串會新增在匹配行的下一行 |
i | 插入, i 的後面可以接字串,而這些字串會插入到匹配行的上一行 |
c | 取代, c 的後面可以接字串,這些字串取代匹配行 |
d | 刪除, d 後面通常不接任何東西 |
p | 打印,通常 p 會與 -n 選項一起使用 |
s | 替換,s替換 |
- | - |
/pattern/p | 打印匹配pattern的行 |
/pattern/d | 刪除匹配pattern的行 |
/pattern/s/pattern1/pattern2/ | 查找符合pattern的行,將該行第一個匹配pattern1的字符串替換爲pattern2 |
/pattern/s/pattern1/pattern2/g | 查找符合pattern的行,將該行所有匹配pattern1的字符串替換爲pattern2 |
- | - |
- | 數字可作爲行數的索引地址,用逗號分隔 |
sed ‘1,10d’ a.txt | 刪除1-10 |
awk
sed以行爲單位處理文件,awk比sed強的地方在於不僅能以行爲單位還能以列爲單位處理文件。
awk缺省的行分隔符是換行,缺省的列分隔符是連續的空格和Tab,但是行分隔符和列分隔符都可以自定義。
awk是一門很複雜的腳本語言,但基本用法和sed類似,它可以運行基本運算和流程控制。
- awk命令的基本形式
awk option 'script' file1 file2 ...
awk option -f scriptfile file1 file2 ...
- awk的執行方式
/pattern/{actions}
condition{actions}
如果某一行與pattern匹配,或者滿足condition條件,則執行相應的actions,如果一條awk命令只有actions部分,則actions作用於待處理文件的每一行。
- awk需要熟悉的用法
awk常用的內置變量
變量 | 含義 |
---|---|
FILENAME | 當前輸入文件的文件名,該變量是隻讀的 |
NR | 當前行的行號,該變量是隻讀的,R代表record |
NF | 當前行所擁有的列數,該變量是隻讀的,F代表field |
OFS | 輸出格式的列分隔符,缺省是空格 |
FS | 輸入文件的列分融符,缺省是連續的空格和Tab |
ORS | 輸出格式的行分隔符,缺省是換行符 |
RS | 輸入文件的行分隔符,缺省是換行符 |
$0 | 當前整行的內容 |
第一列 第二列 … | |
BEGIN { … } | 在整個文件處理之前執行一次 |
END { … } | 在整個文件處理完成後執行一次 |
awk常用選項
awk | 選項 | 解釋 |
---|---|---|
- | -f,–file=progfile | 指定awk腳本文件 |
- | -F,–field-separator=fs | 重新指定輸入文件的列分隔符 awk -F : ... |
- | -v var = value | 賦值一個變量 awk -v x=1 ... |
變量
awk可以使用變量,但是不需要定義,第一次使用的時候回自動定義變量,變量是全局的。
格式化輸出
awk支持printf
格式化輸出。
$ awk -v x=0 -F '[:, ]' 'BEGIN{OFS="!"} {print $1,$2,$3,$4; x++} END {print x "lines"}' a.txt
## -v 聲明一個變量並賦值
## -F 指定輸入文件的列分隔符,用[]指定多個分隔符
## OFS='!' 指定輸出分隔符爲!
## END 輸出行數