天天看點

shell程式設計三劍客之awk一 awk工具簡介二 awk工具的作用三 awk文法格式四 awk使用進階

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中調用定義的變量不需要加$