Linux下的awk使用

2022-08-31 17:00:28 字數 4463 閱讀 5027

awk介紹

awk 是一種程式語言,主要用於linux/unix下對文字和資料進行掃瞄處理,資料可以來自標準輸入,檔案和管道,擁有眾多的發行版本,awk,nawk,gawk,mks awk, tawk, 最常用的是mawk,gawk

rhel系統預設的是 gawk;ubuntu系列產品用mawk

awk 工作流程

awk基本結構由模式匹配和處理過程(動作)組成,pattern+action

首先對檔案進行逐行掃瞄,從第一行到最後一行,逐行進行匹配特定模式的行,並在這些行上進行使用者想要的操作。在讀取檔案每一行時,判斷是否與給定的模式相匹配,如果匹配,則執行處理過程,否則不做任何操作;如果沒有指定的指令碼,則把匹配的行標準輸出,預設處理動作為print列印;如果沒有指定模式匹配,則預設匹配所有資料。

awk有兩個特殊模式:begin和end ,被放置在沒有讀取任何資料之前以及在所有資料讀取完之後執行。

awk的基礎語法

awk [選項]  『'[filenames]

【選項】:

-f fs, 指定fs為輸入行的分隔符,預設的分隔符為空格或者製表符

-v var=val , 在處理動作之前,設定乙個變數var,值為val

-f program-fle   ,從指令碼中讀取awk指令,以取代在命令引數中輸入指令碼

-w compat  ,使用相容模式執行awk,gun拓展選項將被忽略

-w dump-variables[=file] , 列印全域性變數到檔案中

awk 程式語法結構:乙個awk程式包含一系列的模式(動作指令)或者函式,定義模式可以使用begin/end/表示式 ,用來限定操作物件的多個表示式使用逗號隔開,動作指令使用{}括起來

一、awk操作指令

1. 內建變數

變數名          描述

argc          命令列引數個數

filename   當前輸入文件的名稱

fnr             當前輸入文件的記錄編號,多個輸入文件時有用

nr               輸入流當前記錄編號

nf               當前記錄的字段個數

fs          字段分割符

ofs       輸出字段分割符,預設空格

ors      輸出記錄分隔符,預設換行符\n

rs      輸入記錄分隔符,預設換行符

列印當前文件的當前編號,兩個檔案是分開的

[root@centos7 ~]# awk '' awktest.txt test.txt

awk將兩個檔案作為乙個整體輸入流,通過nr輸入當前編號

[root@centos7 ~]# awk '' awktest.txt test.txt

通過ofs將輸出分隔符設定為『_』

[root@centos7 ~]# echo hello the wold |awk 'begin '

>>hello_the_wold

讀取輸入輸出,以空白行為分隔符

[root@centos7 ~]# awk 'begin ' awktest.txt

2. 記錄與字段

awk 一次從檔案中讀取一條記錄,並將記錄儲存在字段變數$0中,記錄被分割為字段儲存在$1,$2,$3......$nf 中(分隔符預設為空格或製表符)

輸出第乙個和最後乙個字段

[root@centos7 ~]# echo hello the wold |awk ''

>>hello wold

3. 分隔符

輸出以t為分割符的最後乙個字段

[root@centos7 ~]# echo hello the wold |awk -f"t" ''

[root@centos7 ~]# echo hello the wold |awk 'begin '

>>he wold

多個分隔符,輸出以t 和w 分割的第一和最後乙個字段

[root@centos7 ~]# echo hello the wold |awk -f"[t,w]" ''

>>hello old

4. 表示式

表示式 由變數,常量,正規表示式,操作符組成

awk中變數有字元和數字常量,如果在awk中定義變數沒有初始化,則初始化值為空字元或0,字元操作一定要加引號

同python中的表示式都差不多,大於小於等於,小於等於,++,-- .....

~  匹配

!~  不匹配

||  或

&& 與

[root@centos7 ~]# echo hello |awk 'x=1,y=2 '

