1. 程式人生 > >16.3、awk使用介紹

16.3、awk使用介紹

program con stat sci per 表示 iss 格式 ascii

1、linux文本處理工具:

文本過濾工具:grep、egrep、fgrep

行編輯工具:sed

格式化文本工具:awk、gawk

註意:centos7中,awk是指向gwak的鏈接文件。

[root@localhost ~]# ll -l `which awk`

lrwxrwxrwx. 1 root root 4 Aug 29 20:01 /usr/bin/awk -> gawk

[root@localhost ~]#


2、awk工作原理:

awk從文本中一次讀取一行,按指定的分隔符切割成若幹個片段部分,默認的分隔符是“空白”字符,每個分片都保存在awk內建的變量中($1,$2,$3...),然後用動作(常用的print、printf命令)去輸出這些行中的某一個分片、某幾個或者整行分片。整行內容用"$0"表示,切割出來的每一分片,也可以進行加工處理。


3、awk命令:

格式:gawk [OPTIONS] 'program' FILE ... //註意program要用單引號引起來

3.1、awk的OPTIONS:

-F:指定輸入時的字段分割符,用於文件中讀取時以什麽為分割符;默認為空格分割符

-v var=value :自定義變量




3.2、awk的program的格式:

PATTERN{ACTION STATEMENT} //此處的PATTERN作用主要是界定需要編輯的行,action執行的動作,statement要執行的語句,可以有多個,語句之間以分號(;)分隔。

示例:

[root@localhost ~]# tail -3 /etc/fstab | awk '{print $2,$4}' //輸出時默認以空白字符分隔片段;cut只能理解單個或固定的空白字符。


常用的action:

①、expression:運算表達式

②、control statement:控制語句,如if、while語句等

③、compound statement:組合語句

④、input statement:輸入語句

⑤、outprint statement:輸出語句,如print,printf


⑤.1、輸出語句--print

語法格式:print item1,item2,...

解釋:多個字段(item)以逗號分隔,否則輸出時是合並在一起輸出的;

輸出的各item字段可以是字符、數值、當前記錄的字段變量或awk的表達式;

如果省略item,則輸出整行內容,相當於打印"$0"

print示例:

[root@localhost ~]# tail -3 /etc/fstab | awk '{print "hello:" $1,$2}'

hello:UUID=43446f03-00c0-4d49-a4f3-2050cecfff9e /boot

hello:/dev/mapper/cl-swap swap

[root@localhost ~]# tail -3 /etc/fstab | awk '{print "hello: $1,$2"}' //print後放在雙引號中的內容不會被替換成其他數值。

hello:/dev/mapper/cl-root /

hello: $1,$2

hello: $1,$2

hello: $1,$2

[root@localhost ~]#


⑤.2、輸出語句--printf:格式化輸出

語法格式:printf FORMAT,item1,item2,... //format為格式符,它會為每個item占一個位置,item的數值會套用format中定義的格式。

語法要點:

FORMAT必須給出

printf不會自動換行,如要換行,需要顯式給出換行控制符"\n"

FORMAT中需要分別為後面的每個item指定一個格式化符號


FORMAT格式符介紹:

%c:顯式字符的ASCII碼

%d或%i:顯式為十進制的整數

%e或%E:科學計數法數值顯式

%f:顯式為浮點數

%g或%G:以科學計數法或浮點形式顯示數值

%s:顯示為字符串

%u:顯示為無符號整數

%%:顯示%自身


printf示例:






3.3、awk的變量介紹:

內建變量:

FS:input filed Seperate,輸入片段分隔符,默認為空白字符

OFS:output filed seperate,輸出片段分隔符,默認為空白字符

示例:[root@localhost ~]# awk -v FS=':' '{print $1,$2}' /etc/passwd //指定輸入分隔符為: ,然後打印出每行的第一個和第二個分片部分

[root@localhost ~]# awk -F: '{print $1}' /etc/passwd //直接用—F選項指定分隔符:

[root@localhost ~]# awk -v FS=':' -v OFS=':' '{print $1,$2}' /etc/passwd //指定輸入分隔符和輸出分隔符,每個-v選項定義一個變量

RS:input record Seperate:指定輸入時的換行符,很少用到

ORS:outpunt reccord seperate:指定輸出時的換行符,很少用到

示例:[root@localhost ~]# head -1 /etc/passwd | awk -v RS=':' '{print $0}' //指定輸入時的換行符為:

[root@localhost ~]# head -1 /etc/passwd | awk -v RS=':' -v ORS='#' '{print $0}' //指定輸入時的換行符為:,輸出換行符#

NF:number of filed,統計每一行分片後的分片個數

示例:[root@localhost ~]# head -1 /etc/passwd | awk -v FS=':' '{print NF}' //統計以':'分隔後分片字段個數,結果為7,註意此處的NF不要加$符號

[root@localhost ~]# head -1 /etc/passwd | awk -v FS=':' '{print $NF}' //如果NF前加上$符號,表示引用每行的最後一個分片字段,相當於$7;

註意:awk中引用變量時不要加$符號,但是引用分片字段時要加$符號

NR:number of reord:統計行數(會顯示每一行的行號,如果有多個文件會統一編號)

示例:[root@localhost ~]# awk '{print NR,$1}' /etc/fstab //統計文件有多少行

[root@localhost ~]# awk '{print NR,$1}' /etc/fstab /etc/issue //有多個文件時會統一編號

FNR:number of reord:統計行數(會顯示每一行的行號,如果有多個文件不會統一編號)

示例:[root@localhost ~]# awk '{print FNR,$1}' /etc/fstab /etc/issue //有多個文件時不會統一編號

FILENAME:顯示被處理的文件名稱,即被awk處理的文件的名稱

示例:[root@localhost ~]# awk '{print FILENAME}' /etc/issue //會每行顯示一個文件名

ARGC:bash命令行參數的個數

ARGV:數組,保存的是bash命令行所給定的各參數

示例:[root@localhost ~]# awk 'BEGIN{print ARGC}' /etc/issue //ARGC統計命令行給的參數個數

2

[root@localhost ~]# awk 'BEGIN{print ARGV[0]}' /etc/issue //引用bash命令行保存的數組參數

awk

[root@localhost ~]# awk 'BEGIN{print ARGV[1]}' /etc/issue

/etc/issue

[root@localhost ~]# awk 'BEGIN{print ARGV[2]}' /etc/issue



自定義變量:

方法一:-v var=value //var為變量名,value是變量值;需要註意的是:awk中的變量名區分大小寫

示例:

[root@localhost ~]# awk -v test='hello magedu' '{print test}' /etc/issue //print後此處引用變量不要加$符號

hello magedu

hello magedu

hello magedu

方法二:在program中直接定義:

示例:

[root@localhost ~]# awk '{test="hello magedu";print test}' /etc/issue //多個語句間用分號分隔。

hello magedu

hello magedu

hello magedu

[root@localhost ~]#














16.3、awk使用介紹