shell程式設計三劍客之awk
- 一 awk工具簡介
- 二 awk工具的作用
- 三 awk文法格式
-
- 3.1 awk常用内部變量
- 3.2 常用内部變量舉例
- 四 awk使用進階
-
- 4.1 1. 格式化輸出print和printf
- 4.2 awk變量定義
一 awk工具簡介
awk是一種程式設計語言,主要用于在linux/unix下對文本和資料進行處理,是linux/unix下的一個工具。資料可以來自标準輸入、一個或多個檔案,或其它指令的輸出。
awk的處理文本和資料的方式:逐行掃描檔案,預設從第一行到最後一行,尋找比對的特定模式的行,并在這些行上進行你想要的操作。
awk分别代表其作者姓氏的第一個字母。因為它的作者是三個人,分别是Alfred Aho、Brian Kernighan、Peter Weinberger。
gawk是awk的GNU版本,它提供了Bell實驗室和GNU的一些擴充。
下面介紹的awk是以GNU的gawk為例的,在linux系統中已把awk連結到gawk,是以下面全部以awk進行介紹。
二 awk工具的作用
1.awk用來處理檔案和資料的,是類unix下的一個工具,也是一種程式設計語言
2.可以用來統計資料,比如網站的通路量,通路的IP量等等
3.支援條件判斷,支援for和while循環
三 awk文法格式
awk 選項 ‘指令部分’ 檔案名
注意:
引用shell變量需用雙引号引起
常用選項介紹:
-F 定義字段分割符号,預設的分隔符是空格
-v 定義變量并指派
3.1 awk常用内部變量
變量 | 變量說明 | 備注 |
---|---|---|
$0 | 目前處理行的整行内容 | |
$1,$2,$3…$n | 檔案中每行以間隔符号分割的不同字段 | awk -F: ‘{print $1,$3}’ |
NF | 目前處理行的字段個數 | awk -F: ‘{print NF}’ |
$NF | 最後一列 | $(NF-1)表示倒數第二列 |
FNR/NR | 目前處理行的行号 | |
FS | 定義間隔符 | ‘BEGIN{FS=":"};{print $1,$3}’ |
OFS | 定義輸出字段分隔符,預設空格 | ‘BEGIN{OFS="\t"};print $1,$3}’ |
RS | 輸入記錄分割符,預設換行 | ‘BEGIN{RS="\t"};{print $0}’ |
ORS | 輸出記錄分割符,預設換行 | ‘BEGIN{ORS="\n\n"};{print $1,$3}’ |
3.2 常用内部變量舉例
# awk -F: '{print $1,$(NF-1)}' 1.txt
# awk -F: '{print $1,$(NF-1),$NF,NF}' 1.txt
# awk '/root/{print $0}' 1.txt
# awk '/root/' 1.txt
# awk -F: '/root/{print $1,$NF}' 1.txt
root /bin/bash
# awk -F: '/root/{print $0}' 1.txt
root:x:0:0:root:/root:/bin/bash
# awk 'NR==1,NR==5' 1.txt
# awk 'NR==1,NR==5{print $0}' 1.txt
# awk 'NR==1,NR==5;/^root/{print $0}' 1.txt
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
四 awk使用進階
4.1 1. 格式化輸出print和printf
print函數 類似echo "hello world"
# date |awk '{print "Month: "$2 "\nYear: "$NF}'
# awk -F: '{print "username is: " $1 "\t uid is: "$3}' /etc/passwd
printf函數 類似echo -n
# awk -F: '{printf "%-15s %-10s %-15s\n", $1,$2,$3}' /etc/passwd
# awk -F: '{printf "|%15s| %10s| %15s|\n", $1,$2,$3}' /etc/passwd
# awk -F: '{printf "|%-15s| %-10s| %-15s|\n", $1,$2,$3}' /etc/passwd
awk 'BEGIN{FS=":"};{printf "%-15s %-15s %-15s\n",$1,$6,$NF}' a.txt
%s 字元類型 strings %-20s
%d 數值類型
占15字元
- 表示左對齊,預設是右對齊
printf預設不會在行尾自動換行,加\n
4.2 awk變量定義
# awk -v NUM=3 -F: '{ print $NUM }' /etc/passwd
# awk -v NUM=3 -F: '{ print NUM }' /etc/passwd
# awk -v num=1 'BEGIN{print num}'
1
# awk -v num=1 'BEGIN{print $num}'
注意:
awk中調用定義的變量不需要加$