>>2 6

統計空白行數

[root@centos7 ~]# awk '/^$/ end' awktest.txt

列印root使用者的uid號

[root@centos7 ~]# awk -f":" '$1~/root/ ' /etc/passwd

0[root@centos7 ~]# awk -f: '$1~/root/ ' /etc/passwd

0列印使用者uid大於500的使用者

[root@centos7 ~]# awk -f: '$3>500  ' /etc/passwd

二、awk中的迴圈語句

1. if 語句

格式:if(表示式) 動作1 ;else 動作2

例子:列印 磁碟中boot下的可使用值,小於1000  列印error,否則列印ok

[root@centos7 ~]# df |grep boot|awk ''

>>ok

2 . while 語句

格式1:

while(條件)

[root@centos7 ~]# awk ' begin }'

格式2:

do  while (條件)

[root@centos7 ~]# awk ' begin while(i<5)}'

[root@centos7 ~]# echo hello| awk '}'

[root@centos7 ~]# awk -f: '$1~/root/}' /etc/passwd

1root

2x30

405root

6/root

7/bin/bash

3. for 語句

格式:for(變數;條件;計數器)

[root@centos7 ~]# echo hello|awk '}'

統計/etc/passwd 下$7的個數

[root@centos7 ~]# # awk -f: 'end}' /etc/passwd

/bin/sync:1

/bin/bash:2

/sbin/nologin:38

/sbin/halt:1

/sbin/shutdown:1

4. continue 和break

[root@centos7 ~]# echo hello |awk '}'12

[root@centos7 ~]# echo hello |awk '}'12

4三、awk中的函式

1. rand()函式

隨機產生乙個0-1之間的浮點數,需要和srand() 配合使用,否則產生的rand()隨機數都相同

[root@centos7 ~]# echo hello|awk ''

2. gsub(x,y,z)

函式  --全域性替換

替換函式: x替換為y ,z為字串,預設是$0

在字串z中使用字元y替換 正規表示式x匹配的字串

[root@centos7 ~]# awk 'gsub(/is/,"are",$0)' awktest.txt

3. sub(x,y,z)

函式   --替換第乙個

替換函式: x替換為y ,z為字串,預設是$0

在字串z中使用字元y替換 正規表示式x匹配的第乙個字串

[root@centos7 ~]# awk 'sub(/is/,"are",$0)' awktest.txt

gsub 相當於sed中的 s///g

sub 想當於 sed中的s///

4. length(z)函式

返回字串z的長度

[root@centos7 ~]# awk '' awktest.txt

5. getline 函式

從輸入中讀取下一行內容

[root@centos7 ~]#

df -h |awk 'begin;if(nf==6)}'

disk free

可用5.7g

471m

487m

478m

487m

223m

4.0g

98m98m

linux下 awk內建變數使用介紹

我們將逐漸揭開 awk 功能的神秘面紗,在本節中,我們將介紹 awk 內建built in變數的概念。你可以在 awk 中使用兩種型別的變數,它們是 使用者自定義user defined變數和內建變數。我們將逐漸揭開 awk 功能的神秘面紗,在本節中,我們將介紹 awk 內建built in變數的概...

linux下awk的關聯陣列

昨天看了同事的乙個shell指令碼,如下 awk nr fnra 1 0 a.txt b.txt 作用是 列印出b.txt第一列中不在a中行,初一看,不是很懂,shell指令碼沒有系統的學過,平時用也只是一些簡單的執行下可執行程式,跑下定時任務 nr和fnr,nr列印行數,fnr同樣是列印行數,區別...

Linux中awk命令的使用

awk 引數 filename引數 含義 f 分割字串 要執行的操作裡面可以使用if,for,正規表示式 awk內建變數 變數含義 nr當前行號 nf當前行分隔出了多少列 awk f debug.log f 表示每一行用逗號分隔 表示列印出每行的第一列 awk f debug.log s 表示字串佔...