awk是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,以空格為默認分隔符將每行切片,切開的部分再進行各種分析處理。
1
|
awk
'{pattern + action}'
{filenames}
|
盡管操作可能會很復雜,但語法總是這樣,其中 pattern 表示 AWK 在數據中查找的內容,而 action 是在找到匹配內容時所執行的一系列命令。花括號({})不需要在程序中始終出現,但它們用於根據特定的模式對一系列指令進行分組。 pattern就是要表示的正則表達式,用斜杠括起來。
awk語言的最基本功能是在文件或者字符串中基於指定規則瀏覽和抽取信息,awk抽取信息后,才能進行其他文本操作。完整的awk腳本通常用來格式化文本文件中的信息。通常,awk是以文件的一行為處理單位的。awk每接收文件的一行,然后執行相應的命令,來處理文本。
awk內置變量
1
2
3
4
5
6
7
8
9
10
11
12
13
|
ARGC 命令行參數個數
ARGV 命令行參數排列
ENVIRON 支持隊列中系統環境變量的使用
FILENAME awk瀏覽的文件名
FNR 瀏覽文件的記錄數
FS 設置輸入域分隔符,等價於命令行 -F選項
NF 瀏覽記錄的域的個數
NR 已讀的記錄數
OFS 輸出域分隔符
ORS 輸出記錄分隔符
RS 控制記錄分隔符
$0變量是指整條記錄。$1表示當前行的第一個域,$2表示當前行的第二個域,......以此類推。
$NF是number finally,表示最后一列的信息,跟變量NF是有區別的,變量NF統計的是每行列的總數
|
awk 替換后寫入文件awk的sub/gsub函數用來替換字符串
1
|
sub(
/regexp/
, replacement, target)
|
注意第三個參數target,如果忽略則使用$0作為參數,即整行文本。
例子1:替換單個串
只把每行的第一個AAAA替換為BBBB
1
|
awk
'{ sub(/AAAA/,"BBBB"); print $0 }'
t.txt
|
例子2:替換所有的串
把每一行的所有AAAA替換為BBBB
1
|
awk
'{ gsub(/AAAA/,"BBBB"); print $0 }'
t.txt
|
例子3:替換滿足條件的行的串
只在出現字符串CCCC的前提下,將行中所有AAAA替換為BBBB
1
2
3
|
awk
'
/CCCC/
{ gsub(
/AAAA/
,
"BBBB"
); print $0; next }
{ print $0 }
' t.txt
|
例子4:替換多個可選串
不管是AAAA,還是CCCC,全部替換為BBBB
1
|
awk
'{ gsub(/AAAA|aaaa/,"BBBB"); print $0 }'
t.txt
|
例子5:全字匹配替換
全字匹配AAAA;即不匹配AAA,以及AAAAA,也就是說完整的四個字符串AAAA。
1
|
awk
'{ sub(/\<AAAA\>/,"BBBB"); print $0 }'
t.txt
|
例子6:規則表達式匹配
把所有以A開頭,不管后面連續包含幾個A的串替換成一個字符B。
1
|
awk
'{ gsub(/^A*/,"B"); print $0 }'
t.txt
|
awk 替換后寫入文件
1
|
awk
'{gsub(/tomcat/,"tomcatxxxx"); print $0 }'
content.txt >
test
.tmp &&
mv
test
.tmp content2.txt
|
替換滿足條件的行的串
awk '/release/ { gsub(/false/,"true"); print $0; next }{ print $0 }' /home/yang/src/config.js > /home/yang/src/config.tmp && mv /home/yang/src/config.tmp /home/yang/src/config.js