一天乙個shell命令 文字內容操作系列 awk

2021-09-21 12:05:14 字數 3980 閱讀 8834

說明:

awk被設計用於資料流,能夠對列和行進行操作。而sed更多的是匹配,進行替換和刪除。

awk有很多內建的功能,比如陣列,函式等。靈活性是awk的最大優勢。 

awk的結構

awk '

begin

pattern

end'

file

為了偏於**,我打了回車,實際上是一行

乙個awk指令碼通常是3部分

1.begin語句塊

2. 能夠使用模式匹配的通用語句塊

3.end語句塊

他們任何一部分都可以不出現在指令碼中。指令碼通常包含在雙引號或者單引號內。

例如:

awk 'beginend' filename  

工作原理

awk命令的工作方式如下:

1. 執行begin語句塊中的語句

2. 從檔案或者stdin中讀取一行,然後執行pattern. 迭代直到全部讀取完畢

3. 最後執行end語句塊

再次提醒,他們任何一部都可以沒有

awk的功能也遠不止如此

入門例項:

echo | awk ''  

列印: v1 v2 v3  

解釋:逗號為定界符(分隔符)

echo | awk '' 

列印v1-v2-v3

解釋:雙引號為連線符

其他任何符號,都不能正常輸出v1,v2,v3

解讀--help(乙個非常龐大複雜的幫助文件,官方用了410頁的篇幅pdf來介紹,如果我只言片語,你信我自己都不信。。)

用法: awk [posix 或 gnu 風格選項] -f 指令碼檔案 [--] 檔案 ... 

用法: awk [posix 或 gnu 風格選項] [--] '程式' 檔案 ... 

posix 選項:             gnu 長選項: 

-f 指令碼檔案        --file=指令碼檔案 

-f fs            --field-separator=fs

指定輸入文字分隔符,fs是乙個字串或者是乙個正規表示式, 

-v var=val        --assign=var=val

將外部變數值付給var 

-m[fr] val 

-o            --optimize

啟用一些優化程式的內部表示。

-w compat        --compat

在相容模式下執行awk。所以gawk的行為和標準的awk完全一樣,所有的awk擴充套件都被忽略。 

-w dump-variables[=file]    --dump-variables[=file]

列印全域性變數,其型別,提交的最終值的排序列表。 

-w exec=file        --exec=file

與-f類似,但與他有兩點不同,(我回頭把相關文件上傳,太長) 

-w gen-po        --gen-po

(內容太多) 

-w help            --help 列印幫助 

-w lint[=fatal]        --lint[=fatal]

警告可疑或不移植到其他的awk實現的結構 

-w lint-old        --lint-old

列印關於不能向傳統unix平台移植的結構的警告 

-w non-decimal-data    --non-decimal-data

啟用自動輸入資料的解釋,八進位制和十六進製制值 

-w profile[=file]    --profile[=file]

啟用awk程式剖析 

-w posix        --posix

在嚴格意義上的posix模式運作。

-w re-interval        --re-interval

允許間隔表示式在正規表示式上 

-w source=program-text    --source=program-text 

-w traditional        --traditional

傳統的unix awk的正規表示式匹配 

-w usage        --usage 

-w use-lc-numeric    --use-lc-numeric

解析數字輸入時,強制使用的語言環境中的小數點字元 

資料-w version        --version

提交錯誤報告請參考「gawk.info」中的「bugs」頁,它位於列印版本中的「reporting 

problems and bugs」一節 

注意:gawk是awk的gnu版本,即使help ,在ubuntu下也需要先安裝gawk

部分特殊變數:

nr:表示記錄數量,在執行過程中對應於行號

nf:表示字段數量,在執行過程中對應於當前行的字段數

$0:這個變數包含執行過程中當前行的文字內容

$1:第乙個欄位的文字內容

$2:第二個欄位的文字內容

例子:

例1.

echo -e "line1 f2 f3\nline2 f4 f5\nline3 f6 f7"|\#這個\是在視窗中寫多行命令用的  

awk ''  

小注一下:$1是列印第乙個,$nf列印最後乙個字段,$(nf-1)列印倒數第二個

例2.

seq 5 | awk 'beginend' 

這個例子用到了基本格式。

begin中 初始化了sum,列印summation

中間模組列印了第一列,然後給sum+1

end中列印了sum

例3. 關於-v 外部變數

var=

10000

$echo | awk –v 

variable

=$var'' 

還有另一種靈活的方法可以將多個外部變數傳遞給awk,例如:

$

var1

="value1"

var2

="value2"

$echo | awk '' 

v1=$var1 

v2=$var2 

如果來自檔案

awk '' 

v1=$var1 

v2=$var2 filename 

例4

$awk 'nr < 5'#行號小於5

$awk 'nr==1,nr==4'#行號在1到5之間的行

$awk '/linux/'#包含樣式linux的行(可以用正規表示式指定樣式)

$awk '!/linux/'#不包含樣式linux的行

這次先寫這些,爭取在花2個篇幅能把awk做個比較全面的認識。

附件:

一天乙個shell命令 cut

1.命令簡介 cut根據指定的定界符,切分檔案,並將選中的列輸出到標準輸出。2.用法 cut 選項 檔案 列印輸入行的選中的parts 到標準輸出 3.選項 4.示例 以密碼 etc passwd為例 root xqzt tail n 5 etc passwd nfsnobody x 65534 6...

一天乙個shell命令 文字系列 file

file 官方解釋 determine type of files.判定檔案的型別。小知識 在unix linux系統中,檔案型別並不是由副檔名決定的 windows是的 開篇例子 1.file file.txt 輸出 file.txt ascii english text 注 file.txt是我...

一天乙個shell命令 檔案內容操作系列 cat

注 在awk命令之後,沒有太多複雜命令,都是一些基礎命令。說明 cat,是單詞 concatenate 的縮寫,把檔案的內容輸出到stdout.當與重定向操作符 或 結合使用時,一般都是用來將多個檔案連線起來.用法 1.cat file1 file2 file3 2.不僅可以從檔案中讀取內容並且拼接...