Linux awk 命令學習筆記

2021-09-11 17:21:00 字數 3639 閱讀 2416

創始人:alfred aho,peter weinberger, 和 brian kernighan

語法:

awk [options] 'script' var=value file(s) 

awk [options] -f scriptfile var=value file(s)

options常用引數說明:

示例1,單個分隔符:

awk -f, '' test.log #表示使用逗號分割,展示第一列和第二列

示例2,多個分隔符:

$ awk -f '[_,]' '' test.log #先使用下劃線分割,然後對分割結果在使用逗號分隔

示例:設定變數a為1

cat test.log | awk -v a=1 ''

輸出結果:12 13,使用+做數值運算

cat test.log | awk -v a=1 ''

輸出結果:12 12__1,使用雙引號做拼接處理

指令碼基本結構:

awk 'begin pattern end' file
乙個awk指令碼通常由:begin語句塊、能夠使用模式匹配的通用語句塊、end語句塊3部分組成,這三個部分是可選的。任意乙個部分都可以不出現在指令碼中,指令碼通常是被單引號或雙引號中,例如:

awk 'begin  end' filename

awk "begin end" filename

工作原理:

awk 'begin pattern end'
!注意:在主體塊部分沒有關鍵字存在,begin 和 end 是 awk 的關鍵字,必須大寫,指令碼中可以沒有開始塊和結束塊。

輸出:使用格式:print item1, item2.....

要點:1、各專案之間使用逗號隔開,而輸出時則以空白字元分隔顯示;

2、輸出的item可以為字串或數值、當前記錄的字段(如$1)、變數或awk的表示式;數值會先轉換為字串,而後再輸出;

3、print命令後面的item可以省略,此時其功能相當於print $0, 因此,如果想輸出空白行,則需要使用print "";

printf format, item1, item2, ...

要點:1、其與print命令的最大不同是,printf需要指定格式;

2、format用於指定後面的每個item的輸出格式;

3、printf語句不會自動列印換行,需要顯式使用\n換行。

format格式的指示符都以%開頭,後跟乙個字元;如下:

%c:顯示字元的ascii碼;

%d, %i:十進位制整數;

%e, %e:科學計數法顯示數值;

%f:顯示浮點數;

%g, %g:以科學計數法的格式或浮點數的格式顯示數值;

%s:顯示字串;

%u:無符號整數;

%%:顯示%自身;

1. 使用格式:

print items > output-file

print items >> output-file

print items | command

2. 特殊檔案描述符:

/dev/stdin:標準輸入

/dev/sdtout: 標準輸出

/dev/stderr: 錯誤輸出

/dev/fd/n: 某特定檔案描述符,如/dev/stdin就相當於/dev/fd/0;

例子:

awk -f: '' /etc/passwd
模式:操作:操作由乙個或多個命令、函式、表示式組成,之間有換行符或分號隔開,並位於大括號內,主要部分是:

條件語句:

迴圈語句:

for (initialisation; condition; increment/decrement)

action

initialisation:初始化區域性變數;

condition:表示式,作為檢查條件;

increment/decrement:變數的遞增或遞減。

示例:$ awk 'begin '

輸出結果:12345

while迴圈先檢查條件是否為真,如果條件為真才執行動作,一直重複到條件為false時結束迴圈。

示例:

$ awk 'begin }'

輸出結果:12345

結束迴圈:內建變數:通常來說,分為兩種型別的內建變數:

- 第一種是定義的變數可以改變, 比如字段分隔(fs)與記錄分隔(rs)

讀取並解析輸入檔案中的每一行,預設按照空格將行內容分隔為字段變數:$1,$2...等,可以是任意的字串或者正規表示式。

語法:$ awk -f 'fs' 'commands' inputfilename 或 $ awk 'begin'

示例:第一步:新建檔案etc_passwd.awk,內容如下所示

begin

end

$ awk -f etc_passwd.awk /etc/passwd

輸出結果(只取部分內容做示例):

_cmiodalassistants 262 262 /var/db/cmiodalassistants

_analyticsd 263 263 /var/db/analyticsd

_fpsd 265 265 /var/db/fpsd

_timed 266 266 /var/db/timed

_reportmemoryexception 269 269 /var/db/reportmemoryexception

108 records processed

- 第二種是可以用來資料處理或者資料總結,比如記錄數(nr)與字段數目(nf)

按指定分隔符分隔字段內容做輸出展示

示例:

$ awk -f':' 'begin ' /etc/passwd

輸出結果(只取部分內容做示例):

71=71

72=72

73=73

74=74

75=75

76=76

陣列:

語法格式:array_name[index]=value

說明:array_name:陣列的名稱

index:陣列索引

value:陣列中元素所賦予的值

linux awk命令學習

awk是一種功能很強大的程式語言,用於linux系統下文字和資料的處理。本篇文章只學習一些awk相關的常規應用,而不對awk的語法進行討論,如果有需要,直接查資料就好了。1.檢視特定程序的pid,sh ps pid tty time cmd 414 00 00 00 rcs 417 00 00 00...

Linux awk學習筆記

今天從linux學習開始,沒有什麼規劃,就簡單記下筆記。f 用來設定處理文字時的域分隔符 預設是空格和tab 例 awk f etc passwd v var 用來設定要傳入指令碼的變數,乙個變數前乙個 v 例 awk v var1 1 v var2 2 etc passwd 正規表示式 限定行 如...

linux awk學習筆記

最近新增了幾個功能的日誌,但是呢,這個日誌就是輸出,一般自己也發現不了問題,於是想寫一些簡單的監控指令碼來看看日誌的大致情況,比如有沒有error,每天有多少error報出來。想到了以前運維的同時分享awk,於是想簡單的學習下。入門最簡單的輸入某些列 使用 4 這種來表示 0 是輸出整列 root ...