Shell腳本之awk文本編輯器語法(一)
AWK ——是一種用於處理文本的編程語言工具。
英文原義:Aho、Weinberger、Kernighan
中文釋義:三位創造者Aho、Weinberger和Kernighan統稱
AWK 在很多方面類似於 shell 編程語言,儘管 AWK 具有完全屬於其本身的語法。最初創造 AWK 時,其目的是用於文本處理,並且這種語言的基礎是,只要在輸入數據中有模式匹配,就執行一系列指令。該實用工具掃描文件中的每一行,查找與命令行中所給定內容相匹配的模式。如果發現匹配內容,則進行下一個編程步驟。如果找不到匹配內容,則繼續處理下一行。
awk 之所以成爲一種優秀的程序設計語言的原因之一是內置函數的使用,awk定義並支持了一系列的內置函數,由於這些函數的使用,使得awk提供的功能更爲完善和強大。
常用語法:
awk [options] 'commands' testfiles
options選項
-F 定義字段分隔符,默認分隔符爲連續空格或製表符
用$1,$2,$3等順序表示files中每行以間隔符號分隔的各列不同域
-v 定義變更並賦值,也可以借用次方式從shell變量中引入變量
使用示例:
[root@localhost test]# awk -F":" '{print $1,$7}' testfile
以冒號作爲分隔符,打印第1和第7個字段
[root@localhost test]# awk -F"[:/]" '{print $1,$7}' testfile
以冒號或斜槓 / 作爲分隔符,打印第1第7個字段
[root@localhost test]# awk -F":/" '{print $1,$7}' testfile
以冒號加斜槓 “:/”整體作爲分隔符
-----------------------------------------------------------
command
讀前處理 行處理 讀後處理
1、讀前處理 BEGIN{awk_cmd1;awk_cmd2;}
2、行處理:定址 命令
定址方法:正則,變量,比較,關係運算
正則需要用 / / 包裹起來
常用正則:
^ 行首 $ 行尾
. 除了換行符以外的任意單個字符
* 前導字符的零個或多個
.* 所有字符
[] 字符組內的任一字符
[^] 對字符組內的每個字符取反(不匹配字符組內的每個字符)
^[^] 非字符組內的字符開頭的行
[a-z] 小寫字母
[A-Z] 大寫字母
[a-Z] 小寫和大寫字母
[0-9] 數字
\< 單詞頭,以空格或特殊字符做分隔,連續的字符串被當做單詞
\> 單詞尾
擴展正則
? 前導字符零個或一個
+ 前導字符一個或多個
abc|def abc或def
a(bc|de)f abcf 或 adef
x\{m\} x出現m次
x\{m,\} x出現m次至多次(至少m次)
x\{m,n\} x出現m次至n次
NR變量定址,NR 表示AWK讀入的行數
FNR表示讀入行所在文件中的行數
邏輯運算——可直接引用域進行運算
== >= <= != > < ~ !~
如:# awk 'NR==1 {print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
命令 如:{print $1,$2}
3、讀後處理
END {awk_cmd1;awk_cmd2;}
---------------------------------------------------------------
AWk的變量
NR AWK處理的總行數
FNR AWK處理的當前文件的行數,非全部
FS 字段分隔符,默認爲連續空格或製表符,可以使用多個不同的符號做分隔符,也可在options出使用 -F[:/] 指定分隔符
OFS 輸出字符的分隔符 默認是空格
如:# awk -F: 'OFS="***" {print $1,$2}' /etc/passwd
root***x
NF 當前讀入行的字段個數
ORS 輸出行的分隔符,默認是換行
# awk -F: 'ORS="***" {print $1,$2}' /etc/passwd
root x***bin x***
FILENAME 當前文件名
---------------------------------------------------------------
引用shell變量的方法:
(1)使用 -v 引用變量值
[root@localhost test]# a=5
[root@localhost test]# awk -v c=$a -F: 'NR < c {print NR,$0}' /etc/passwd
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
(2)把整個命令拆開傳遞,讓shell變量外露
[root@localhost test]# a=5
[root@localhost test]# awk -F: 'NR < '$a'{print NR,$0}' /etc/passwd
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
------------------------------------------------------------
操作符
賦值 = += -= /= *=
&& ——邏輯與 ||——邏輯或 !——邏輯非
匹配正則或不匹配,正則需要用 /正則/ 包圍住
~ !~
關係 比較字符串,要把字符串用雙引號引起來
< <= > >= != ==
字段引用
$ 字段引用需要加$ 而變量引用直接用變量名取
運算符
+ - * / % ++ --
轉義序列
\\ \自身
\$ 轉義$
\t 製表符
\b 退格符
\r 回車符
\n 換行符
\c 取消換行
用法示例:
# awk -F: '$3 >= 30 && $3 <= 40 {print $0}' /etc/passwd
打印出uid在30到40之間的用戶信息行
# awk -F: ' NR >= 30 && NR <= 40 {print NR,$0}' /etc/passwd
打印出行號在30到40之間的行
# awk -F: ' NR % 2 == 1 {print NR,$1,NF}' /etc/passwd
打印奇數行
# awk -F: ' NR % 2 == 0 {print NR,$1,NF}' /etc/passwd
打印偶數行
# awk -F: ' $3 != $4 {print NR,$1,$3,$4}' /etc/passwd
打印uid和gid不相等的用戶信息行
# awk -F: '$7 ~ /bash/ {print NR,$1,$7}' /etc/passwd
打印第7個字段能匹配 /bash/ 字符串的行
# awk -F: '$7 !~ /nologin/ {print NR,$1,$7}' /etc/passwd
打印第7個字段不能匹配 /nologin/ 字符串的行
------------------------
數組
自定義數組
# awk 'BEGIN{ary[1]="hunan";ary[2]="hubei";print ary[1],ary[2]}'
hunan hubei
# awk 'BEGIN{ary[1]="hunan";ary[2]="hubei";for(i in ary) print ary[i]}'
hunan
hubei
環產生數組和取出數組
# awk 'BEGIN{n=5;for (i=1;i<=n;i++) ary[i]=i+100;for(m in ary) print m,ary[m]}'
4 104
5 105
1 101
2 102
3 103
# awk -F: '{ary[NR]=$1}END{for(i in ary){print i,ary[i]}}' testfile
4 dbus
5 usbmuxd
6 hsqldb
7 avahi-autoipd
8 rpc
1 root
2 bin
3 myuser
# awk -F: '{ary[$3]=$1} END {for(i in ary) print i,ary[i]}' testfile
英文原義:Aho、Weinberger、Kernighan
中文釋義:三位創造者Aho、Weinberger和Kernighan統稱
AWK 在很多方面類似於 shell 編程語言,儘管 AWK 具有完全屬於其本身的語法。最初創造 AWK 時,其目的是用於文本處理,並且這種語言的基礎是,只要在輸入數據中有模式匹配,就執行一系列指令。該實用工具掃描文件中的每一行,查找與命令行中所給定內容相匹配的模式。如果發現匹配內容,則進行下一個編程步驟。如果找不到匹配內容,則繼續處理下一行。
awk 之所以成爲一種優秀的程序設計語言的原因之一是內置函數的使用,awk定義並支持了一系列的內置函數,由於這些函數的使用,使得awk提供的功能更爲完善和強大。
常用語法:
awk [options] 'commands' testfiles
options選項
-F 定義字段分隔符,默認分隔符爲連續空格或製表符
用$1,$2,$3等順序表示files中每行以間隔符號分隔的各列不同域
-v 定義變更並賦值,也可以借用次方式從shell變量中引入變量
使用示例:
[root@localhost test]# awk -F":" '{print $1,$7}' testfile
以冒號作爲分隔符,打印第1和第7個字段
[root@localhost test]# awk -F"[:/]" '{print $1,$7}' testfile
以冒號或斜槓 / 作爲分隔符,打印第1第7個字段
[root@localhost test]# awk -F":/" '{print $1,$7}' testfile
以冒號加斜槓 “:/”整體作爲分隔符
-----------------------------------------------------------
command
讀前處理 行處理 讀後處理
1、讀前處理 BEGIN{awk_cmd1;awk_cmd2;}
2、行處理:定址 命令
定址方法:正則,變量,比較,關係運算
正則需要用 / / 包裹起來
常用正則:
^ 行首 $ 行尾
. 除了換行符以外的任意單個字符
* 前導字符的零個或多個
.* 所有字符
[] 字符組內的任一字符
[^] 對字符組內的每個字符取反(不匹配字符組內的每個字符)
^[^] 非字符組內的字符開頭的行
[a-z] 小寫字母
[A-Z] 大寫字母
[a-Z] 小寫和大寫字母
[0-9] 數字
\< 單詞頭,以空格或特殊字符做分隔,連續的字符串被當做單詞
\> 單詞尾
擴展正則
? 前導字符零個或一個
+ 前導字符一個或多個
abc|def abc或def
a(bc|de)f abcf 或 adef
x\{m\} x出現m次
x\{m,\} x出現m次至多次(至少m次)
x\{m,n\} x出現m次至n次
NR變量定址,NR 表示AWK讀入的行數
FNR表示讀入行所在文件中的行數
邏輯運算——可直接引用域進行運算
== >= <= != > < ~ !~
如:# awk 'NR==1 {print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
命令 如:{print $1,$2}
3、讀後處理
END {awk_cmd1;awk_cmd2;}
---------------------------------------------------------------
AWk的變量
NR AWK處理的總行數
FNR AWK處理的當前文件的行數,非全部
FS 字段分隔符,默認爲連續空格或製表符,可以使用多個不同的符號做分隔符,也可在options出使用 -F[:/] 指定分隔符
OFS 輸出字符的分隔符 默認是空格
如:# awk -F: 'OFS="***" {print $1,$2}' /etc/passwd
root***x
NF 當前讀入行的字段個數
ORS 輸出行的分隔符,默認是換行
# awk -F: 'ORS="***" {print $1,$2}' /etc/passwd
root x***bin x***
FILENAME 當前文件名
---------------------------------------------------------------
引用shell變量的方法:
(1)使用 -v 引用變量值
[root@localhost test]# a=5
[root@localhost test]# awk -v c=$a -F: 'NR < c {print NR,$0}' /etc/passwd
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
(2)把整個命令拆開傳遞,讓shell變量外露
[root@localhost test]# a=5
[root@localhost test]# awk -F: 'NR < '$a'{print NR,$0}' /etc/passwd
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
------------------------------------------------------------
操作符
賦值 = += -= /= *=
&& ——邏輯與 ||——邏輯或 !——邏輯非
匹配正則或不匹配,正則需要用 /正則/ 包圍住
~ !~
關係 比較字符串,要把字符串用雙引號引起來
< <= > >= != ==
字段引用
$ 字段引用需要加$ 而變量引用直接用變量名取
運算符
+ - * / % ++ --
轉義序列
\\ \自身
\$ 轉義$
\t 製表符
\b 退格符
\r 回車符
\n 換行符
\c 取消換行
用法示例:
# awk -F: '$3 >= 30 && $3 <= 40 {print $0}' /etc/passwd
打印出uid在30到40之間的用戶信息行
# awk -F: ' NR >= 30 && NR <= 40 {print NR,$0}' /etc/passwd
打印出行號在30到40之間的行
# awk -F: ' NR % 2 == 1 {print NR,$1,NF}' /etc/passwd
打印奇數行
# awk -F: ' NR % 2 == 0 {print NR,$1,NF}' /etc/passwd
打印偶數行
# awk -F: ' $3 != $4 {print NR,$1,$3,$4}' /etc/passwd
打印uid和gid不相等的用戶信息行
# awk -F: '$7 ~ /bash/ {print NR,$1,$7}' /etc/passwd
打印第7個字段能匹配 /bash/ 字符串的行
# awk -F: '$7 !~ /nologin/ {print NR,$1,$7}' /etc/passwd
打印第7個字段不能匹配 /nologin/ 字符串的行
------------------------
數組
自定義數組
# awk 'BEGIN{ary[1]="hunan";ary[2]="hubei";print ary[1],ary[2]}'
hunan hubei
# awk 'BEGIN{ary[1]="hunan";ary[2]="hubei";for(i in ary) print ary[i]}'
hunan
hubei
環產生數組和取出數組
# awk 'BEGIN{n=5;for (i=1;i<=n;i++) ary[i]=i+100;for(m in ary) print m,ary[m]}'
4 104
5 105
1 101
2 102
3 103
# awk -F: '{ary[NR]=$1}END{for(i in ary){print i,ary[i]}}' testfile
4 dbus
5 usbmuxd
6 hsqldb
7 avahi-autoipd
8 rpc
1 root
2 bin
3 myuser
# awk -F: '{ary[$3]=$1} END {for(i in ary) print i,ary[i]}' testfile
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.